问题
1.浏览器= Firefox(非Geckodriver,Selenium v2.53.4)
(可在一个linux瘦客户端上使用,但不能在另一个linux瘦客户端上使用...)$ bundle exec rake parallel:spec
Selenium::WebDriver::Error::WebDriverError:
unable to bind to locking port 7054 within 120 seconds
2. Broswer = Firefox(Geckodriver v0.14.0,Selenium-webdriver v3.1.0)
$ bundle exec rake parallel:spec
Net::ReadTimeout:
Net::ReadTimeout
3.浏览器= Chrome(Chromedriver v2.27,Selenium-webdriver v3.1.0)
$ bundle exec rake parallel:spec
Selenium::WebDriver::Error::NoSuchDriverError:
no such session
(Driver info: chromedriver=2.27.440175 ,platform=Linux 3.16.0-0.bpo.4-amd64 x86_64)
我的设定
-Linux-Debian x86_64 Wheezy
-ruby 2.2.5p319(2016-04-26修订版54774)
-Firefox v46.0.3
-Chrome 56.0.2924.87(64位)
-ChromeDriver 2.27.440175
-Xvfb(x11-xserver-utils v 7.7〜3通过无头gem)
gem
-Selenium v3.1.0(原为2.53.4)
-parallel_tests v2.10.0
- capybara (2.7.1)
-rspec-activemodel-mocks(1.0.3)
-rspec-core(3.4.4)
-rspec-期望(3.4.0)
-rspec-mocks(3.4.1)
-rspec-rails(3.4.2)
-rspec-support(3.4.1)
-无头(2.2.3)(Xvfb)
我的电脑是许多...
重要提示:另一台计算机在同一服务器上运行相同软件和相同版本时,没有遇到上述问题!
不是问题的事情
为什么不?
a)我们的服务器上当前已安装Firefox v46.0.3和Selenium v2.53.4,并且该服务器的另一个客户端使用上述版本的Firefox&Selenium成功运行parallel_tests。
b)Which Firefox version is compatible with Selenium 2.53.0?
具体来说,这是在每个失败发生之后以及开始新的
$ bundle exec rake parallel:spec
运行之前。为什么不?
请参阅“我尝试过的事情”中的项目1和2。
事实并非如此,尽管这不是问题的原因
数据库并非总是被正确杀死,请参阅更新5。
但是,数据库没有被杀死是问题的结果。
它们不是问题的原因,请参阅解决方案部分。
边注
对于那些希望安装上述版本以使Selenium/firefox正常运行的人:
Installing a previous version doesn't fix most problems
我尝试过的事情
$ killall ruby; killall rspec; killall firefox
结果:失败... 登录到另一个tty后,我发现仍然有一个rspec,ruby和firefox进程正在运行!
因此,我注销了用户,登录了新的tty,使用以下命令杀死了所有僵尸进程:
$ kill -9 process_id
然后,我重新运行$ ps aux
以确保清理了所有进程。结果:失败...
冉
$ lsof -i TCP:7054
看看什么保持了那个过程。结果:这是我的firefox测试,没有惊奇,没有真正的见识。
删除所有数据库,重新创建数据库,重新加载所有架构,重新播种(开发),重新准备。
结果:失败...我怀疑这是原因,但是这样做确实消除了它。
结果:失败...
通过从工作计算机复制项目目录来做到这一点。
然后重新运行
$ bundle exec rake parallel:spec
。结果:失败...
通过创建一个新的linux用户来做到这一点。
然后切换到新用户。
$ su new_user -l
已复制所需的最少zsh项。然后运行
$ bundle exec rake parallel:spec
结果:失败... 127.0.0.1 localhost
结果:失败... $ rspec spec
结果:成功运行(未遇到问题) 部分解决方案
调试的 Selenium 和Parallel_tests gem
结果:确定问题不在 Selenium 中
结果:并行运行测试有效。但为什么?
结果:
发现的Selenium 3.1.0更改了自动下载文件的方式。
这导致测试在进行并行测试时无限期地挂起。
这导致数据库保持打开状态。
我要尝试的事情(更新)
更新1
我用Firefox代替了chrome。
当我运行一个测试时,测试成功完成了chrome。
Firefox也是如此。
但是运行
$ bundle exec rake parallel:spec
结果:失败... Selenium::WebDriver::Error::NoSuchDriverError:
no such session
(Driver info: chromedriver=2.27.440175 ,platform=Linux 3.16.0-0.bpo.4-amd64 x86_64)
更新2
我将selenium-webdriver gem更新为最新的gem(以前是v2.53.4,现在是3.2.2)
结果:失败...
Selenium::WebDriver::Error::NoSuchDriverError:
no such session
(Driver info: chromedriver=2.27.440175 ,platform=Linux 3.16.0-0.bpo.4-amd64 x86_64)
更新3
位于锁定文件中以进行并行测试(〜.config/google-chrome)。
确定了3个持久性锁定文件。
其他用户只有1。
删除这些并重新运行测试。
结果:失败...
Selenium::WebDriver::Error::NoSuchDriverError:
no such session
(Driver info: chromedriver=2.27.440175 ,platform=Linux 3.16.0-0.bpo.4-amd64 x86_64)
更新4
selenium-webdriver升级到v3.1.0(最新稳定版)
将parallel_tests升级到v2.13.0(最新)
已安装Geckodriver v0.14.0(最新)
然后运行
$ bundle exec rake parallel:spec
结果:失败... Failure/Error: visit "#/login"
Net::ReadTimeout:
Net::ReadTimeout
更新5
而在Firefox(Geckodriver v0.14.0,Selenium-webdriver v3.1.0)分支中。
我只有在必须删除所有parallel_test数据库时才意识到某些数据库仍处于打开状态。
@ltsp:~/ap$ bundle exec rake parallel:drop[32]
Couldn't drop ap_test_andre32 : #<ActiveRecord::StatementInvalid: PG::ObjectInUse: ERROR: database "ap_test_andre32" is being accessed by other users
DETAIL: There are 3 other sessions using the database.
: DROP DATABASE IF EXISTS "ap_test_andre32">
Couldn't drop ap_test_andre25 : #<ActiveRecord::StatementInvalid: PG::ObjectInUse: ERROR: database "ap_test_andre25" is being accessed by other users
DETAIL: There are 3 other sessions using the database.
: DROP DATABASE IF EXISTS "ap_test_andre25">
如果rake parallel:spec未完成(在期间无限期挂起),
该过程必须手动终止。
这样做会使数据库锁定在当时正在使用它们的parallel_tests上。
因此,必须对其进行识别和清理。
postgres 743 0.0 0.0 222364 33628 ? Ss 15:30 0:00 postgres: andre ap_test_andre32 [local] idle in transaction
andre 24581 0.0 0.0 7852 2028 pts/36 S+ 15:49 0:00 grep andre32
postgres 26822 0.0 0.0 220032 23400 ? Ss 15:35 0:00 postgres: andre ap_test_andre32 [local] ALTER TABLE waiting
postgres 29684 0.0 0.0 220032 24064 ? Ss 15:40 0:00 postgres: andre ap_test_andre32 [local] ALTER TABLE waiting
更新5解决方案:
搜索数据库进程并杀死所有进程
ps aux | grep test_andre
andre@ltsp:~/ap$ sudo kill -9 743 26822 29684
然后,我可以删除数据库。bundle exec rake parallel:drop[32]
更新6
而在Firefox(Geckodriver v0.14.0,Selenium-webdriver v3.1.0)分支中。
在本地克隆了parallel_tests&Selenium项目。
用通往本地克隆项目的路径替换了我的 gem 。
从错误堆栈跟踪开始进行调试。
结果
更新为 Selenium 3.1.0,并加载了geckodriver(木偶)。
我发现我的Firefox配置文件没有用Capybara正确设置。
这破坏了我的本地单线程测试。
解决此问题。
发现不将壁虎驱动程序用于FF <48。
还发现 capybara , Selenium 3+和FF48 +组合尚未准备好使用。
一些重要功能不起作用。 (右键单击,调整窗口大小...)
Refer here for full details
在研究了parallel_tests之后,就可以排除了这一点。
在firefox测试案例中继续进行调试。
使用锁定端口错误作为指导。
排除 Selenium 是导致错误的原因。
在调试堆栈跟踪之后,事实证明很可能继承了错误状态。
当时这只是一种强烈的预感。
后来证明是正确的...
因此,这里的总结是firefox的进程已被锁定。
他们并没有被 Selenium 锁定。
更新7
同时在firefox(Selenium-webdriver v2.53.4)分支中。
回到创建的新Linux用户。
根据更新5,我删除了清理所有正在运行的进程的功能。
删除所有数据库。
$ bundle exec rake parallel:spec
结果:并行测试有效但为什么?
数据库不是问题的原因。
还有别的
更新8
而在Firefox(Geckodriver v0.14.0,Selenium-webdriver v3.1.0)分支中。
确定测试失败并无限期挂起的原因。
这导致了更新5和6中描述的问题。
这是由于Selenium接受Firefox配置文件设置的方式发生了变化。
我发现失败的集成测试是启动pdf下载的测试。
以前,我是自动执行此操作的,因此不会出现下载模式。
相反,它将自动将文件下载到指定的文件夹。
更新到Selenium 3.1.0打破了这一点。
测试无限期停止。
数据库保持开放状态。
最佳答案
在更新中发现的问题不是根本原因。
根本原因是,即firefox/chrome浏览器端口未关闭并保持打开状态。
看了htop之后,发现Polkitd占用了16.5GB的RAM!
这是由引起的,在Polkitd 中存在内存泄漏。
检查问题后,确认Polkitd内存泄漏是已知问题。
该问题已得到解决,但仅在以后的Linux debian发行版中才存在,而不适用于Wheezy。
重新启动Polkitd,并重新并行运行测试后,它们起作用了!
这就解释了为什么我第一次使用干净的配置文件创建新的Linux用户时,仍然会出现并行测试问题。 -内存泄漏是无法预测的。
它还说明了为什么另一台计算机没有遇到此问题。
以及为什么第二次创建新用户时并行测试有效!
ew,这花了很多功夫!
Polkitd已被卸载,因为我们运行的任何打印机或其他软件都不需要它。
总体而言,如果其他人遇到锁定问题,那么遵循我已经完成的一些过程检测将很有帮助,因为某些问题对于所有操作系统都是常见的。
关于linux - Selenium ::WebDriver::Error with Firefox & Chrome,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42521474/