Page Object模式是使用Selenium的广大同行最为公认的一种设计模式。在设计测试时,把元素和方法按照页面抽象出来,分离成必定的对象,而后再进行组织。web
Page Object模式,建立一个对象来对应页面的一个应用。故咱们能够为每一个页面定义一个类,并为每一个页面的属性和操做构建模型。体如今对界面交互细节的封装,测试在更上层使用页面对象,在底层的属性或者操做的更改不会中断测试。减小代码重复,提升测试代码的可读性和可维护性。设计模式
下面将以登陆qq邮箱简单为例,经过Page Object设计模式来实现。代码以下:浏览器
from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep #建立基础类 class BasePage(object): #初始化 def __init__(self, driver): self.base_url = 'https://mail.qq.com/' self.driver = driver self.timeout = 30 #定义打开登陆页面方法 def _open(self): url = self.base_url self.driver.get(url) self.driver.switch_to.frame('login_frame') #切换到登陆窗口的iframe
#定义定义open方法,调用_open()进行打开 def open(self): self._open() #定位方法封装 def find_element(self,*loc): return self.driver.find_element(*loc) #建立LoginPage类 class LoginPage(BasePage): username_loc = (By.ID, "u") password_loc = (By.ID, "p") login_loc = (By.ID, "login_button") #输入用户名 def type_username(self,username): self.find_element(*self.username_loc).clear() self.find_element(*self.username_loc).send_keys(username) #输入密码 def type_password(self,password): self.find_element(*self.password_loc).send_keys(password) #点击登陆 def type_login(self): self.find_element(*self.login_loc).click() #建立test_user_login()函数 def test_user_login(driver, username, password): """测试用户名/密码是否能够登陆""" login_page = LoginPage(driver) login_page.open() login_page.type_username(username) login_page.type_password(password) login_page.type_login() #建立main()函数 def main(): driver = webdriver.Edge() username = '3494xxxxx' #qq号码 password = 'kemixxxx' #qq密码 test_user_login(driver, username, password) sleep(3) driver.quit() if __name__ == '__main__': main()
虽然该实现方法看上去复杂多了,但其中的设计好处是不一样层关心不一样的问题。页面对象只关心元素的定位,测试用例只关心测试数据。函数
下面将对上面代码加以说明,首先建立一个基础BasePage类,在初始化方法__init__()中定义驱动(driver),基本的URL(base_url)和超时时间(timeout)等。定义open()方法用于打开URL,这里是由_open()方法来实现,而find_element()方法用于元素定位。测试
接下来的BasePage类中定义的方法都是页面操做的基本方法。LoginPage类并继承BasePage类,这也是Page Object设计模式中最重要的对象层。LoginPage类中主要对登陆页面上元素进行封装,使其成为具体的操做方法。如对用户名、密码框和登陆按钮都封装成方法。ui
而后定义test_user_login()函数将单个元素操做组成一个完整的动做,包含打开浏览器、输入用户名、密码并点击登陆按钮等。使用时将driver、username、password做为函数的入参,这样的函数具备很强的可重用性。url
最后使用main()函数进行用户操做行为,如今只关心用哪一个浏览器、登陆的用户名和密码是什么,至少输入框、按钮是如何定位的,则不关心。即实现了不一样层关心不一样问题。若是有多个用户名/密码须要登陆,那么只用改写main()方法的参数便可。spa