Selenium Webdriver ConnectionAbortedError在命令之间休眠5秒的情况下

时间:2018-08-17 12:57:01

标签: selenium firefox selenium-webdriver webdriver geckodriver

我的Selenium-WebDriver + Python脚本可以很好地工作,但是如果两次Webdriver命令之间的时间间隔过长,请给出ConnectionAbortedError

以下最小工作示例给出了错误:

from selenium import webdriver
from selenium.webdriver import Firefox
import time

browser = webdriver.Firefox()
browser.get('http://www.google.com/')
searchfield = browser.find_element_by_id("lst-ib") 
time.sleep(5) 
browser.close() # -> ConnectionAbortedError

在没有5秒钟睡眠的情况下,没有错误:

browser = webdriver.Firefox()
browser.get('http://www.google.com/')
searchfield = browser.find_element_by_id("lst-ib")
browser.close()

似乎没有其他人遇到过这个问题...几秒钟后失去连接是否正常?还是我做错了什么?

我尝试使用 implicitly_wait set_script_timeout ,但是增加这些超时并不能解决问题。

1 个答案:

答案 0 :(得分:0)

ConnectionAbortedError

您看到 ConnectionAbortedError ,因为 keep-alive connection 的默认超时时间是 5s

根据讨论comment中@andreastt的Keep-Alive connection to geckodriver 0.21.0 dropped after 5s of inactivity without re-connection using Selenium Python client GekcoDriver v0.21.0 已打开,以使用 HTTP / 1.1保持活动连接

正如您提到的 ConnectionAbortedError,如果网络驱动程序命令之间有5秒钟的睡眠时间,则由@whimboo的comment确认,他提到:

  

保持连接的默认超时时间似乎是5秒。遗憾的是,这次没有正确重新建立连接。

这里是对Why 5s?

的引用

GeckoDriver团队可能不得不将此超时时间提高到一个合理的值,但是另一方面,如果发生故障,客户端还必须创建一个新的连接。预期客户端需要在使用连接之前检查连接是否仍然有效。如果闲置五秒钟后服务器最终关闭了连接,则客户端需要建立新的连接。尽管增加保持活动超时持续时间很有意义。例如,自动化测试器通常要等待 5秒完成操作,或者等待 5秒线程睡眠才能使元素完成。在测试中出现/可见。

但是,再次将Keep-Alive connection timeout设置为较高的值并不能解决根本问题,因为Support keep alive connections中提到了WebDriver客户端处理HTTP连接的错误。

还提到了@AutomatedTester:

  

此问题不是因为在进行请求时我们尚未连接。如果这是问题所在,我们将引发一个httplib.HTTPConnection异常。相反,当我们进行连接并关闭并尝试解析响应时,会抛出BadStatusLine。   现在,这可能是python stdlib错误,httplib错误或selenium错误,需要进行调查。

@andreastt添加:

  

HTTPD的Keep-Alive超时值与此问题正交。一个已知的问题是Selenium Python客户端使用的urllib的Python 2.7标准库不符合HTTP / 1.1。增加服务器超时可以缓解这种情况,但不能解决潜在的问题,即Python中的HTTP库存在缺陷。

     

该问题似乎在最新的Python版本中已修复。当我们对此进行调查时,我们还发现,在urllib之上构建的各种HTTP库(例如请求)可以使用各种机制(例如对BadStatusLine异常进行特殊处理并重新连接)来解决该问题。

     

Selenium Team 正在为Python客户端开发一个补丁,以用其他Keep-Alive连接不会表现出相同缺陷的东西替换urllib。这项工作可以在Urllib3中进行跟踪。

     

与此同时,geckodriver团队正在努力将服务器端超时值扩展到更合理的值。正如我所说,这将有助于缓解此问题,但不能从根本上解决它。无论如何,五秒钟可能太短而无法从持久HTTP连接中获得真正的好处,将其增加到60秒左右将具有更高的性能。

您可以在讨论Increase Keep-Alive connection drop timeout中跟踪有关增加服务器Keep-Alive超时的工作。

解决方案

升级您的测试环境以使用 Selenium v​​3.14.0 可能会解决您的问题。