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

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