python web自动化(关键字驱动与POM)

您所在的位置:网站首页 pom模式和关键字模式 python web自动化(关键字驱动与POM)

python web自动化(关键字驱动与POM)

2024-07-15 02:09| 来源: 网络整理| 查看: 265

1.关键字驱动解析

        所谓的关键字驱动,本质就是函数封装的过程。

       ⾃动化当中的封装⽬的是:拆分重复的⾏为代码和测试数据,增加可维护性和复⽤性

                我们想要定义一个工具类         # 定义工具类(基于基础的方法,进行的关键字封装) class WebKeys: # 这个里面可以封装很多的web自动化的方法 # 通过构造函数,来接受driver对象 def __init__(self, driver): # driver是为了后面再用的时候,传入浏览器的对象 # 浏览器的初始化 self.driver = driver # 打开项目地址 def open(self, url): self.driver.get(url) """ # 元素定位的方式一: driver.find_element(By.ID, "txtUName").send_keys("17798989898") # 元素定位的方式二: driver.find_element("id", "txtUName").send_keys("17798989898") """ # 元素定位 def locator(self, method, value): # 引用for循环,去循环判断是否定位元素成功 # 获取原始的元素之后,再去获取他里面的动态熟悉 el = self.driver.find_element(method, value) # 将定位的元素标记出来 self.locator_station(el) return el # 把定位到的元素,标记颜色 def locator_station(self, el): self.driver.execute_script( "arguments[0].setAttribute('style',arguments[1]);", el, "border: 2px solid red;" # 边框、red红色、green绿色 )

再之后,我们新建conftest文件,用来运行前置后后置对象

        

"""""" import pytest from selenium import webdriver @pytest.fixture def browser(): # 01 用例的前置操作 driver = webdriver.Chrome() # 02 用例执行,返回driver yield driver # 03 用例的后置操作,关闭浏览器 driver.quit()

然后我们就可以开始写测试用例

        

"""""" import time """ 关键字封装之前的测试用例写法 """ # def test_login01(browser): # 因为browser现在就是返回的driver对象 # # 准备测试数据 # username = "17798989898" # password = "123456" # # # 打开项目地址 # browser.get("http://novel.hctestedu.com/user/login.html") # # # 进行登录操作 # browser.find_element("id", "txtUName").send_keys(username) # 输入账号 # browser.find_element("id", "txtPassword").send_keys(password) # 输入密码 # browser.find_element("id", "btnLogin").click() # 点击登录 """ 关键字封装之后的测试用例写法 """ from day9.p01_关键字驱动解析.key_word.key_cncap import WebKeys def test_login02(browser): # 因为browser现在就是返回的driver对象 # 准备测试数据 username = "17798989898" password = "123456" # 初始化工具类 wk = WebKeys(browser) # 打开项目地址 # browser.get("http://novel.hctestedu.com/user/login.html") wk.open("http://novel.hctestedu.com/user/login.html") # 进行登录操作 # browser.find_element("id", "txtUName").send_keys(username) # 输入账号 # browser.find_element("id", "txtPassword").send_keys(password) # 输入密码 # browser.find_element("id", "btnLogin").click() # 点击登录 wk.locator("id", "txtUName").send_keys(username) # 输入账号 wk.locator("id", "txtPassword").send_keys(password) # 输入密码 time.sleep(3) wk.locator("id", "btnLogin").click() # 点击登录

2.数据驱动与数据分离--yaml⽂件驱动                 数据驱动类型⽀持:

                将测试过程中所有测试数据,进⾏提取、保存以及管理,提升框架的可维护性⽀持:                    Excel、Yaml、JSON、Py.....

                yaml数据驱动                         安装依赖包:pip install pyyaml -i https://mirrors.aliyun.com/pypi/simple/

                yaml⽂件写法: ' - ' 表示 list标签' : ' 表示dict标签

                     准备数据:         # data.userData.yaml - username: 18894687777 passwd: 123456 - username: 13995245568 passwd: 123456 - username: 14713374348 passwd: 123456         读取yaml数据

        

# data_driver.yaml_driver.py import yaml def load_yaml(path): file = open(path, 'r', encoding='utf-8') data = yaml.load(file, Loader=yaml.FullLoader) return data 测试yaml⽂件读取 # data_driver.yamlReadTest.py from data_driver.yaml_driver import load_yaml content = load_yaml('../data/userData.yaml') print(content)

