Page Object Model (Selenium + Python)(三)
2017-04-19 14:41
831 查看
基于对前边几篇文章的参考,自己根据系统需求写了一个pageobject的框架。主要树形结构如下图:
以下是个别代码块:
1.base page模块
该parent页面主要每个页面都可能用到的方法,以便后面页面的继承(有的方法没写完整,用的时候可以自行添加)
2.login page
该登录页面继承于base page,主要写登录页面的属性及控件(具体根据自己系统登录页面上的属性、button等)
3.base element
该页面主要写table,下拉列表,输入框等控件的基类,以便页面的控件的继承(上面登录页面的输入框就继承于下面代码的BaseTextElement类)
,如需下载整体代码,地址:http://download.csdn.net/detail/lb245557472/9819007
参考:https://pragprog.com/magazines/2010-08/page-objects-in-python
以下是个别代码块:
1.base page模块
该parent页面主要每个页面都可能用到的方法,以便后面页面的继承(有的方法没写完整,用的时候可以自行添加)
# _*_ coding=utf-8 _*_ from abc import abstractmethod from pageobject.log.logger import Logging import time from selenium.webdriver.common.action_chains import ActionChains class BasePage(object): base_url = "XXXXX" def __init__(self, driver): if self.base_url[-1] != '/': self.base_url += '/' # self._validate_page(driver) self.driver = driver self.log_obj = Logging() @abstractmethod def _validate_page(self, driver): return def open(self, url): url = self.base_url + url self.driver.get(url) def get_xpath(self, xpath): "return the DOM element of the xpath or the None object if the element is not found" def click_element(self, locator, is_button=True): "click the button supplied" if is_button: self.driver.find_element(*locator).click() else: f = self.driver.find_element(*locator) ActionChains(self.driver).click(f).perform() def write(self, msg, level='error'): self.log_obj.write(msg, level) def set_text(self, locator, values): try: text_field = self.driver.find_element(*locator) text_field.clear() text_field.send_keys(values) except Exception as msg: self.write(msg) def wait(self, wait_seconds=5): "performs wait for time provided" time.sleep(wait_seconds) class InvalidPageException(Exception): pass
2.login page
该登录页面继承于base page,主要写登录页面的属性及控件(具体根据自己系统登录页面上的属性、button等)
# _*_ coding=utf-8 _*_ from selenium.webdriver.support.ui import WebDriverWait from base_page import BasePage from pageobject.parameter.locator_element import login_locators from base_element import BaseTextElement class UsernameElement(BaseTextElement): def __init__(self): self.locator = login_locators["login.username"] class PasswordElement(BaseTextElement): def __init__(self): self.locator = login_locators["login.password"] class LoginPage(BasePage): username = UsernameElement() password = PasswordElement() def __init__(self, driver): BasePage.__init__(self, driver) self.open(login_locators.get("login.url")) def submit(self): "submit the login form" self.click_element(login_locators.get("login.submit")) @property def register(self): "jump to register page" self.click_element(login_locators["login.register"]) from register_page import RegisterPage return RegisterPage(self.driver)
3.base element
该页面主要写table,下拉列表,输入框等控件的基类,以便页面的控件的继承(上面登录页面的输入框就继承于下面代码的BaseTextElement类)
# _*_ coding=utf-8 _*_ from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.action_chains import ActionChains class BaseTextElement(object): """Base page class that is initialized on every page object class.""" def __set__(self, obj, value): """Sets the text to the value supplied""" dr = obj.driver WebDriverWait(dr, 100).until( lambda driver: driver.find_element(*self.locator)) dr.find_element(*self.locator).clear() dr.find_element(*self.locator).send_keys(value) def __delete__(self, obj): pass def __get__(self, obj, owner): """Gets the text of the specified object""" pass class BaseDropDownMenu(object): """Base DropDownMenu class that is initialized on every page object class.""" def __set__(self, obj, value): dr = obj.driver # element = dr.find_element(*self.btn_locator) # ActionChains(dr).click(element).perform() dr.find_element(*self.btn_locator).click() ul_element = dr.find_element(*self.ul_locator) if ul_element.tag_name.lower() != "select": # dr.find_element_by_link_text(u"%s" % value).click() dr.find_element_by_xpath(self.ul_locator[1] + "/li[{0}]".format(value)).click() else: try: dr.find_element(*self.ul_locator).click() except Exception: dr.find_element(*self.btn_locator).click() dr.find_element(*self.ul_locator).click() dr.find_element_by_css_selector("option[value=\"%s\"]" % value).click() class BaseTableElement(object): """Base table class that is initialized on every page object class.""" @property def column(self): column = len(self.driver.find_elements(*self.column_locator)) return column @property def row(self): row = len(self.driver.find_elements(*self.row_locator)) return row def get_element(self, *row_column): try: element = self.driver.find_element_by_xpath(self.tbody_locator + "/tr[{0}]/td[{1}]".format(*row_column)) return element except Exception as msg: print msg def get_cell_text(self, *value): # locator = "//*[@id=\"wrapper\"]/div/aside[2]/section/div/div/div/div/div/div/div/section/div[2]/table/tbody" if self.row: text = self.get_element(*value).text else: text = "Nothing" return text def get_x_column_all_cell_text(self, column): """get all value about some column and row-column , such as {value:(1,2)}""" text_row = {} if self.row: for i in range(1, self.row+1): temp = self.get_cell_text(i, column) text_row[temp] = i else: text_row = {} return text_row4.以下就不再赘述相关的代码块了,有什么不明白的地方可以讨论下
,如需下载整体代码,地址:http://download.csdn.net/detail/lb245557472/9819007
参考:https://pragprog.com/magazines/2010-08/page-objects-in-python
相关文章推荐
- Selenium的PO模式(Page Object Model)[python版]
- Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)
- Page Object Model (Selenium, Python)(一)
- Python+Selenium框架设计--- Page Object Model
- Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)
- Page Object Model (Selenium, Python)
- Selenium的PO模式(Page Object Model)[python版]
- Selenium(Python)PageObject页面对象
- Page Object Model (POM) & Page Factory in Selenium: Ultimate Guide
- Selenium Page Object Model-FindAll annotation
- Selenium+Python :WebDriver设计模式( Page Object )
- selenium page object model
- Python3-Selenium3使用PO设计模式(Page Object)实现简单的页面登录操作
- Selenium Page object Pattern usage
- Python+Selenium中级篇之9-把截图类方法封装到前面的BasePage.py
- selenium+java+testNG+pageObject深入理解自动化测试框架
- Selenium自动化Page模式(Python)
- selenium+java+testNG+pageObject深入理解自动化测试框架
- Selenium PageObject实例
- selenium page object & Page Factory