【发布时间】:2017-07-20 04:12:05
【问题描述】:
问题
1。浏览器 = Firefox(非 Geckodriver,Selenium v2.53.4)
(适用于一个 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)宝石
-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-expectations (3.4.0)
-rspec-mocks (3.4.1)
-rspec-rails (3.4.2)
-rspec-support (3.4.1)
-headless (2.2.3) (Xvfb) -
多个瘦客户端在上述服务器设置之外运行其软件。
李>
我的电脑是其中之一...
重要提示:另一台电脑在同一台服务器上运行相同软件和相同版本时没有遇到上述问题!
不是问题的事情
- 这不是我的 Firefox 浏览器版本与 Selenium 不兼容。
为什么不呢?
a) Firefox v46.0.3 和 Selenium v2.53.4 当前安装在我们的服务器上,并且该服务器的另一个客户端使用上述版本的 Firefox 和 Selenium 成功运行了 parallel_tests。
b) Which Firefox version is compatible with Selenium 2.53.0? - 没有僵尸进程(仍在运行 firefox)导致 firefox 锁定端口 7054。
这特别是在每次故障发生之后和开始新的$ 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
结果:失败...发现完成步骤 1 不足以杀死所有僵尸进程。
登录到另一个 tty 后,我发现仍然有一个 rspec、ruby 和 firefox 进程在运行!
所以我退出了我的用户,登录到一个新的 tty,使用以下命令杀死了所有僵尸进程:$ kill -9 process_id
然后我重新运行$ ps aux以确保清理所有进程。
结果:失败...深入了解问题。
Ran$ lsof -i TCP:7054看看是什么阻碍了这个过程。
结果:这是我的 Firefox 测试,没有惊喜,也没有获得真正的洞察力。确保并行测试数据库正常运行。
删除所有数据库,重新创建数据库,重新加载所有模式,重新播种(开发),重新准备。
结果:失败...我怀疑这是原因,但这样做肯定会消除它。 p>删除了 firefox 缓存、所有持久化设置、一切,以便重新开始。
结果:失败...尝试消除从项目中获得的任何本地环境变量。
通过从工作计算机复制项目目录来做到这一点。
然后重新运行$ bundle exec rake parallel:spec。
结果:失败...尝试消除所有本地环境变量(项目和 linux)。
通过创建一个新的 linux 用户来做到这一点。
然后切换到新用户。$ su new_user -l
复制了所需的最少 zsh 项。
然后运行$ bundle exec rake parallel:spec
结果:失败...Ensured that /etc/hosts contained:.
127.0.0.1 localhost
结果:失败...-
在单线程中运行测试(非并行)。
$ rspec spec
结果:成功运行(未遇到问题) 查看更新 1
查看更新 2
查看更新 3
查看更新 4
查看更新 5
部分解决方案参见更新 6
调试的 Selenium 和 Parallel_tests gem
结果:确定问题不在 Selenium 中请参阅更新 7
结果:并行运行测试有效。但是为什么呢?参见更新 8 结果:
发现 Selenium 3.1.0 改变了文件自动下载的方式。
这会导致测试在运行并行测试时无限期挂起。
这导致数据库保持打开状态。
我要尝试的事情(更新)
- 在 chrome 浏览器中使用 chromedriver 运行测试,看看修复后是否通过。
更新 1
我用 chrome 替换了 firefox。
当我运行单个测试时,使用 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_andreandre@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 (marionette)。
我发现我的 firefox 配置文件没有使用 Capybara 正确设置。
这打破了我的本地单线程测试。
已修复此问题。
发现 geckodriver 不适用于 FF
还发现水豚、硒 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 打破了这一点。
测试无限期挂起。
数据库保持开放。
【问题讨论】:
标签: linux selenium rspec parallel-processing capybara