51Testing软件测试论坛
标题: selenium自动化测试框架之PO设计模式 [打印本页]
作者: 测试积点老人 时间: 2018-10-23 14:52
标题: selenium自动化测试框架之PO设计模式
本帖最后由 测试积点老人 于 2018-10-23 15:08 编辑
[attach]119045[/attach]
面向对象的特性:封装、继承、多态。在自动化中一样适用,Selenium自动化测试中有一个名字常常被提及PageObject(思想与面向对象的特性相同),通过PO模式可以大大提高测试用例的维护效率。
##传统测试脚本的弊端
PageObject设计模式[attach]119039[/attach]
PO的核心要素:
- 在PO模式中抽象封装成一个BasePage类,该基类应该拥有一个只实现webdriver实例的属性。
- 每个一个page都继承BasePage,通过driver来管理本page中元素,将page中的操作封装成一个个的方法。
- TestCase继承unittest.Testcase类,并且依赖page类,从而实现相应的测试步骤。
案例基础案例前面基础场景选取的是baidu搜索页面(baidu页面简单,不需要搭建测试环境)baidu.py
- from selenium import webdriver
- from time import sleep
- driver = webdriver.Firefox()
- driver.get("http://www.baidu.com")
- driver.find_element_by_xpath("//input[@id='kw']").send_keys("Bela")
- driver.find_element_by_xpath("//input[@id='su']").click()
- sleep(5)
- driver.quit()
复制代码
将上面的脚本放在baidu.py文件中。
分析通过对baidu.py脚本的分析,可以提取到:
- 不同的运行脚本环境,浏览器不同:驱动webdriver.Firefox()可以剥离,
- 请求地址的变化(生产环境与测试环境):url==http://www.baidu.com可以剥离
- 操作元素时,常常需要等待元素加载完毕后方可进行操作:是否可以把webdriver提供的findelement* 方法封装下,才操作元素前,先判断元素的是否可操作。
===================================================
- from selenium.webdriver.support.wait import WebDriverWait
- from selenium import webdriver
- from selenium.webdriver.support import expected_conditions as EC
- class BasePage(object):
- """
- BasePage封装所有页面都公用的方法,例如driver, Find_Element等
- """
- # 实例化BasePage类时,最先执行的就是__init__方法,该方法的入参,其实就是BasePage类的入参。
- # __init__方法不能有返回值,只能返回None
- def __init__(self,selenium_driver,base_url):
- self.driver = selenium_driver
- self.base_url = base_url
- # self.pagetitle = pagetitle
- def on_page(self,pagetitle):
- return pagetitle in self.driver.title
- def _open(self,url):
- self.driver.get(url)
- self.driver.maximize_window()
- def open(self):
- self._open(self.base_url,self.pagetitle)
- def find_element(self,*loc): #*loc任意数量的位置参数(带单个星号参数)
- # return self.driver.find_element(*loc)
- try:
- WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc))
- return self.driver.find_element(*loc)
- except:
- print("%s 页面未能找到 %s 元素"%(self,loc))
- def script(self,src):
- self.driver.excute_script(src)
- def send_keys(self, loc, vaule, clear_first=True, click_first=True):
- try:
- loc = getattr(self, "_%s" % loc) # getattr相当于实现self.loc
- if click_first:
- self.find_element(*loc).click()
- if clear_first:
- self.find_element(*loc).clear()
- self.find_element(*loc).send_keys(vaule)
- except AttributeError:
- print("%s 页面中未能找到 %s 元素" % (self, loc))
复制代码
测试脚本的优化BasePage.py提取完毕,其中设计了BasePage类,对一些webdriver的方法进行了二次封装。
baidu.py基于BasePage.py进行优化(充分体现PO的设计思想,封装、继承)- # 基本测试场景
- # from selenium import webdriver
- # from time import sleep
- #
- # driver = webdriver.Firefox()
- # driver.get("http://www.baidu.com")
- #
- # driver.find_element_by_xpath("//input[@id='kw']").send_keys("Bela") #输入框
- # driver.find_element_by_xpath("//input[@id='su']").click() #百度一下按钮
- #
- # sleep(3)
- # driver.quit()
- # 优化后的测试场景
- from selenium.webdriver.common.by import By
- from PODemo.BasePage import BasePage #假设baidu.py、BasePage.py均在PODemo.BasePage目录下
- from selenium import webdriver
- class SearchPage(BasePage):
- # 定位元素
- search_loc = (By.ID,"kw")
- btn_loc = (By.ID,"su")
- def open(self):
- self._open(self.base_url)
- def search_content(self,content):
- BaiduContent = self.find_element(*self.search_loc)
- BaiduContent.send_keys(content)
- def btn_click(self):
- BaiduBtn = self.find_element(*self.btn_loc)
- BaiduBtn.click()
复制代码
PageObject总结
[attach]119040[/attach]
- PO设计模式中的BasePage基类对应案例中的BasePage.py文件。
- PO模式中的page1或pageN对应案例中的Search.py
- PO设计模式中TestCase对应案例中的TestCase.py
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) |
Powered by Discuz! X3.2 |