Selenium 因 selenium.common.exceptions.WebDriverException 崩溃:消息:newSession

Posted

技术标签:

【中文标题】Selenium 因 selenium.common.exceptions.WebDriverException 崩溃:消息:newSession【英文标题】:Selenium crashing with selenium.common.exceptions.WebDriverException: Message: newSession 【发布时间】:2019-03-30 13:35:12 【问题描述】:

操作系统:Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-1066-aws x86_64)

Selenium 版本:selenium==3.6.0

浏览器:Mozilla Firefox 63.0

Geckodriver 版本:geckodriver-v0.19.0-linux64

预期行为 -

创建一个新的Firefox浏览器并执行一些步骤-解析网站。

实际行为-

使用日志崩溃:-

    self.driver = webdriver.Firefox()
  File "/home/ubuntu/env/local/lib/python2.7/site-packages/selenium/webdriver/firefox/webdriver.py", line 154, in __init__
    keep_alive=True)
  File "/home/ubuntu/env/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 151, in __init__
    self.start_session(desired_capabilities, browser_profile)
  File "/home/ubuntu/env/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 240, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/home/ubuntu/env/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 308, in execute
    self.error_handler.check_response(response)
  File "/home/ubuntu/env/local/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: newSession

以前有没有人遇到过这个问题并有可能的解决方案?

更新: 运行以下命令:geckodriver --log trace & curl -d '' 127.0.0.1:4444/session

日志:- https://pastebin.com/TirTNKrG

【问题讨论】:

以前从未见过此异常,也不明白可能是什么问题。 尝试使用跟踪日志运行 geckodriver 并手动调用“newSession”命令:geckodriver --log trace &; curl -d '' 127.0.0.1:XXXX/session(将“XXXX”替换为启动geckodriver时显示的端口) @fzbd 我从您提供的上述命令中删除了;。更新了问题。 【参考方案1】:

我通过更新 selenium python 包并使用最新的 geckodriver 解决了这个问题。

感谢@fzbd 的所有帮助。

附加上下文 -

请参阅此处的兼容性图表 - https://firefox-source-docs.mozilla.org/testing/geckodriver/Support.html#supported-platforms

更新硒:

 pip install -U selenium

update geckodriver(根据以上兼容性图表选择适合您需要的正确版本)

检查所有组件的版本 -

firefox -v
geckodriver -V
pip freeze | grep selenium

【讨论】:

我还必须安装最新版本的 Firefox【参考方案2】:

感谢@skyfail。 你的回答帮助了我。 执行了以下序列并解决了该问题。

    升级 selenium 运行:sudo pip3 install selenium --upgrade

    要升级 geckodriver,请按照this 中的步骤 1-3 进行操作

    sudo mv geckodriver /usr/local/bin/geckodriver , /usr/local/bin 通常在您的 PATH 中,因此无需编辑。

【讨论】:

我为什么要 sudo?【参考方案3】:

在您的日志中是以下行:

1540501901605 geckodriver 错误地址正在使用(操作系统错误98)

这表明驱动程序正在尝试使用已被其他进程使用的端口。由于日志没有显示是哪个端口,你可以用strace运行驱动:

strace geckodriver 2>&1 | grep -iE 'bind|getsockname'

在我的情况下,我得到了以下几行:

bind(3, sa_family=AF_INET, sin_port=htons(4444), sin_addr=inet_addr("127.0.0.1"), 16) = 0

getsockname(3, sa_family=AF_INET, sin_port=htons(4444), sin_addr=inet_addr("127.0.0.1"), [128->16]) = 0

然后您可以检查哪个进程正在使用该端口(例如):

netstat -tulpn | grep -i 4444 

在我的情况下返回:

tcp 0 0 127.0.0.1:4444 0.0.0.0:* LISTEN 31471/geckodriver

根据issue about geckodriver port logging,可以让os分配一个空闲端口:

geckodriver --port 0

如果这一切都不起作用,那么您的 geckodriver 和 selenium 版本之间可能不兼容,因为日志中的这个错误似乎表明:

geckodriver::marionette TRACE

我正在使用以下版本:

火狐62.0.3 geckodriver 0.23.0 硒 3.14.1

【讨论】:

netstat -tulpn | grep -i 4444 给我的输出和你得到的一样。 只是为了排除驱动程序的其他实例,您可以运行killall geckodriver; killall firefox 并尝试绑定到不同的端口吗?如果您仍然点击不可用的地址,strace 应该输出 -1 EADDRINUSE (Address already in use) 我还编辑了可能版本不兼容的答案。

以上是关于Selenium 因 selenium.common.exceptions.WebDriverException 崩溃:消息:newSession的主要内容,如果未能解决你的问题,请参考以下文章

Selenium-Java-geckodriver:测试执行因 JavaScript 错误而停止,因为“document.getElementById(...) is null”

Selenium常见异常分析及解决方案

selenium 安装报错问题

如何安装selenium框架

测试Selenium录制单元测试脚本

Selenium获取页面指定元素个数