selenium遇到的问题记录

1。在Linux上执行的用例脚本,偶尔会停止,但是脚本日志本身没有捕获到异常,

geckodriver的相关日志:

2.脚本、Firefox等进程还在,但是没有往下执行了。

3.脚本日志记录了最后一个正常执行的Firefox、geckodriver的pid,这些pid是倒数第二个用例的所起的pid。在自动化测试后台记录的最后一个用例,没有开始插入请求信息。所以可能是启动Firefox了,但是Firefox没响应,需要进一步定位。

3.尝试更新selenium、Firefox、geckodriver版本。

原来的版本信息:

selenium:3.12  (import selenium;help(selenium))

geckodriver:0.20.1

Firefox:56.0.2  (firefox --version)

更新后的版本信息:

selenium:3.14

geckodriver:0.20.1

Firefox:60.0.1

 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  今天又出现这个问题了,但是看geckodriver的日志,发现了以前未出现过的错误。

1538259743546    Marionette    FATAL    Remote protocol server failed to start: Error: Could not bind to port 39668 (NS_ERROR_SOCKET_ADDRESS_IN_USE) (chrome://marionette/content/server.js:87:17) JS Stack trace: set acceptConnections@server.js:87:17
start@server.js:116:5
init/<@marionette.js:537:9
1538259743558    addons.xpi    WARN    Exception running bootstrap method shutdown on activity-stream@mozilla.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIObserverService.removeObserver]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: resource://activity-stream/lib/SnippetsFeed.jsm :: uninit :: line 185"  data: no] Stack trace: uninit()@resource://activity-stream/lib/SnippetsFeed.jsm:185
onAction()@resource://activity-stream/lib/SnippetsFeed.jsm:201
_middleware/</<()@resource://activity-stream/lib/Store.jsm:49
Store/this[method]()@resource://activity-stream/lib/Store.jsm:28
uninit()@resource://activity-stream/lib/Store.jsm:151
uninit()@resource://activity-stream/lib/ActivityStream.jsm:300
uninit()@resource://gre/modules/addons/XPIProvider.jsm -> jar:file:///usr/local/firefox/browser/features/activity-stream@mozilla.org.xpi!/bootstrap.js:73
shutdown()@resource://gre/modules/addons/XPIProvider.jsm -> jar:file:///usr/local/firefox/browser/features/activity-stream@mozilla.org.xpi!/bootstrap.js:169
callBootstrapMethod()@resource://gre/modules/addons/XPIProvider.jsm:4436
observe()@resource://gre/modules/addons/XPIProvider.jsm:2287
init/<()@jar:file:///usr/local/firefox/omni.ja!/components/marionette.js:542
JavaScript error: jar:file:///usr/local/firefox/omni.ja!/components/marionette.js, line 547: TypeError: this.server is null
JavaScript error: resource://gre/modules/ProfileAge.jsm, line 174: Error: Unable to fetch oldest profile entry: Unix error 2 during operation lstat on file /tmp/rust_mozprofile.90aSkqvMJnop (No such file or directory)
*** UTM:SVC TimerManager:registerTimer called after profile-before-change notification. Ignoring timer registration for id: telemetry_modules_ping
提示Marionette绑定不了39668端口。然后查了下这个端口的信息,local Address和foreign address都用了一样的端口。local Address是geckodriver绑定的端口,
foreign Address是Marionette绑定的端口。
所以暂时把今天脚本中断的原因定为,geckodriver和Marionette的端口冲突了?

   

措施:1.也没找到对应的解决方法,先把geckodriver更新为0.22.0,Firefox更新为62.0

         2.或者后续可以加个shell脚本之类的,监控如果Xvfb、geckodriver的进程时间超过10mins没有更新,则kill掉相应的进程,然后继续执行被终止及之后的用例?

 

 还可以怎么定位问题?

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

补充:之前的部署步骤

  • 安装pyvirtualdisplay
  • pip install pyvirtualdisplay
  • 安装Xvfb(作为后端)
  • yum install xorg-x11-server-Xvfb
  • 安装Firefox
  • cd /usr/local
  • wget https://ftp.mozilla.org/pub/firefox/releases/56.0.2/linux-x86_64/en-US/firefox-56.0.2.tar.bz2
  • 解压geckodriver-v0.19.1-linux64.tar.gz
  • tar xvzf geckodriver-*.tar.gz
  • 在环境变量目录/usr/bin/中添加geckodriver的硬链接
  • ln -s /usr/local/geckodriver /usr/bin/geckodriver

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

后续:原来的脚本用例设计其实有问题,每个用例都重新启动一遍浏览器,上百个用例频繁打开启动,应该就是这样导致偶尔启动不了。现在改成把启动浏览器的操作封装成一个方法,每次执行脚本就只调用一遍那个方法,即执行完所有用例再关闭浏览器和Xvfb。(自己瞎折腾的,只能慢慢优化了)

参考:https://blog.csdn.net/yinshuilan/article/details/79730239

关于geckodriver和Marionette:http://toolsqa.com/selenium-webdriver/how-to-use-geckodriver/

                                                  http://t-coes.com/blog/2017/08/14/launch-firefox-browser-selenium-3-0-geckodriver/

原文地址:https://www.cnblogs.com/minerrr/p/9644788.html