python+selenium中可以直接调用已经写好的测试用例脚本,减少重复代码,降低维护成本

一、背景

在使用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 方法

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值