urllib3.exceptions.MaxRetryError问题的解决
1.背景描述在使用python+selenium做UI自动化时,单个脚本执行通过,多个脚本执行时,执行到第二个时失败。测试代码如下:# !/usr/bin/env python# -*- coding: utf-8 -*-from ltlv5uidata.init import autobenchclass TestGetCode:def setup(self):self.ui = autoben
1.背景描述
在使用python+selenium做UI自动化时,单个脚本执行通过,多个脚本执行时,执行到第二个时失败。测试代码如下:
# !/usr/bin/env python
# -*- coding: utf-8 -*-
from ltlv5uidata.init import autobench
class TestGetCode:
def setup(self):
self.ui = autobench.ui
self.ui.login_page.login_web(username='bestadmin', password='800best@@')
def teardown(self):
self.ui.login_page.driver_quit()
def test_v008_get_code_01(self):
"""
未领取单号-直接领取单号
"""
self.ui.index_page.open_menu("基础服务", "快件跟踪查询")
def test_v008_get_code_02(self):
"""
未领取单号-直接领取单号
"""
self.ui.index_page.open_menu("基础服务", "运单录入-子单打印(新)")
test_v008_get_code_01单独执行通过;
test_v008_get_code_02单独执行通过;
但是把上述两个同时执行时,第二个一定失败。报错截图如下:
2.问题截图
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=9411): Max retries exceeded with url: /session/8b9f22e1b057e9ff1920333fd46f3d9d/element (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x053EC610>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。'))
3.问题分析
在tear_down中都调用了driver的quit方法,按照上述程序的执行过程,应该没有什么问题,应该全部都可以执行成功的。
百度了很多,都没有得到解决。
最终断点发现,其实在执行第二个 test方法时,还是使用的第一个test中实例出来的driver,而此时第一个test中的driver已经被设置为None了。
但此时还去使用为None的driver去做操作(例如做:self.driver.find_element_by_css_selector())。因为driver为None,即ChromeDriver开启的服务不存在了,因此Urlib中报错了。
4.解决方法
每次执行test方法时都使用同一个 driver 对象即可。
小结:
所以上面的核心是,如果用已经quit() 的driver去做 操作就会包出错。
当出现上述 “urllib3.exceptions.MaxRetryError” 时,先检查一下你的driver对象是不是已经做了quit()了。
5.另外还存在的问题
类属性和类实例属性同名的情况
(1)如果类实例属性存在,则调用类实例属性,如下代码:
class A:
driver = 200
def __init__(self, driver):
self.driver = driver
pass
class B(A):
def __init__(self, num):
super().__init__(num)
def b_print(self):
print(self.driver)
if __name__ == '__main__':
b = B(100)
b.b_print()
"""
100
"""
(2)如果类实例不存在了,则使用的类属性了,如下代码:
class A:
driver = 200
def __init__(self, driver):
self.driver = None
class B(A):
def __init__(self, num):
super().__init__(num)
def b_print(self):
print(self.driver)
if __name__ == '__main__':
b = B(100)
delattr(b, 'driver')
b.b_print()
"""
200
"""
""" 上述文章你看了,可能还是不能解决你的问题,如有问题,请联系QQ:312019088,注明来意,协助解决你的问题。 如果你喜欢本文章,请一键三连... """
更多推荐
所有评论(0)