在不使用ddt的情况下,我们是完全可以实现UI自动化测试用例的,如下,我编写了一条成功用例,一条失败用例
pages目录下新建home_page.py文件(这里面放的是登录后的页面操作),代码如下:
from selenium.webdriver.common.by import By
from setting import config
from selenium.webdriver import Chrome
from selenium.webdriver.support import expected_conditions as when
from selenium.webdriver.support.wait import WebDriverWait
class HomePage:
url = config.host + 'Main/index.html'
def __init__(self, browser: Chrome):
self.browser = browser
def load(self):
"""加载页面"""
self.browser.get(self.url)
def is_loaded(self, timeout=10):
"""页面已经被加载"""
# 用显性等待等待url包含self.url
return WebDriverWait(self.browser, timeout).until(when.url_contains(self.url))
def get_username(self):
"""获取登录后的用户名称"""
el = self.browser.find_element(By.CSS_SELECtOR, '.avatar')
return el.get_attribute('title')
login_data.py代码修改如下:
login_fail = {'username': 'aaa', 'password': '123', 'expected': '密码有效长度是6到30个字符'}
login_success = {'username': '18603291314', 'password': '123456', 'expected': '沫沫'}
conftest.py代码修改如下:
import pytest
import os
from selenium import webdriver
from setting import config
from pages.login_page import LoginPage
from pages.home_page import HomePage
driver = os.path.join(config.driver_dir, 'chromedriver_96.exe')
# 打开浏览器
def get_browser():
# 因为要在测试用例后执行闭关浏览器,因为不要使用with的打开方式
browser = webdriver.Chrome(executable_path=driver)
browser.implicitly_wait(5)
browser.maximize_window()
return browser
# 设置夹具
@pytest.fixture()
def browser():
driver = get_browser()
yield driver
driver.quit()
# 依赖上一个夹具(上一个夹具是这个夹具的前置条件)
@pytest.fixture()
def login_page(browser):
return LoginPage(browser)
@pytest.fixture()
def home_page(browser):
return HomePage(browser)
自动化测试用例代码修改如下:
from data.login_data import login_fail, login_success
class TestSignIn:
def test_sing_in_failed(self, login_page):
"""测试登录失败"""
# 数据
username = login_fail['username']
password = login_fail['password']
expected = login_fail['expected']
# 获取实际结果
login_page.load()
login_page.login(username, password)
actual = login_page.get_error_tips()
# 断言
assert expected == actual
def test_sing_in_success(self, login_page, home_page):
"""测试登录成功"""
# 数据
username = login_success['username']
password = login_success['password']
expected = login_success['expected']
# 获取实际结果
login_page.load()
login_page.login(username, password)
# 断言
# 断言登录后的url
assert home_page.is_loaded()
# 断言登录后的用户名称
assert home_page.get_username() == expected
运行结果:
总结:
- 页面不同要编写不同的类,来进行存放,这样好维护代码
- 要新增一个home_page的夹具,因为返回的内容不同
- 登录后url的变更是需要设置时间等待,否则取到的url是登录前的
什么是ddt就不介绍了,在接口自动化测试中已经介绍过了,在UI自动化测试中使用ddt的成本是比接口要高的,因为接口自动化测试用例中,所有的测试步骤是一致的,只是测试数据不同,但在UI自动化测试用例中,测试步骤并没有完全一致,因此可以使用ddt,但编写过程相对接口复杂一些
下面来介绍一下具体的实现过程:
修改login_data.py代码如下:
# 单条登录失败数据
login_fail = {'username': 'aaa', 'password': '123', 'expected': '密码有效长度是6到30个字符'}
# 单条登录成功数据
login_success = {'username': '18603291314', 'password': 'lijiao921010', 'expected': '沫沫'}
# 多条登录失败数据
login_fail_list = [
{'username': 'aaa', 'password': '123', 'expected': '密码有效长度是6到30个字符'},
{'username': 'aaa', 'password': '12345', 'expected': '密码有效长度是6到30个字符'}
]
修改自动化测试用例代码如下:
from data.login_data import login_success, login_fail_list
import pytest
class TestSignIn:
@pytest.mark.parametrize('login_fail', login_fail_list)
def test_sing_in_failed(self, login_fail, login_page):
"""测试登录失败"""
# 数据
username = login_fail['username']
password = login_fail['password']
expected = login_fail['expected']
# 获取实际结果
login_page.load()
login_page.login(username, password)
actual = login_page.get_error_tips()
# 断言
assert expected == actual
def test_sing_in_success(self, login_page, home_page):
"""测试登录成功"""
# 数据
username = login_success['username']
password = login_success['password']
expected = login_success['expected']
# 获取实际结果
login_page.load()
login_page.login(username, password)
# 断言
# 断言登录后的url
assert home_page.is_loaded()
# 断言登录后的用户名称
assert home_page.get_username() == expected
运行结果:
总结:
- UI/web自动化测试数据驱动:使用分组的方式(就是相同测试步骤的数据放到一个列表中)
loging_fail = [ ] 驱动 test_sing_in_failed
loging_success = [ ] 驱动 test_sing_in_success
- 为什么UI自动化测试中,我们没有把数据放到excel表格中,因为使用表格,需要把多设置几个sheet页来存储测试用例,如:提示密码长度错误信息的放到sheet1中,提示密码错误信息的放到sheet2.....放到表格中,我们还是需要把表格中的数据读取出来,转换成列表嵌套字典的格式来操作,因此使用.py模块来进行存储比较易管理



