目录
一、关键字驱动设计模式介绍
二、关键字驱动设计模式原理
三、关键字驱动设计模式代码实现
1.逻辑代码web_keys.py文件内容
2.测试代码web_test.py文件内容
四、总结
在自动化测试中,分为两种应用方式
第一种叫做线性代码的模式,是所有的学习者以及新手对于自动化的认知。
第二种方式是基于框架的形态来完成,所谓框架其实就是一个完整的工程结构,具备有各类功能,满足企业实际各方功能需求的一个项目工程。
市场主流的自动化测试框架设计,分为POM和关键字驱动,
主要是为了解决不同的需求而实现的不同设计模式
测试框架在实际工作中是一种灵活的内容,会结合企业的实际需要来实现具体功能。
关键字驱动,最为传统的设计模式。最初就是基于工具的交互形态来实现的。
冗余是非常常见的现象,关键字驱动的设计模式可以极大地降低代码的冗余。
例如:
def 刷1(学员): if 学员听懂了: return 1 else: return 懵逼
框架,可以更好地精简代码,而且可以更好地维护代码。
关键字驱动设计模式是最适合以一对多的测试框架。
POM更适合项目的一对一设计,将每个流程封装在不同的py文件中。
框架不是固定的,是非常灵活的内容,会结合企业的实际需要来实现具体的功能。
测试框架基本原理:
代码与数据分离
逻辑代码与测试代码要分离
关键字驱动类就是Selenium的操作行为代码的封装,这是错误的。
关键字驱动类,是行为的封装,重点在封装二字。
关键字驱动类除去封装基本的操作行为之外,还可以实现流程的关键字封装,在整个框架设计上,封装的定义不是固定的。
逻辑代码和测试代码的分离,新建逻辑代码和测试代码
逻辑代码web_keys.py文件,测试代码web_test.py文件
关键字驱动:逻辑代码
webui全部是基于selenium来实现的。selenium就是一个巨大的商城,很多东西我们用不上
我们只取自己需要的工具,就可以了
逻辑代码,就类似于一个工具箱,需要什么东西,就在selenium商城去取,将常用的操作进行封装,以便调用
封装关键字需要提高复用性,提升维护性降低维护成本。
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
def opt():
options = webdriver.ChromeOptions()
# 页面加载策略
options.page_load_strategy = 'normal'
# 窗体最大化
options.add_argument('start-maximized')
def open_browser(type_):
try:
driver = getattr(webdriver, type_.capitalize())(options=opt())
except Exception as e:
print(e)
driver = webdriver.Chrome()
return driver
class Webkeys:
# 临时driver对象
# driver = webdriver.Chrome()
def __init__(self, type_):
self.driver = open_browser(type_)
self.driver.maximize_window()
self.driver.implicitly_wait(5)
# 访问url
def open(self, url):
self.driver.get(url)
# 元素定位,要满足不同的定位需求,将定位到的元素进行返回,方便后面调用
def locator(self, by, value):
return self.driver.find_element(by, value)
# 输入
def input(self, by, value, txt):
el = self.locator(by, value)
el.clear()
el.send_keys(txt)
# 点击
def click(self, by, value):
self.locator(by, value).click()
# 关闭
def quit(self):
self.driver.quit()
# 强制等待
def wait(self, time_):
time.sleep(time_)
# 显示等待
def driver_wait(self, by, value, time_=5):
WebDriverWait(self.driver, time_, 0.5). \
until(lambda element: self.locator(by, value), message='显示等待失败')
# 鼠标悬停
def action(self,by,value):
ActionChains(self.driver).move_to_element(self.locator(by,value)).perform()
# 输出标签页标题
def title(self):
print(self.driver.title)
# 句柄切换,关闭第一个标签页
def window_switch(self):
handles = self.driver.window_handles
self.driver.close()
self.driver.switch_to.window(handles[1])
# 句柄切换,不关闭第一个标签页
def window_switch_old(self):
handles = self.driver.window_handles
self.driver.switch_to.window(handles[1])
测试代码管理:将所有需要执行的测试流程,放在此文件中,进行统一管理
测试代码文件是可以有多个的,根据业务需要,以及代码管理需要进行文件的批量化管理即可
测试代码脱离了逻辑代码之后,是没有任何价值的。
from time import sleep
from selenium import webdriver
from selenium.webdriver import Keys, ActionChains
from selenium.webdriver.support.select import Select
from class21.web_keys import Webkeys
# 创建一个chrome浏览器、
wk = Webkeys('chrome')
# 打开登录登录页面
wk.open('http://hzp.fecmall.com/customer/account/login')
# 输入账号和密码
wk.input('id', 'email', '[email protected]')
wk.input('id', 'pass', '123456')
wk.click('xpath', '//span[text()="登录"]')
wk.wait(10)
# 鼠标悬停到婚礼,选择婚礼礼服
wk.action('xpath', '//a[text()="婚礼"]')
wk.click('xpath', '//a[text()="婚礼礼服"]')
# 点击选择婚礼礼服
wk.click('xpath', '//img[@class="js_lazy"]')
# 选择绿色的礼服
wk.click('xpath', '//a[@class="current"]/span/img')
wk.click('xpath', '//span[text()="L"]')
wk.locator('xpath', '//input[@class="qty"]').clear()
wk.input('xpath', '//input[@class="qty"]', '3')
wk.click('xpath', '//span[text()="加入购物车"]')
# 点击继续支付
wk.click('xpath', '//span[text()="继续支付"]')
wk.wait(6)
if wk.locator('xpath', '//*[@class="address_list"]'):
# 支付订单
wk.click('link text', '支付订单')
else:
# 填写收货地址
wk.input('id', 'billing:telephone', '13297912971')
wk.input('id', 'billing:street1', '武汉市')
wk.input('id', 'billing:street2', '黄志平家里')
# 选择国家的select
country = Select(wk.locator('id', 'billing:country'))
country.select_by_value('CN')
# 收货地址城市
state = Select(wk.locator('id', 'address:state'))
state.select_by_visible_text('湖北省')
wk.input('id', 'billing:city', '黄志平家里')
wk.input('id', 'billing:zip', '430000')
# 支付订单
wk.click('link text', '支付订单')
try:
wk.locator('xpath', '//h2[@class="sub-title"]')
except:
wk.title()
wk.driver.save_screenshot('./1.png')
sleep(10)
wk.quit()
本章主要学习的是关键字驱动的学习,将常用的一些操作,进行封装,这就是逻辑代码,专门用一个文件进行管理。测试代码专门用一个文件进行管理。
逻辑代码,不涉及数据。测试代码,不涉及逻辑。分开管理,方便维护。
代码和数据的分离,在后面也会讲到。下一章讲解的EXCEL数据驱动就是数据分离的一种形式。