接口自动化测试步骤几乎是一样的,可以用excel写测试用例,通过ddt实现数据驱动,而web自动化不符合测试步骤一致的要求,用ddt实现数据驱动并不理想,这时候可以使用关键字驱动实现web自动化。
一、封装浏览器操作
browser.py,我放在了common包下面
import allure
from selenium.webdriver import Chrome
from selenium.webdriver import ActionChains, Keys
class Browser:
def __init__(self,driver:Chrome):
self.driver = driver
self.action = ActionChains(driver)
def visit(self,url):
"""访问网页"""
self.driver.get(url)
def click(self,locator):
"""浏览器点击"""
el = self.get_element(locator)
el.click()
def send_keys(self,locator,text):
""" 在输入框中输入信息"""
el = self.get_element(locator)
el.send_keys(text)
def get_element(self,locator):
"""查找元素"""
try:
return self.driver.find_element(*locator)
except Exception as e:
self.attach_screenshot("没有找到元素")
raise e
def attach_screenshot(self,pic_name="截图"):
"""截图"""
png = self.driver.get_screenshot_as_png()
allure.attach(png,name=pic_name,attachment_type=allure.attachment_type.PNG)
def press_enter(self):
"""回车"""
self.action.send_keys(Keys.ENTER).perform()
二、创建浏览器对象
conftest.py,创建夹具,把浏览器对象放进去
import pytest
from selenium import webdriver
from selenium.webdriver.chromium.options import ChromiumOptions
@pytest.fixture()
def browser():
"""创建一个浏览器对象"""
option = ChromiumOptions()
option.page_load_strategy = 'eager' # 设置浏览器的属性,不等所有的元素页面加载完成
driver = webdriver.Chrome(options=option)
driver.implicitly_wait(8)
driver.maximize_window()
yield driver
driver.quit()
三、用yaml文件写测试用例
一个用例一个yaml文件(里面可以写列表和字典,使用数据很方便)login_baidu.yaml,我用的百度登录
-
action : visit
input :
url : "https://www.baidu.com/"
-
action: click
input:
locator:
['xpath','(//a[@name="tj_login"])[2]']
-
action: send_keys
input:
locator:
['xpath','//input[@placeholder="手机号/用户名/邮箱"]']
text : "15988889999"
-
action : send_keys
input :
locator : ['xpath','//input[@placeholder="密码"]']
text : "123"
-
action : press_enter
input :
四、创建方法提取yaml测试数据,调用封装的浏览器方法执行
keywords_fun.py,我放在了cases包下面
import yaml
from common.browser import Browser
def read_yaml(file):
with open(file,encoding='utf-8') as cases:
data = yaml.safe_load(cases)
return data
def keywords(browser,file):
"""关键字测试用例"""
b = Browser(browser)
steps = read_yaml(file)
for step in steps:
method = getattr(b,step["action"]) #方法是类的属性,通过获取属性的方式获取方法
if step["input"]:
method(**step["input"]) #调用方法,用**解字典包获取参数
else:
method()
五、执行测试用例
导入keywords_fun.py中的keywords方法,将编写的yaml文件和浏览器对象(之前创建的夹具)传入,点击执行
from cases.keywords_fun import keywords
def test_login(browser):
keywords(browser=browser,file="login_baidu.yaml")
总结:
1、以上代码可以实现百度网页登录
2、注意点:浏览器操作封装,pytest夹具的创建,根据yaml文件中的action字段调用浏览器方法