您现在的位置是:首页 >技术杂谈 >02.优化登录功能的UI自动化测试脚本网站首页技术杂谈
02.优化登录功能的UI自动化测试脚本
简介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 是一个基础页面类,用于封装通用的页面操作和方法,以便其他页面类可以继承和复用这些通用的操作。
主要作用:
- 封装页面元素定位和操作方法
- 提取页面的公共方法
- 封装页面的公共断言方法
- 处理页面的共性逻辑和异常情况
总的来说,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()
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。