标签:格式 password 配置文件 key 对象 tor login 重复 扩展性
一、PageObject页面对象
页面对象:会把某个网页页面封装成对象
对象
--属性:元素定位器、URL、标题
--方法:元素定位、点击、拖拽(在页面做了某个动作,执行了某步操作)
pageobject原则:
是不是所有的动作都需要封装成页面对象的方法:
--可以封装
--不必要这么做
--遵循的原则,你用到了什么行为,就封装什么行为
封装的页面的返回值
--self 或者是其他的页面
--如果需要获取某个元素或者属性,就直接返回元素本身或该属性的值
--如果一个操作可能会有多个结果,比如进行页面调转或者本页面,那就根据结果封装成多个方法
PageObject好处:
--可读性。PO模式函数名本身具有注释的功能
--可维护性。修改一个地位可全局修改,不需要一个个修改
--扩展性。当有新功能需要实现,更加方便
--页面逻辑和测试逻辑分离。
--可复用性。重复使用
测试用例编写:
-- 1.初始化页面
--2.调用页面逻辑操作,目的是获取实际结果
--3.结果对比
二、数据分组
分组的依据:测试步骤不一致
保存用例,不要通过excel1去管理:
--用py文件
--用ymal文件,也支持字典格式
py文件进行测试用例的管理:data目录下login_data.py
"""登录测试用例数据""" #登录失败数据 data_error = [ {"username":"","password":"","expected_results":"请输入手机号"}, {"username":"123","password":"","expected_results":"请输入正确的手机号"} ] #登录成功用例 data_success = [ {"username": "18621346545", "password": "12345678", "expected_results": "我的帐户[小样儿]"} ]
test_login()测试用例
"""登录功能的测试用例""" import pytest from middware.pages.login import LoginPage from data.login_data import data_error,data_success from middware.handler import HandlerMiddle #获取excel中login数据 # data = HandlerMiddle.excel.read_data("login") @pytest.mark.login class TestLogin: """登录功能的测试类""" @pytest.mark.error @pytest.mark.parametrize("test_info",data_error) def test_login_error(self,test_info,driver): """登陆失败用例""" #初始化 操作的页面 对象 login_page = LoginPage(driver) #测试步骤:输入用户名、密码、登录(调用po中的方法) actual_result =login_page.login_fail(username=test_info["username"], password=test_info["password"]).get_error_info() # 断言 expected_result = test_info["expected_results"] try: assert actual_result in expected_result except AssertionError as e: HandlerMiddle.logger.error("测试用例username为{},不通过!".format(test_info["username"])) raise e @pytest.mark.success @pytest.mark.parametrize("test_info",data_success) def test_login_success(self,test_info,driver): """登录成功测试用例""" #初始化页面对象 login_page = LoginPage(driver) #执行测试,获取实际结果, actual_result = login_page.login_success(username=test_info["username"], password=test_info["password"]).get_account_name() #断言 try: assert actual_result in test_info["expected_results"] except AssertionError as e: HandlerMiddle.logger.error("测试用例username为{},不通过!".format(test_info["username"])) raise e
三、locator分层
1)优化URL
将域名host放在yaml配置文件中管理,将URL作为类属性。
URL =HandlerMiddle.yaml_data["host"] + "/Index/login.html"
2)将访问页面单独进行封装
"""登录页面""" from middware.pages.index import IndexPage from middware.handler import HandlerMiddle class LoginPage: """登录""" URL =HandlerMiddle.yaml_data["host"] + "/Index/login.html" #初始化driver def __init__(self,driver): self.driver = driver def get(self): """访问页面""" self.driver.get(self.URL) return self def login_fail(self,username,password): # 输入用户名和密码,点击登录进行提交 self.enter_username(username) self.enter_password(password) self.driver.find_element_by_class_name("btn-special").click() return self def login_success(self,username,password): # 输入用户名和密码,点击登录进行提交 self.enter_username(username) self.enter_password(password) self.driver.find_element_by_class_name("btn-special").click() return IndexPage(self.driver) def enter_username(self,username): # 输入用户名 self.driver.find_element_by_name("phone").send_keys(username) return self def enter_password(self,password): # 输入密码 self.driver.find_element_by_name("password").send_keys(password) return self def get_error_info(self): # 获取登录失败的错误信息 return self.driver.find_element_by_class_name("form-error-info").text
actual_result =login_page.get().login_fail(username=test_info["username"],password=test_info["password"]).get_error_info()
3)优化元素定位
将元素定位locators,提取出来
locators是跟页面LoginPage绑定在一起的,是该页面的属性,所以可以提取出来作为类属性;
find_element()方法,源码中的2个参数为:by,value,即定位的方式,和值。调用locator的元组()表示方式)),用*args进行元组解包;调用locator的字典{}表示方式,用**args进行字典解包
eg元组表示:
login_btn_locator = ("name","btn-special")
调用:
def login_fail(self,username,password): self.enter_username(username) self.enter_password(password) self.driver.find_element(*self.login_btn_locator).click() return self
eg字典表示:
login_btn_locator = {"by":"name","value":"btn-special"}
调用:
def login_fail(self,username,password): self.enter_username(username) self.enter_password(password) self.driver.find_element(**self.login_btn_locator).click() return self
标签:格式 password 配置文件 key 对象 tor login 重复 扩展性
原文地址:https://www.cnblogs.com/zhangjx2457/p/13840704.html