关键字驱动介绍
自动化测试领域下,有两大设计模式,作为测试框架的核心底层。
- 关键字驱动:广泛应用在接口、WEB、APP的测试领域下。
- 本质意义上而言,就是面向对象的编程思维。是一种可以以一套思维逻辑来满足大范围的项目的自动化测试需求。
- 在测试框架体系下,关键字驱动是非常常用的一种设计模式。
关键字驱动的结构与优势
关键字驱动结构
1.结构形态的清晰化,结构分离:代码与数据分离,逻辑代码与测试代码分离。
2.封装一定要复用性高。
3.足够灵活的封装
关键字驱动的优势
1.可以随时添加或修改关键字驱动类,便于后期的各类维护。
2.代码变得更加简洁
3.维护更加容易,冗余降低,提升了代码的拓展性。
关键字驱动类设计原理
- 通过以操作行为为关键字的形态进行封装,可以有效地将各类业务的自动化测试实现。如果要解决单个框架应对多个系统的自动化测试业务,则优先考虑关键字驱动。
- 结构上的逻辑代码与测试代码的完全分离。
- 关键字驱动类一定是结合数据驱动类来实现完整的测试形态。
- 关键字驱动形态,最为核心的应用在于接口自动化测试,UI 层,一般而言是结合企业需求来定义的。
- 基于企业的实际需求来设计一个对应的测试框架。而不是单纯的代码库的堆积。所有的测试框架都不是以固定的内容去套用不同的公司体系,一定是结合公司体系来设计完整的测试框 架。
- 在封装关键字驱动类中的函数时,一定要考虑到每一个函数是否会有不同的业务场景,如果有,则需要合理设计代码的逻辑。确保每一个函数都能够有高复用性与灵活性
'''
关键字驱动类。
一般在常态化中,考虑封装各类操作行为,作为关键字驱动的核心底层结构。
以工具类的形态,便于其他的类来进行调用。
常用的操作行为:
1. 访问url
2. 创建driver对象
3. 元素定位
4. 三类等待
5. 输入、点击
6. 切换iframe和句柄
。。。。。
封装的概念上,我们优先考虑自己用的上的内容,进行封装。
Selenium本身类似于一家超级无敌大的商场。关键字驱动类类似于家用的工具箱,要往工具箱里添加我们需要的东西。
在调用工具箱实现自己的自动化时,如果发现工具少了,或者缺失了,可以及时到Selenium中进行补充。
'''import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from options_web import chrome_options
# 构造浏览器对象,基于type_参数,构造对应的浏览器对象。defopen_browser(type_):'''
getattr是python内置的四大函数之一,反射机制,用于获取指定对象的属性或者函数。
driver = getattr(webdriver, type_)()意思就是:
if type_ == 'Chrome':
driver = webdriver.Chrome()
elif type_ == 'Edge':
driver = webdriver.Edge()
elif.....
因为反射本身是用来获取指定对象属性的。如果要获取的是函数,则需要在反射的后面加()
例如:
getattr(webdriver, type_) 表示获取webdriver的type_属性
getattr(webdriver, type_)() 表示获取webdriver的type_函数
'''try:if type_ =='Chrome':
driver = webdriver.Chrome(options=chrome_options.options())else:
driver =getattr(webdriver, type_)()except:# 没有填写可以创建默认browser
driver = webdriver.Chrome()
return driver
# 这种写法可以更加好地全面化满足用户的调用需求# browser = {'chrome': ['Chrome', 'chrome', 'cc', '谷歌'],# 'ie': ['ie', 'Ie', 'IE', '阿姨']}# if type_ in browser['chrome']:# driver = webdriver.Chrome(options=chrome_options.options())# elif type_ in browser['ie']:# driver = webdriver.Ie()# else:# driver = webdriver.Chrome()# return driverclassKeys:# 临时driver对象# driver = webdriver.Chrome()# 构造函数def__init__(self, type_):
self.driver = open_browser(type_)
self.driver.implicitly_wait(5)# url的访问defopen(self, url):
self.driver.get(url)# 元素定位:一定要考虑各种不同的元素定位方法。deflocate(self, by, value):return self.driver.find_element(by, value)# 输入definput(self, by, value, txt):
self.locate(by, value).send_keys(txt)# 点击defclick(self, by, value):
self.locate(by, value).click()# 浏览器关闭defquit(self):
self.driver.quit()# 文本断言defassert_text(self, by, value, expected):try:
reality = self.locate(by, value).text
assert expected == reality,'{0}与{1}不相等'.format(expected, reality)except Exception as e:print('断言失败:{}'.format(e))# 显式等待defdriver_wait(self, by, value):return WebDriverWait(self.driver,10,0.5).until(lambda el: self.locate(by, value), message='元素获取失败')# 强制等待defsleep(self, time_):
time.sleep(time_)# 句柄的切换:为了满足有些场景下不需要close,需要考虑逻辑的处理defswitch_handle(self, status=1):
handles = self.driver.window_handles
if status ==1:
self.driver.close()
self.driver.switch_to.window(handles[1])# 调试if __name__ =='__main__':
key = Keys('Chrome')
key.open('http://www.baidu.com')
版权归原作者 翀堏 所有, 如有侵权,请联系我们删除。