现象:
用 Appium 做 app 测试,两个 case 执行时都是在同一个 session 下与 server 通讯(第一个 case 执行完后调用 tearDown 方法删除了 session),第二个 case 执行时还用已经被删除的 session 与 server 通讯导致用例失败。

代码:
method.py 这个类中有两个方法供 case 调用
其中 db.select(method, id) 方法就是另外封装的一个取元素的方法

# coding=utf-8
from selenium.webdriver.common.by import By
from base.DataBase import *
from base.MyDriver import noxdriver

class MeThod:
    def __init__(self):
        self.driver = noxdriver.getDriver()

    def element(self, method, id):
        if method == "xpath":
            return self.driver.find_element(by=By.XPATH, value=db.select(method, id))
        if method == "id":
            return self.driver.find_element(by=By.ID, value=db.select(method, id))
        if method == "name":
            return self.driver.find_element(by=By.NAME, value=db.select(method, id))
        if method == "calss_name":
            return self.driver.find_element(by=By.CLASS_NAME, value=db.select(method, id))
        else:
            return None

    def loginOut(self):
        self.element("xpath", "1").click()
        try:
            el = self.element("xpath", "9").text
        except Exception:
            el = "无已登录账号"
        el0 = "18699999999"
        if el == el0:
            self.driver.tap([(150, 235)])
            self.element("xpath", "2").click()
            self.element("xpath", "3").click()
        else:
            self.element("xpath", "3").click()

method = MeThod()

case 代码 (为了测试方便,两个脚本文件使用一套代码,方法分别为 test_a, test_b 吧):

# coding=utf-8
import unittest
from base.Log import logger
from base.MeThod import method
from base.DataBase import *

class WeiDa(unittest.TestCase):
    def setUp(self):
        method.driver.implicitly_wait(6)

    def tearDown(self):
        method.driver.quit()

    def test_a(self):
        method.loginOut()
        method.element("xpath", "4").send_keys(db1.select("number", "4"))
        method.element("xpath", "5").send_keys(db1.select("number", "2"))
        method.element("xpath", "6").click()
        try:
            text = method.element("xpath", "9").text
        except Exception:
            text = None
            logger.error("脚本失败")
            self.assertIsNotNone(text, msg="没有找到账号")

if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(WeiDa)
    unittest.TextTestRunner(verbosity=2).run(suite)

执行 case 后报错信息:

分析请求后发现第二个 case 还是在用被删除的 session 通讯,所以必然报上图中的错误:

后来修改 method.py 代码在 init 位置添加接受一个参数和一个类方法:

def __init__(self, driver):
        self.driver = driver

def getDriver(self):
        return self.driver

case 这样写后能正常执行(也就是两个 case 都是独立的 session):

# coding=utf-8
import unittest
from base.MeThod import MeThod
from base.MyDriver import noxdriver

class WeiDa(unittest.TestCase):
    def setUp(self):
        self.a = MeThod(noxdriver.getDriver())
        self.a.getDriver().implicitly_wait(6)

    def tearDown(self):
        self.a.getDriver().quit()

    def test_b(self):
        self.a.element("xpath", "1").click()


if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(WeiDa)
    unittest.TextTestRunner(verbosity=2).run(suite)

但是这样调用 method 中打方法后,编辑器中不会出现属性的方法提示了,就是输入.后不跟方法了

请问怎么改写?
备注:已经解决


↙↙↙阅读原文可查看相关链接,并与作者交流