Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,通过对界面元素和功能模块的封装减少冗余代码,同时在后期维护中,若元素定位或功能模块发生变化,只需要调整页面元素或功能模块封装的代码,提高测试用例的可维护性。
案例:登录http://opsadmin.nj.com/accounts/login/?next=/navi/prolist/
### 定义一个基础类,用于页面对象的继承
# BasePage.py
# -*- coding:utf-8 -*-
import time
class Page():
'''页面基础类'''
# 初始化
def __init__(self, driver):
self.driver = driver
self.base_url = 'http://opsadmin.nj.com'
self.timeout = 10
# 打开不同的子页面
def _open(self, url):
url_ = self.base_url + url
print("The url is %s" % url_)
# self.driver.maximize_window()
self.driver.get(url_)
time.sleep(2)
assert self.driver.current_url == url_, 'Did not load on %s' % url_
def open(self):
self._open(self.url)
# 元素定位方法封装
def find_element(self, *loc):
return self.driver.find_element(*loc)
# 创建一个基础类Page,在初始化方法__init__()中定义驱动(driver),基本的URL(base_url)和超时时间(timeout)等
#定义Open()方法用于打开URL网站,关于URL地址的断言方法,则交由assert实现,而find_element()方法用于元素定位
### 网站登录页面模型
# LoginPage.py
# -*- coding:utf-8 -*-
from BashPage import *
from selenium.webdriver.common.by import By
class LoginPage(Page):
url = "/accounts/login/?next=/tests/versync/"
# 定位器
username_loc = (By.ID, 'id_username')
password_loc = (By.ID, 'id_password')
submit_loc = (By.XPATH, '//*[@id="form"]/div[2]/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).clear()
self.find_element(*self.password_loc).send_keys(password)
# 登录按钮元素
def type_submit(self):
self.find_element(*self.submit_loc).click()
# 登录功能模块封装
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_submit()
# Page类中定义的这些方法都是页面操作的基本方法。上面根据再登录页面的特点再创建LoginPage类并继承Page类
# LoginPage类中主要对登录页面上的元素进行封装,使其成为更具体的操作方法,例如用户名,密码和登录按钮都被封装成了方法
# test_user_login()函数将单个的元素操作组成一个完整的动作,而这个动作包含了打开浏览器,输入用户名\密码,点击登录等单步操作。在使用该函数时需要将driver、username、password等信息作为函数的入参,这样该函数具有很强的可重用性
# login_test.py
# -*- coding:utf-8 -*-
from LoginPage import *
from selenium import webdriver
driver = webdriver.Chrome()
username = "admin"
password = "12345678"
test_user_login(driver, username, password)
time.sleep(3)
driver.quit()
# login_test更接近用户的操作行为。对用户来说,要进行网站的登录,需要关心的就是通过哪个浏览器打开网站网址,登录的用户名和密码是什么。