我的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,但是增加这些超时并不能解决问题。
发布于 2018-08-19 08:45:23
ConnectionAbortedError
您将ConnectionAbortedError视为keep-alive connection的默认超时是5s。
根据讨论中的@andreastt的评论,使用Selenium客户端,在没有重新连接的情况下,在不活动5s之后,与geckodriver0.21.0的连接保持活动。 GekcoDriver v0.21.0切换到使用HTTP/1.1保持活动连接。
正如您所提到的,ConnectionAbortedError,如果webdriver命令之间有5秒钟的睡眠,则由@whimboo的评论确认,他在其中提到:
看起来,保持活动连接的默认超时是5s。不幸的是,一旦这一次过去了,连接就不能正确地重新实例化。
以下是对为什么是5s?的引用
GeckoDriver团队可能不得不将这个超时设置为一个正常的值,但另一方面,客户端还必须在出现故障时创建一个新的连接。预期是客户端在使用之前需要检查连接是否仍然处于活动状态。当连接在停止活动5秒后最终被服务器关闭时,客户端需要建立一个新的连接。不过,增加保持生命超时的持续时间是很有意义的。对于自动化测试人员来说,通常的做法是等待5秒来完成操作,或者等待5秒线程休眠来等待测试中出现/可见的元素。
但是,将Keep-Alive connection timeout限制到更高的值并不能解决根本问题,因为WebDriver客户端在支持保持活的连接中提到的处理HTTP连接时存在缺陷。
AutomatedTester @AutomatedTester提到:
这个问题并不是因为我们在执行请求时没有连接。如果这是问题所在,我们就会抛出一个
httplib.HTTPConnection异常。相反,当我们执行连接并关闭它并尝试解析响应时,会抛出一个BadStatusLine。现在,这可能是python bug、httplib bug或selenium bug,需要进行研究。
@andreastt补充说:
HTTPD的
Keep-Alive超时值与此问题正交。众所周知,Selenium Python客户端使用的urllib所使用的Python2.7标准库不符合HTTP/1.1。增加服务器超时会减轻这一点,但不能解决根本问题,即Python中的HTTP库有一个缺陷。 这个问题似乎在最近的Python版本中得到了解决。当我们研究这个问题时,我们还发现构建在urllib之上的各种HTTP库,例如请求,可以使用各种机制(比如特殊的大小写BadStatusLine异常和重新连接)来解决这个问题。 Selenium正在为Python开发一个修补程序,将urllib替换为与Keep-Alive连接没有相同缺陷的东西。这项工作可以在Urllib3中跟踪。 同时,geckodriver团队正在努力将服务器端超时值扩展到更合理的值。正如我所说,这将有助于缓解这一问题,但不能从根本上解决这个问题。在任何情况下,5秒可能太低,无法从持久HTTP连接中获得真正的好处,并且将其提高到大约60秒将具有更好的性能。
您可以在讨论Keep-Alive中跟踪增加服务器增加保持活动的连接删除超时超时的工作。
解决方案
将您的测试环境升级到使用Selenium v3.14.0可能会解决您的问题。
https://stackoverflow.com/questions/51895959
复制相似问题