现象:
用 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 中打方法后,编辑器中不会出现属性的方法提示了,就是输入.后不跟方法了
请问怎么改写?
备注:已经解决