• page Object使用


    使用 page object 模式的好处:

    • 创建可跨多个测试用例共享的可重用代码
    • 减少重复代码的数量
    • 如果用户界面发生变化,修复只需要在一个地方进行更改

    官网示例代码

    PythonOrgSearch调用MainPage(main_page = page.MainPage(self.driver))将driver传到class  BasePage(object)并初始化。
    接着判断python.org是否被正常加载(assert main_page.is_title_matches(), "python.org title doesn't match.")
    接着调用(main_page.search_text_element = "pycon")传入搜索关键字‘pycon’。并调用(class SearchTextElement(BasePageElement):)传入搜索的id,进行搜索
    点击搜搜按钮,断言搜索结果是否为:No results found.
    PythonOrgSearch.py
    import unittest
    from selenium import webdriver
    import page
    
    class PythonOrgSearch(unittest.TestCase):
        """A sample test class to show how page object works"""
    
        def setUp(self):
            self.driver = webdriver.Chrome()
            self.driver.get("http://www.python.org")
    
        def test_search_in_python_org(self):
            """
            测试python.org的搜索功能,搜索关键字“pycon”,然后验证结果是否显示。
           请注意,它不会在搜索结果页中查找任何特定文本。此测试验证结果不是空的。
            """
    
            #加载主页面
            main_page = page.MainPage(self.driver)
            #检查"Python"是否在title中
            assert main_page.is_title_matches(), "python.org title doesn't match."
            #设置搜索的文本"pycon"
            main_page.search_text_element = "pycon"
            main_page.click_go_button()
            search_results_page = page.SearchResultsPage(self.driver)
            #验证结果不为空
            assert search_results_page.is_results_found(), "No results found."
    
        def tearDown(self):
            self.driver.close()
    
    if __name__ == "__main__":
        unittest.main(verbosity=2)

    page.py

    from element import BasePageElement
    from locators import MainPageLocators
    
    class SearchTextElement(BasePageElement):
        """这个类是为了获得来自特定定位器的文本"""
        #这个是搜索框的定位器
        locator = 'q'
    
    
    class BasePage(object):
        """Base class to initialize the base page that will be called from all pages"""
    
        def __init__(self, driver):
            self.driver = driver
    
    
    class MainPage(BasePage):
        """Home page action methods come here. I.e. Python.org"""
    
        #声明一个变量,将包含检测到的文本
        search_text_element = SearchTextElement()
    
        def is_title_matches(self):
            """验证Python是否在页面标题中显示"""
            return "Python" in self.driver.title
    
        def click_go_button(self):
            """点击搜索按钮"""
            element = self.driver.find_element(*MainPageLocators.GO_BUTTON)
            element.click()
    
    
    class SearchResultsPage(BasePage):
        """搜索结果页面"""
    
        def is_results_found(self):
            # 也许会在特定的页面展示元素不存在‘No results found.’
            return "No results found." not in self.driver.page_source

    element.py

    from selenium.webdriver.support.ui import WebDriverWait
    
    
    class BasePageElement(object):
        """Base page class 是为了初始化每个页面的对象class."""
    
        def __set__(self, obj, value):
            """将文本设置为提供的值  'pycon'  并且,self.locator='q' 由调用者传递"""
            driver = obj.driver
            WebDriverWait(driver, 100).until(
                lambda driver: driver.find_element_by_name(self.locator))
            driver.find_element_by_name(self.locator).clear()
            driver.find_element_by_name(self.locator).send_keys(value)
    
        def __get__(self, obj, owner):
            """获取指定对象的值"""
            # self.locator=‘q’
            driver = obj.driver
            WebDriverWait(driver, 100).until(
                lambda driver: driver.find_element_by_name(self.locator))
            element = driver.find_element_by_name(self.locator)
            return element.get_attribute("value")

    locator.py

    from selenium.webdriver.common.by import By
    
    class MainPageLocators(object):
        """A class for main page locators. All main page locators should come here"""
        GO_BUTTON = (By.ID, 'submit')
    
    class SearchResultsPageLocators(object):
        """A class for search results locators. All search results locators should come here"""
        pass
  • 相关阅读:
    linux下程序运行时间的获取方法,
    网络通信过程(转&自己完善)
    关于找工作&毕设
    linux进程间通信(IPC)几种方式
    asp.net2.0新特性概述 之二
    vs2005新特性
    C#高级特性
    Asp.net2.0新特性 之三
    当前流行的网站设计风格(转贴)
    ASP.NET 2.0 新特性 之一
  • 原文地址:https://www.cnblogs.com/ychun/p/14382012.html
Copyright © 2020-2023  润新知