一、背景
在使用python+selenium进行自动化测试的时候,经常会遇到多个场景的前置条件都是同样的代码,例如签到,充值的场景,他们的前置条件是先登录,如果每条用例脚本我们都写上登录的代码,代码冗余先不说,假如登录模块进行了改动,那么我们就也要将签到,充值的用例进行修改维护,无形中增加了我们的工作量。
二、思路
将登录模块的测试用例脚本单独写出来,其他场景涉及登录模块直接调用【登录模块脚本】,若登录模块进行了改动,那么我们只要单独修改【登录模块脚本】的代码即可,其他场景的测试用例无需修改
三、代码示例
1:登录测试用例脚本
备注:打开的网址以及需要定位的元素大家就用自己的即可
import unittest
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
import time
import urllib.parse
from selenium.webdriver.support.ui import WebDriverWait
import requests
import json
import re
class LoadTest(unittest.TestCase):
# 定义一个类变量 driver
driver = None
# 使用 setUpClass 方法来初始化 driver
@classmethod
def setUpClass(cls) -> None:
cls.driver = webdriver.Chrome()
cls.driver.get('https://www.baidu.com/')
cls.time = time # 初始化cls.time属性为time模块
# 使用 tearDownClass 方法来关闭 driver
@classmethod
def tearDownClass(cls) -> None:
cls.time.sleep(2) # 执行用例结束后等待2秒
cls.driver.quit() # 执行完用例关闭浏览器
cls.time = time # 初始化cls.time属性为time模块
def test_login(self):
# 使用类变量 driver
# 修改了这一行,使用 LoadTest.driver 而不是 driver
LoadTest.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
}) # 绕过阿里云滑块检测
self.time.sleep(1)
self.driver.refresh() # 刷新页面使弹窗2关闭
self.time.sleep(1)
self.driver.maximize_window() # 放大浏览器
self.time.sleep(1)
self.Sign = self.driver.find_element(By.ID, 'loginsuccessnews') # 点击登录按钮
self.Sign.click()
self.phone_sign = self.driver.find_element(By.XPATH,
"//div[@class='ant-modal-content']//div[2]//div[1]//span[1]") # 选择手机登录
self.time.sleep(1)
self.phone_sign.click()
self.account_sign = self.driver.find_element(By.XPATH,
"/html[1]/body[1]/div[4]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]").click() # 选择账号密码登录
self.time.sleep(1)
self.username_input = self.driver.find_element(By.XPATH, "//input[@placeholder='请输入手机号']").send_keys(
'14028827984') # 输入手机号码
self.password_input = self.driver.find_element(By.XPATH, "//input[@placeholder='请输入密码']").send_keys(
'upusdjiR') # 输入密码
self.time.sleep(2)
self.signclick = self.driver.find_element(By.CLASS_NAME, 'login-btn___yjE2H').click()
self.time.sleep(2)
self.refclick = self.driver.find_element(By.ID, 'rectBottom').click()
self.time.sleep(3)
if __name__ == '__main__':
unittest.main()
2:充值测试用例脚本
import unittest
import time
import requests
import base64
import re
from io import BytesIO
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select #导入selenium库里面的Select
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys #导入键盘操作包
from selenium import webdriver
from PIL import Image
from test_login import LoadTest # 导入 test_login 模块
class LoadTest2(unittest.TestCase):
def setUp(self) -> None:
LoadTest.setUpClass()# 调用 LoadTest 的 setUpClass 方法来初始化 LoadTest.driver 属性
self.driver = LoadTest.driver # 使用 LoadTest 的 driver 属性
self.time = time # 初始化self.time属性为time模块
self.load_test = LoadTest() # 创建 LoadTest 的实例对象
def tearDown(self) -> None:
self.time.sleep(2) # 执行用例结束后等待2秒
self.time = time # 初始化self.time属性为time模块
LoadTest.tearDownClass()# 调用 LoadTest 的 tearDownClass 方法来关闭 LoadTest.driver 属性
def test_Recharge(self):
self.load_test.test_login() # 使用 LoadTest 的实例对象调用 test_login 方法
self.driver.get('www.xxznm.com')
self.time.sleep(3)
self.ewm = self.driver.find_element(By.XPATH,"/html[1]/body[1]/div[4]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/div[3]/div[5]/img[1]") #获取二维码区域元素
self.base64String = self.ewm.get_attribute('src') # 使用self关键字定义一个类属性
# 假设base64String是你要检查的base64编码的图片字符串
image_data = base64.b64decode(self.base64String.split(",")[1]) # 将图片字符串分割成前缀和数据部分,然后解码数据部分
image = Image.open(BytesIO(image_data)) # 使用PIL库打开图片,加上BytesIO转换
# 如果你期望图片是正确的base64的格式,你可以断言它不会抛出异常或者会匹配正则表达式
base64.b64decode(self.base64String.split(",")[1]) # 直接调用base64.b64decode方法
pattern = r"^data:image\/png;base64,[A-Za-z0-9+/=]+$" # 定义一个正则表达式匹配base64的格式
self.assertRegex(self.base64String, pattern) # 断言会匹配正则表达式
if __name__ == '__main__':
unittest.main()
备注:我这里打开的“www.xxznm.com”是我虚拟出来的url,且这个链接打开后有充值二维码展示出来,大家可以根据自己的场景进行略微修改,着重看以下这段代码是调用模块;还有就是别忘记进行导入登录的模块哦from test_login import LoadTest # 导入 test_login 模块(test_login是登录脚本的类,LoadTest 是登录脚本的方法)
class LoadTest2(unittest.TestCase):
def setUp(self) -> None:
LoadTest.setUpClass()# 调用 LoadTest 的 setUpClass 方法来初始化 LoadTest.driver 属性
self.driver = LoadTest.driver # 使用 LoadTest 的 driver 属性
self.time = time # 初始化self.time属性为time模块
self.load_test = LoadTest() # 创建 LoadTest 的实例对象
def tearDown(self) -> None:
self.time.sleep(2) # 执行用例结束后等待2秒
self.time = time # 初始化self.time属性为time模块
LoadTest.tearDownClass()# 调用 LoadTest 的 tearDownClass 方法来关闭 LoadTest.driver 属性
def test_充值(self):
self.load_test.test_login() # 使用 LoadTest 的实例对象调用 test_login 方法