Web自动化是自动化测试中的重要部分,作为广大测试从业者的首选学习对象,相较于C/S架构的自动化来说,B/S有着其无法忽视的诸多优势,从行业发展趋、研发模式特点、测试工具支持,其整体的完整生态已经远远超过了C/S架构方面的测试价值。
Selenium是当下最流行的web自动化测试框架,支持各种Java、Python等语言,这里,我们选择Python语言来进行封装。既然选择了python这门语言来实现对selenium的封装,那我们就需要使用Python的面向对象编程的理念来对selenium进行封装。就字面意思来理解的话,就像是把各种物品放入一个箱子内,日后需要使用的话就必须从这个箱子里拿才可以获取那个放入的物品。而这个比喻内的箱子就是python内的类,而各类物品则是我们自己根据需要自定义的各种属性和数据、方法,后续需要使用这些属性、数据、方法时,只要引入对应的类并实例化即可。
浏览器操作封装
我们就先从最基本的浏览器操作开始,这里会遵循一些简单的日常业务操作进行介绍,并且对类内的方法进行拆解,逐一介绍。
我们定义的类名为:BrowserDriver,构造函数传入browser。
class BrowserDriver:
def __init__(self, browser):
self.driver = self.open_browser(browser)
- 打开浏览器
def open_browser(self, browser):
if browser == 'chrome':
options = webdriver.ChromeOptions()
exclude = ['enable-automation']
options.add_experimental_option('excludeSwitches', exclude)
driver = webdriver.Chrome(chrome_options=options)
elif browser == 'firefox':
profile = webdriver.FirefoxProfile()
profile.set_preference('browser.download.dir', 'E:\FireFox_DL\\')
profile.set_preference('browser.download.folderList', 2)
profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'application/zip')
driver = webdriver.Firefox(firefox_profile=profile)
else:
driver = webdriver.Edge()
return driver
注:ChromeOptions()这个方法是chrome浏览器的参数对象,用来配置浏览器启动是的一些参数与属性,这里添加的是浏览器启动后不显示“正受到自动测试软件的控制”的提示,用法比较简单,add_experimental_option这边是添加试验性质的参数,另外比较常用的还有add_argument,add_extension(添加启动项、添加扩展)等方法。
注:Mac系统还可以加上Safari浏览器的参数
- 访问地址
封装的功能比较简单的,这里检查URL内是否含有http,可根据自己的需求将判断逻辑这块加强,将错误之后抛异常的动作实现成自动添加http或https至url的开头处等都可。
def get_url(self, url):
if self.driver != None:
sleep(1)
if 'http' in url:
self.driver.get(url)
else:
session.add(err_message)
session.commit()
else:
session.add(fail_message)
session.commit()
- 浏览器窗口操作
窗口操作也是比较常用的基础功能之一,以下将基本的最大化、最小化、前进、后退、刷新、设定尺寸大小封装起来。之后会判断可变参数的长度,根据传入的长度不同进行对应的窗口操作。
def browser_handle(self, *args):
param = len(args)
if param == 1:
if args[0] == 'max':
self.driver.maximize_window()
elif args[0] == 'min':
self.driver.minimize_window()
elif args[0] == 'forward':
self.driver.forward()
elif args[0] == 'back':
self.driver.back()
else:
self.driver.refresh()
elif param == 2:
self.driver.set_window_size(args[0], args[1])
else:
session.add(fail_message)
session.commit()
sleep(2)
- 切换窗口
另一个日常较为频繁的业务操作就是切换窗口,也就是我们的标签页,我们可以使用遍历的方式获得一个当前所有的窗口列表,通过传递默认参数title来进行当前窗口的切换,直到匹配到与title相同的窗口。
def switch_windows(self, title=None):
windows_list = self.driver.window_handles
current_window = self.driver.current_window_handle
for i in windows_list:
if i != current_window:
time.sleep(1)
self.driver.switch_to.window(i)
if self.assert_title(title):
break