linux - Selenium ::WebDriver::Error with Firefox & Chrome

标签 linux selenium rspec parallel-processing capybara

问题

1.浏览器= Firefox(非Geckodriver,Selenium v​​2.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 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-期望(3.4.0)
    -rspec-mocks(3.4.1)
    -rspec-rails(3.4.2)
    -rspec-support(3.4.1)
    -无头(2.2.3)(Xvfb)
  • 多个瘦客户端在上述服务器设置下运行其软件。
    我的电脑是许多...
    重要提示:另一台计算机在同一服务器上运行相同软件和相同版本时,没有遇到上述问题!

  • 不是问题的事情
  • 这不是我的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?
  • 没有僵尸进程(仍在运行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以确保清理了所有进程。
    结果:失败...
  • 深入了解问题。
    $ lsof -i TCP:7054看看什么保持了那个过程。
    结果:这是我的firefox测试,没有惊奇,没有真正的见识。
  • 确保并行测试数据库正确运行。
    删除所有数据库,重新创建数据库,重新加载所有架构,重新播种(开发),重新准备。
    结果:失败...我怀疑这是原因,但是这样做确实消除了它。
  • 删除了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

    我用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_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(木偶)。
    我发现我的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/

    相关文章:

    ruby-on-rails - 应该::匹配器::独立::DelegateMethodMatcher:未定义的方法 `allow_nil'

    ruby-on-rails - RSpec spec_helper 访问 session 变量

    c - Linux堆分配

    python - 使用 python 通过 Selenium WebDriver 计算页面加载的准确时间

    testing - cucumber + capybara + Selenium : selecting text

    java - 如何使用java定位并点击jubula中的web元素?

    ruby-on-rails - 如何使用 Rspec 和 FactoryGirl 在 Rails 模型中测试 before_update 回调?

    linux - 本地到linux复制

    C局部变量重用

    c++ - 我可以为我的程序的 linux 二进制文件提供我系统的共享库吗?