一、pytest夹具
@pytest.fixture
def driver():
d = webdriver.Chrome(service=Service('./chromedriver.exe'))
yield d # 这个d会传给测试函数
d.quit() # 测试结束后自动执行
二、相关习题(附注:pytest用例函数名必须test_开头)
任务1:打开bilibili,搜索“地球”(30分钟)
启动Chrome,打开https://www.bilibili.com。
用 find_element 定位到搜索框,输入“地球”。
定位搜索按钮,点击。
def test_bilibili_serch(driver):
driver.get('https://www.bilibili.com/')
wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="nav-searchform"]/div[1]/input'))).send_keys('地球')
driver.find_element(By.XPATH, '//*[@id="nav-searchform"]/div[2]').click()
driver2 = driver.window_handles
driver.switch_to.window(driver2[1])
assert '地球' in driver.title
任务2:登录一个测试网站(45分钟)
推荐练习站: 搜“Selenium 练习网站”或直接用 https://practicetestautomation.com/practice-test-login/ (一个专门用来练登录的)。
定位用户名框、密码框、登录按钮,执行登录。
登录成功后,找到页面上的“Log out”按钮或某个成功提示文本,打印出来。
在这里你会遇到等待的痛点:登录按钮点了之后,页面会跳转,如果你不等,下一个元素就找不到。试着用显式等待解决。
def test_login(driver):
driver.get('https://practicetestautomation.com/practice-test-login/')
driver.find_element(By.ID, 'username').send_keys('student')
driver.find_element(By.ID, 'password').send_keys('Password123')
driver.find_element(By.ID, 'submit').click()
wait = WebDriverWait(driver, 5)
text = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="loop-container"]/div/article/div[2]/div/div/div/a'))).text
assert text == 'Log out'
print(text)
任务3:带数据驱动的登录测试(升级,90分钟)
推荐练习站: 搜“Selenium 练习网站”或直接用 https://practicetestautomation.com/practice-test-login/ (一个专门用来练登录的)
。
创建一个CSV或Excel文件,里面有多组用户名和密码(包括正确的和错误的)。
写一个循环,从文件里读取每组数据,执行登录,然后根据预期结果(成功或失败)判断测试是否通过,并用Python的print输出结果。
这是你简历上第一个“自动化测试框架”的雏形,非常重要。
def get_data_from_excel(file_path):
wb = openpyxl.load_workbook(file_path)
sheet = wb.active
data = []
for row in sheet.iter_rows(min_row=2, values_only=True):
data.append(row)
return data
def login_test(driver, username, password):
WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.ID, 'username'))).send_keys(username)
driver.find_element(By.ID, 'password').send_keys(password)
driver.find_element(By.ID, 'submit').click()
try:
WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="loop-container"]/div/article/div[2]/div/div/div/a')))
except TimeoutException:
return '登录失败'
else:
return '登录成功'
@pytest.mark.parametrize("username, password, result", get_data_from_excel('./testdata_pytest.xlsx'))
def test_login(driver, username, password, result):
driver.get('https://practicetestautomation.com/practice-test-login/')
login_success = login_test(driver, username, password)
assert login_success == result
任务4(选做,进阶):使用Page Object模式重构
把任务3转换成Page Object 设计模式。很简单,就是把“一个页面的所有元素定位和操作”封装成一个类,
测试脚本只调用类的方法,看起来特别清晰易维护。
这个模式你只要在面试中能讲出它的好处,就能秒杀很多竞争者:
好维护:页面元素变了,只用改对应的页面对象类,不用改所有测试用例 。
能复用:同一个页面的操作方法可以被多个测试用例重复调用,减少重复代码 。
看得懂:测试用例里全是业务语言,不像以前那样夹杂大量技术代码,逻辑更清晰
class PageLogin:
#页面网址
URL = 'https://practicetestautomation.com/practice-test-login/'
#元素定位器
USERNAME_INPUT = (By.ID, 'username')
PASSWORD_INPUT = (By.ID, 'password')
LOGIN_CLICK = (By.ID, 'submit')
SUCCESS_FLAG = (By.XPATH, '//*[@id="loop-container"]/div/article/div[2]/div/div/div/a')
#初始化driver
def __init__(self, driver):
self.driver = driver
#进入网站
def open(self):
self.driver.get(self.URL)
#输入账户
def username_enter(self, username):
WebDriverWait(self.driver, 5).until(EC.element_to_be_clickable(self.USERNAME_INPUT)).send_keys(username)
#输入密码
def password_enter(self, password):
self.driver.find_element(*self.PASSWORD_INPUT).send_keys(password)
#点击登录按钮
def login_click(self):
self.driver.find_element(*self.LOGIN_CLICK).click()
#登录
def login_test(self,username, password):
self.username_enter(username)
self.password_enter(password)
self.login_click()
try:
WebDriverWait(self.driver, 5).until(EC.element_to_be_clickable(self.SUCCESS_FLAG))
except TimeoutException:
return '登录失败'
else:
return '登录成功'
def get_data_from_excel(file_path):
wb = openpyxl.load_workbook(file_path)
sheet = wb.active
data = []
for row in sheet.iter_rows(min_row=2, values_only=True):
data.append(row)
return data
@pytest.mark.parametrize("username, password, result", get_data_from_excel('./testdata_pytest.xlsx'))
def test_login(driver, username, password, result):
pagelogin = PageLogin(driver)
pagelogin.open()
is_login_success = pagelogin.login_test(username, password)
assert is_login_success == result
三、pytest测试用例执行
1)执行命令:
pytest my_pytest.py
2)执行并生成报告命令:
pytest my_pytest.py --alluredir=./report
3)报告转为html并打开的命令:
allure serve ./report
938

被折叠的 条评论
为什么被折叠?



