PageObject
认识 Page Object
当为 web 页面编写测试时,需要操作该 web 页面上的元素。然而,如果直接在测试代码中操作 web 页面上的元素,那么这样的代码是非常脆弱的,因为 UI 会经常变动。
Page 对象的一个基本经验法则是:凡是人能做的事,page 对象通过软件客户端都能做到。因此,他应当提供一个易于编程的接口,并隐藏窗口中底层的部件。当访问一个
文本框时,应该通过一个访问方法(Accessor Method) 实现字符串的获取和返回,复选框应当使用布尔值,按钮应当被表示为行为导向的方法名。page 对象应当把在 GUI 控件
上所有查询和操作数据的行为封装为方法
一个好的经验法则是:即使改变具体的元素,page 对象的接口也不应该发生改变
尽管该术语是 page 对象,但不意味着要针对每一个页面建立一个这样的 Page 对象。例如,页面上有重要意义的元素可以独立为一个 Page 对象。经验法则的目的是通过给
页面建模使其对应用程序的使用者变得有意义。
以百度搜索为例
1.创建 BasePage 类作为所有 Page 类的基类,在 BasePage 类中封装的方法,这些方法是我们在做自动化时经常用到的
import time class BasePage(): ''' 基础 Page 层, 封装一些常用方法 ''' def __init__(self, driver): self.driver = driver # 打开页面 def open(self, url=None): if url is None: self.driver.get(self.url) else: self.driver.get(url) # id 定位 def by_id(self, id_): return self. driver.find_element_by_id(id_) # name 定位 def by_name(self, name): return self.driver.find_element_by_name(name) # class 定位 def by_class(self, class_name): return self.driver.find_element_by_class_name(class_name) # xpath 定位 def by_xpath(self, xpath): return self.driver.find_element_by_xpath(xpath) # scc 定位 def by_css(self, css): return self.driver.find_element_by_css_selector(css) #获取 title def get_title(self): return self.driver.title # 获取页面 text, 仅使用xpath def get_text(self, xpath): return self.by_xpath(xpath).text # 执行 JavaScript 脚本 def js(self, script): self.driver.execute_script(script)
2.创建 BaiduPage 类继承 BasePage 类,该类定义 url 变量,供父类的 open() 方法使用,在 search_input() 和 search_button() 方法中使用了父类的 self.by_id() 方法来定位元素,比原生的 Selenium 方法简短了不少。
from base import BasePage class BaiduPage(BasePage): ''' 百度 Page 页面,百度页面封装操作到的元素 ''' url = "http://www.baidu.com" def search_input(self, search_key): self.by_id("kw").send_keys(search_key) def search_button(self): self.by_id("su").click()
3.在测试用例中使用 BaiduPage() 及其所继承的父类中的方法
import unittest from time import sleep from selenium import webdriver from baidu_page import BaiduPage class TestBaidu(unittest.TestCase): @classmethod def setUpClass(self): self.driver = webdriver.Firefox() @classmethod def tarDownClass(self): self.driver.quit() def test_baidu_search_case(self): page = BaiduPage(self.driver) page.open(BaiduPage.url) page.search_input("selenium") page.search_button() sleep(2) self.assertEqual(page.get_title, "selenium_百度搜索") if __name__ == '__main__': unittest.main()
有一种开源的 Page Object 测试库 叫 poium
pip install poium
相当于我们之前写的 BasePage
from poium import Page, PageElement class BaiduPage(Page): ''' 百度 Page 层,百度页面封装操作到的元素 ''' search_input = PageElement(id='kw') search_button = PageElement(id='su)
大致就是这样的
我自己不用的,也不建议用,框架类的东西学几个重要的就行了,学习别人的思维方式,Page Object 这个层面的能自己写就自己写。多留出时间学基础的东西
浙公网安备 33010602011771号