Selenium关于Page Objects
介绍页面对象设计模式。一个页面对象表示在你测试的web页面用户交互的界面。
使用页面对象模式的有点:
- 创建可重用的代码可以在多个测试用例中使用
- 减少重复的代码量
- 如果用户界面改变,只需要修改一个地方
1.Test case
下面的测试用例是在百度中搜索关键字,并返回相应的结果
import unittest from selenium import webdriver import page class BaiduSearch(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() self.driver.get("http://www.baidu.com") def test_search_in_baidu(self): main_page = page.MainPage(self.driver) #断言标题关键字 assert main_page.is_title_matches(), "baidu title doesn't match." #设置搜索的关键字 main_page.search_text_element = "selenium" main_page.click_go_button() search_results_page = page.SearchResultsPage(self.driver) #断言结果页面不是空的 assert search_results_page.is_result_found(), "No result found." def tearDown(self): self.driver.close() if __name__ == "__main__": unittest.main()
2.Page object classes
页面对象模式将为每个web页面创建一个对象。按照这种方式分层测试代码和实现。
新建page.py,代码如下:
from element import BasePageElement from locators import MainPageLocators class SearchTextElement(BasePageElement): locator = 'kw' class BasePage(object): """被所有页面调用的页面初始化的基础类""" def __int__(self, driver): self.driver = driver class MainPage(BasePage): """主页面的方法""" search_text_element = searchTextElement() def is_title_match(self): return "selenium" in self.driver.title def click_go_button(self): elemnt = self.driver.find_element(*MainPageLocators.GO_BUTTON) element.click() class SearchsultsPage(BasePage): """搜索结果页面的方法""" def is_results_found(self): return "No results found." not in self.driver.page_source
3.Page elements
新建element.py 代码如下:
from selenium.webdriver.support.ui import WebDriverWait class BasePageElement(object): def __set__(self, obj, vaule): driver = obj.driver WebDriverWait(driver, 100).until( lambda driver: driver.find_element_by_name(self.locator)) driver.find_element_by_name(self.locator).send_keys(value) def __get__(self, obj, owner): 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")
4.Locators
将定位到的元素分离,同一个页面的定位的元素属于同一个类
新建locators.py 代码如下:
from selenium.webdriver.common.by import By class MainPageLocators(object): """所有主页面定位到的元素""" GO_BUTTON = (By.ID, 'su') class SearchResultsPageLoactors(object): """所有搜索结果定位的元素""" pass