您现在的位置是:首页 >技术杂谈 >02.优化登录功能的UI自动化测试脚本网站首页技术杂谈

02.优化登录功能的UI自动化测试脚本

AAIT11 2024-06-17 11:26:22
简介02.优化登录功能的UI自动化测试脚本

我们在上一篇文章中,完成了登功能的自动胡脚本,为了提高代码复用性,将重复代码进行封装和完善。

编写Driver工具类

创建工具类:driver_utils类,用于创建和管理WebDriver实例

  • get_driver()方法用于获取webdriver实例,如果实例不存在则创建一个 Chrome WebDriver 实例,并最大化窗口。该方法使用了单例模式,确保只有一个 WebDriver 实例在整个测试过程中被使用,避免重复创建和销毁 WebDriver 实例。
  • **quit_driver()** 方法用于关闭和销毁 WebDriver 实例。该方法会判断当前是否存在 WebDriver 实例,如果存在则关闭它并将实例置为 None
class DriverUtils:
    __driver = None
    @classmethod
    def get_driver(cls):
        """
        创建驱动
        :return:
        """
        # 先判断驱动是否存在,如果存在已经存在,直接返回,如果不存在,创建驱动
        if cls.__driver is None:
            cls.__driver=webdriver.Chrome()
            cls.__driver.maximize_window()
            # cls.__driver.implicitly_wait(20)#隐式等待20秒
        return cls.__driver

    @classmethod
    def quit_driver(cls):
        """
        关闭驱动
        :return:
        """
        # 先判断驱动是否关闭人,如果已关闭不想要处理,
        if cls.__driver:
            cls.__driver.quit()
            cls.__driver = None

创建基础页面类:BasePage

base_page.py 是一个基础页面类,用于封装通用的页面操作和方法,以便其他页面类可以继承和复用这些通用的操作。
主要作用:

  1. 封装页面元素定位和操作方法
  2. 提取页面的公共方法
  3. 封装页面的公共断言方法
  4. 处理页面的共性逻辑和异常情况

总的来说,base_page.py 的作用是提供一个基础的页面类,封装通用的页面操作和方法,使得其他页面类可以继承和复用这些通用的操作,提高代码的复用性和可维护性。它是 UI 自动化测试框架中的一个重要组成部分。

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class BasePage:
    def __init__(self,driver:webdriver.Chrome):
        self.driver=driver
    #定位元素方法
    def find_el(self,loc,timeout=15,poll=1):
        """
        封装查找元素的方法
        :param loc: 元素定位的方式,类型,元组,(By.xxx,value)
        :param timeout: 最大等待时间
        :param poll:间隔时间
        :return:返回元素对象
        """
        try:
            element = WebDriverWait(self.driver, timeout, poll).until(
                EC.visibility_of_element_located(loc)
            )
            return element
        except Exception as e:
            print(f"未找到元素定位的方式:{loc} 的元素")
            raise e

    def input(self, el, text):
        """
    封装输入的方法
        :param el: 元素对象
        :param text: 输入的内容
        :return:
        """
        el.clear()
        el.se

完整代码

page1_login.py

import time

from selenium.webdriver.common.by import By

from page.base_page import BasePage
from utils.driver_util import DriverUtils
class LoginPage(BasePage):
    def __init__(self):
        super().__init__(DriverUtils.get_driver())
        self.username_locator = (By.XPATH, '//input[@placeholder="用户名"]')
        # 密码输入框
        self.password = By.XPATH, '//input[@placeholder="密码"]'
        #验证码
        self.code = By.XPATH,'//input[@placeholder="验证码"]'
        # 登录按钮
        self.login_btn = By.XPATH, '//input[@value="登录"]'

    def manage_login(self, username, password):
        # 1. 用户名输入框
        username_input = self.find_el(self.username_locator)
        self.input(username_input, username)
        # 2. 密码输入框
        self.input(self.find_el(self.password),password)
        # 3. 验证码输入框
        self.input(self.find_el(self.code),'lemon')
        # 4. 登录按钮
        login_btn=self.find_el(self.login_btn)
        login_btn.click()
        self.driver.implicitly_wait(5)
        user = self.driver.find_element_by_xpath('//div[@class="el-dropdown"]/span[text()="student"]')
        #断言
        assert user.text == username
        print(user.text)

test1_manage_login.py

import pytest

from page.manage.page1_login import LoginPage
class TestManageLogin:
    @pytest.mark.usefixtures('setup_tear_down')
    def test_manage_login(self,setup_tear_down):
        cl=LoginPage()
        cl.manage_login(username='student',password='123456a')

conftest.py

import pytest

from utils.driver_util import DriverUtils


@pytest.fixture(scope='class')
def setup_tear_down():
    driver = DriverUtils.get_driver()
    driver.get('http://mall.lemonban.com/admin/#/login')
    yield
    DriverUtils.quit_driver()

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。