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的核心要素:
案例基础案例
前面基础场景选取的是baidu搜索页面(baidu页面简单,不需要搭建测试环境)baidu.py

  1. from selenium import webdriver
  2. from time import sleep

  3. driver = webdriver.Firefox()
  4. driver.get("http://www.baidu.com")

  5. driver.find_element_by_xpath("//input[@id='kw']").send_keys("Bela")
  6. driver.find_element_by_xpath("//input[@id='su']").click()
  7. sleep(5)
  8. driver.quit()
复制代码


将上面的脚本放在baidu.py文件中。
分析
通过对baidu.py脚本的分析,可以提取到:
===================================================


  1. from selenium.webdriver.support.wait import WebDriverWait
  2. from selenium import  webdriver
  3. from selenium.webdriver.support import expected_conditions as EC

  4. class BasePage(object):
  5.     """
  6.     BasePage封装所有页面都公用的方法,例如driver, Find_Element等
  7.     """
  8.     # 实例化BasePage类时,最先执行的就是__init__方法,该方法的入参,其实就是BasePage类的入参。
  9.     # __init__方法不能有返回值,只能返回None

  10.     def __init__(self,selenium_driver,base_url):
  11.         self.driver = selenium_driver
  12.         self.base_url = base_url
  13.         # self.pagetitle = pagetitle

  14.     def on_page(self,pagetitle):
  15.         return pagetitle in self.driver.title

  16.     def _open(self,url):
  17.         self.driver.get(url)
  18.         self.driver.maximize_window()

  19.     def open(self):
  20.         self._open(self.base_url,self.pagetitle)

  21.     def find_element(self,*loc):  #*loc任意数量的位置参数(带单个星号参数)
  22.         # return self.driver.find_element(*loc)
  23.         try:
  24.             WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc))
  25.             return self.driver.find_element(*loc)
  26.         except:

  27.             print("%s 页面未能找到 %s 元素"%(self,loc))

  28.     def script(self,src):
  29.         self.driver.excute_script(src)

  30.     def send_keys(self, loc, vaule, clear_first=True, click_first=True):
  31.         try:
  32.             loc = getattr(self, "_%s" % loc)  # getattr相当于实现self.loc
  33.             if click_first:
  34.                 self.find_element(*loc).click()
  35.             if clear_first:
  36.                 self.find_element(*loc).clear()
  37.                 self.find_element(*loc).send_keys(vaule)
  38.         except AttributeError:
  39.             print("%s 页面中未能找到 %s 元素" % (self, loc))
复制代码

测试脚本的优化
BasePage.py提取完毕,其中设计了BasePage类,对一些webdriver的方法进行了二次封装。
baidu.py基于BasePage.py进行优化(充分体现PO的设计思想,封装、继承)
  1. # 基本测试场景
  2. # from selenium import  webdriver
  3. # from time import sleep
  4. #
  5. # driver = webdriver.Firefox()
  6. # driver.get("http://www.baidu.com")
  7. #
  8. # driver.find_element_by_xpath("//input[@id='kw']").send_keys("Bela") #输入框
  9. # driver.find_element_by_xpath("//input[@id='su']").click() #百度一下按钮
  10. #
  11. # sleep(3)
  12. # driver.quit()

  13. # 优化后的测试场景
  14. from selenium.webdriver.common.by import By
  15. from PODemo.BasePage import BasePage  #假设baidu.py、BasePage.py均在PODemo.BasePage目录下
  16. from selenium import webdriver

  17. class SearchPage(BasePage):

  18.     # 定位元素
  19.     search_loc = (By.ID,"kw")
  20.     btn_loc = (By.ID,"su")

  21.     def open(self):
  22.         self._open(self.base_url)

  23.     def search_content(self,content):
  24.         BaiduContent = self.find_element(*self.search_loc)
  25.         BaiduContent.send_keys(content)

  26.     def btn_click(self):
  27.         BaiduBtn = self.find_element(*self.btn_loc)
  28.         BaiduBtn.click()
复制代码

PageObject总结
[attach]119040[/attach]







欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2