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 这个层面的能自己写就自己写。多留出时间学基础的东西

posted @ 2020-02-16 14:24  gupanpan  阅读(153)  评论(0)    收藏  举报