我的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 ,但是增加这些超时并不能解决问题。
答案 0 :(得分:0)
您看到 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 v3.14.0 可能会解决您的问题。