动态化测试⽤例的⽣成与断⾔数据的⽣成:          """""" import time import pytest from day9.p02_数据驱动与数据分离.data_driver.yaml_driver import load_yaml from day9.p01_关键字驱动解析.key_word.key_cncap import WebKeys @pytest.mark.parametrize("data", load_yaml(r"./data/userData.yaml")) def test_login02(browser, data): # 因为browser现在就是返回的driver对象 # 准备测试数据 print("data: ", data) username = data['username'] password = data['password'] # 初始化工具类 wk = WebKeys(browser) # 打开项目地址 wk.open("http://novel.hctestedu.com/user/login.html") # 进行登录操作 wk.locator("id", "txtUName").send_keys(username) # 输入账号 wk.locator("id", "txtPassword").send_keys(password) # 输入密码 time.sleep(3) wk.locator("id", "btnLogin").click() # 点击登录

 我们在data中放入三三个数据,通过这种方式,我们可以一口气执行将三个账户都执行测试用例

3.POM封装思想解析

含义:POM(Page Object Model)的主要⽬标是将测试代码和⻚⾯对象的实现代码分离,以提⾼测试代码的可维护性和可读性        PO设计模式具有以下优点:

        PO就是,以每个⽹⻚或者⽹⻚中的组件为单位,进⾏⾃动化代码的维护,可以和关键字驱动结合起来,进⼀步提⾼代码的 可维护性 和 复⽤性

                封装业务流程模块

                        

"""""" import time from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as ec from day9.p04_POM优化元素定位分离.key_word.key_cncap import WebKeys """ 封装登录的方法(因为很多用例都需要登录) 实际的项目中,这个板块(page模块)是要结合项目的实际情况的 """ class LoginPage(WebKeys): # 登录方法 def login(self, url, username, password): # 打开项目地址 self.open(url) # 进行登录操作 self.locator("id", "txtUName").send_keys(username) # 输入账号 self.locator("id", "txtPassword").send_keys(password) # 输入密码 time.sleep(3) self.locator("id", "btnLogin").click() # 点击登录 # 判断是否登录成功 wait = WebDriverWait(self.driver, 5) # 根据首页是否会出现username作为判断条件 wait.until(ec.text_to_be_present_in_element(("xpath", '//*[@id="headerUserInfo"]/span/a[1]'), str(username))) 隔离测试数据(VRA)          """""" """ 把那些全局的变量,都可以写在这里(通过大小写区分是全局的,还是局部的) """ LOGIN_URL = "http://novel.hctestedu.com/user/login.html" HOME_URL = "http://novel.hctestedu.com/?m=2" 4.POM优化:元素定位分离

                问题:⻓流程复杂业务,⻚⾯元素封装界定不清

                ⽅案:将⻚⾯元素抽离出来,集中管理,加编号加前缀,⽅便搜索查找,避免重复

                封装元素定位属性模块(locate):

                

"""""" """ 元素定位的方法和值 """ """ 登录页面的元素 """ username_el = ["id", "txtUName"] # 输入账号 password_el = ["id", "txtPassword"] # 输入密码 login_el = ["id", "btnLogin"] # 点击登录 """ 首页的元素 """ home_login_el = ["xpath", '//*[@id="headerUserInfo"]/span/a[1]'] """ 作家专区的元素 """ 元素定位属性封装后的登录模块封装示例:

        

"""""" import time from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as ec from day9.p04_POM优化元素定位分离.locate.allPages import * from day9.p04_POM优化元素定位分离.key_word.key_cncap import WebKeys """ 封装登录的方法(因为很多用例都需要登录) 实际的项目中,这个板块(page模块)是要结合项目的实际情况的 """ class LoginPage(WebKeys): # 登录方法 def login(self, url, username, password): # 打开项目地址 self.open(url) # 进行登录操作 self.locator(username_el[0], username_el[1]).send_keys(username) # 输入账号 self.locator(password_el[0], password_el[1]).send_keys(password) # 输入密码 time.sleep(3) self.locator(login_el[0], login_el[1]).click() # 点击登录 # 判断是否登录成功 wait = WebDriverWait(self.driver, 5) # 根据首页是否会出现username作为判断条件 wait.until(ec.text_to_be_present_in_element((home_login_el[0], home_login_el[1]), str(username))) 5.知识补充(eval函数的使⽤):

        官⽅解释:将字符串str当做有效的表达式来求值并返回计算结果

        

a = "[[1, 2], [3, 4], [5, 6]]" # print(type(a)) # print(type(eval(a))) # print(eval(a)) # print(eval(a)[0]) b = "{'a': 1, 'b': 2}" print(type(b)) print(type(eval(b))) print(eval(b)) print(eval(b)['a'])



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3