【问题标题】:Selenium::WebDriver::Error with Firefox & ChromeSelenium::WebDriver::Firefox 和 Chrome 出错
【发布时间】:2017-07-20 04:12:05
【问题描述】:

问题

1。浏览器 = Firefox(非 Geckodriver,Selenium v​​2.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)

我的设置

  1. 安装了以下设备的服务器:
    -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 v​​3.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)

  2. 多个瘦客户端在上述服务器设置之外运行其软件。
    我的电脑是其中之一...
    重要提示:另一台电脑在同一台服务器上运行相同软件和相同版本时没有遇到上述问题!

    李>

不是问题的事情

  1. 这不是我的 Firefox 浏览器版本与 Selenium 不兼容。
    为什么不呢?
    a) Firefox v46.0.3 和 Selenium v​​2.53.4 当前安装在我们的服务器上,并且该服务器的另一个客户端使用上述版本的 Firefox 和 Selenium 成功运行了 parallel_tests。
    b) Which Firefox version is compatible with Selenium 2.53.0?
  2. 没有僵尸进程(仍在运行 firefox)导致 firefox 锁定端口 7054。
    这特别是在每次故障发生之后和开始新的$ bundle exec rake parallel:spec 运行之前。
    为什么不呢?
    请参阅“我尝试过的事情”中的第 1 项和第 2 项
    事实并非如此,尽管这不是问题的原因
    数据库并不总是被正确杀死,请参阅更新 5。
    然而,没有被杀死的数据库是问题的结果。
    它们不是问题的原因,请参阅解决方案部分。

旁注

对于那些希望安装上述版本以使 selenium / firefox 正常工作的人:
Installing a previous version doesn't fix most problems

我尝试过的事情

  1. 删除了所有仍在运行的进程
    $ killall ruby; killall rspec; killall firefox
    结果:失败...

  2. 发现完成步骤 1 不足以杀死所有僵尸进程。
    登录到另一个 tty 后,我发现仍然有一个 rspec、ruby 和 firefox 进程在运行!
    所以我退出了我的用户,登录到一个新的 tty,使用以下命令杀死了所有僵尸进程:
    $ kill -9 process_id
    然后我重新运行 $ ps aux 以确保清理所有进程。
    结果:失败...

  3. 深入了解问题。
    Ran $ lsof -i TCP:7054 看看是什么阻碍了这个过程。
    结果:这是我的 Firefox 测试,没有惊喜,也没有获得真正的洞察力。

  4. 确保并行测试数据库正常运行。
    删除所有数据库,重新创建数据库,重新加载所有模式,重新播种(开发),重新准备。
    结果:失败...我怀疑这是原因,但这样做肯定会消除它。 p>

  5. 删除了 firefox 缓存、所有持久化设置、一切,以便重新开始。
    结果:失败...

  6. 尝试消除从项目中获得的任何本地环境变量。
    通过从工作计算机复制项目目录来做到这一点。
    然后重新运行$ bundle exec rake parallel:spec
    结果:失败...

  7. 尝试消除所有本地环境变量(项目和 linux)。
    通过创建一个新的 linux 用户来做到这一点。
    然后切换到新用户。
    $ su new_user -l
    复制了所需的最少 zsh 项。
    然后运行$ bundle exec rake parallel:spec
    结果:失败...

  8. Ensured that /etc/hosts contained:.
    127.0.0.1 localhost
    结果:失败...

  9. 在单线程中运行测试(非并行)。
    $ rspec spec
    结果:成功运行(未遇到问题)

  10. 查看更新 1

  11. 查看更新 2

  12. 查看更新 3

  13. 查看更新 4

  14. 查看更新 5
    部分解决方案

  15. 参见更新 6
    调试的 Selenium 和 Parallel_tests gem
    结果:确定问题不在 Selenium 中

  16. 请参阅更新 7
    结果:并行运行测试有效。但是为什么呢?

  17. 参见更新 8 结果:
    发现 Selenium 3.1.0 改变了文件自动下载的方式。
    这会导致测试在运行并行测试时无限期挂起。
    这导致数据库保持打开状态。

我要尝试的事情(更新)

  1. 在 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_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 (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


    【解决方案1】:

    更新中发现的问题不是根本原因。
    根本原因是 firefox/chrome 浏览器端口没有关闭并保持打开状态。
    查看 htop 后,发现 Polkitd 占用了 16.5gb 的内存!
    这是由 Polkitd 中的内存泄漏引起的。
    检查问题后,确认 Polkitd 内存泄漏是一个已知问题。
    该问题已得到修复,但仅在后来的 linux debian 发行版中得到解决,而 Wheezy 则没有。
    在重新启动 Polkitd 并重新并行运行测试后,它们工作了!
    这就解释了为什么我第一次使用干净的配置文件创建一个新的 linux 用户时,并行测试问题仍然存在。 - 内存泄漏是不可预测的。
    它还解释了为什么另一台计算机没有遇到此问题。
    以及为什么我第二次创建新用户时并行测试有效! 呼,好费劲啊!

    Polkitd 已被卸载,因为我们运行的任何打印机或其他软件都不需要它。

    总的来说,如果其他人有锁定问题,那么遵循我所做的一些进程检测会很有帮助,因为其中一些问题对所有操作系统都是常见的。

    【讨论】:

      猜你喜欢
      • 2013-06-28
      • 2016-11-07
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      相关资源
      最近更新 更多