欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

urllib3.exceptions.MaxRetryError问题的解决

程序员文章站 2022-03-10 22:17:03
1.背景描述在使用python+selenium做UI自动化时,单个脚本执行通过,多个脚本执行时,执行到第二个时失败。测试代码如下:# !/usr/bin/env python# -*- coding: utf-8 -*-from ltlv5uidata.init import autobenchclass TestGetCode: def setup(self): self.ui = autobench.ui self.ui.login_page...

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("基础服务", "运单录入-子单打印(新)")

urllib3.exceptions.MaxRetryError问题的解决

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] 由于目标计算机积极拒绝,无法连接。'))

urllib3.exceptions.MaxRetryError问题的解决
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,注明来意,协助解决你的问题。
如果你喜欢本文章,请一键三连...
"""

本文地址:https://blog.csdn.net/u012205706/article/details/111982545