1.为什么要使用pageObject设计模式
Page Object 模式是selenium自动化测试项目开发最佳测试设计模式,主要体现在对界面交互细节的封装,这样使得测试案例更加注重页面而不是界面细节。从而提高测试用例的可读性;减少了代码的重复;提高测试用例的可维护性,特别是针对UI频繁变动的项目。
2.设计思想
Page Object模式主要是将每个页面设计为一个类class,这个类包含页面中需要测试的元素(按钮、输入框、URL、标题等)和实际操作方法。
3.如何使用:例如登录qq邮箱的web页面
3.1.定义页面基础类,用于所有页面的基础,封装所有测试页面的公共方法。
#coding=utf-8
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
def _open(self):
url = self.base_url
self.driver.get(url)
#切换到登录窗口的iframe
self.driver.switch_to.frame('login_frame')
#定义open方法,调用_open(进行打开)
def open(self):
self._open()
#定位方法封装
def find_element(self,*loc):
return self.driver.find_element(*loc)
Python方法中入参是元组时,需要加*。因为find_element()要转入很多不同的参数
3.2.定义页面具体功能类,每个测试页面元素定位和操作方法都在这层定义,若UI发生改变只需要在该层修改对象属性即可。
#创建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()
主要对登录页面元素进行封装,继承基础类:BasePage
3.3.在主程序中调用(使用unittest)
#coding=utf-8
from selenium import webdriver
from pageObject import LoginPage
import unittest
from time import sleep
class Test_login_model(unittest.TestCase):
def setUp(self) :
print("测试开始了...")
#驱动设置
self.driver = webdriver.Firefox()
#实例化
self.login_page = LoginPage(self.driver)
# 将单个元素操作组成一个完整的动作,包含打开浏览器、输入用户名、密码、点击登录按钮等
def user_login(self, username, password):
self.login_page.open()
self.login_page.type_username(username)
self.login_page.type_password(password)
self.login_page.type_login()
#用例1:登录成功
def test_login1_success(self):
self.user_login('xx','xxxx')
#用例2:用户名为空
def test_login2_username_null(self):
self.user_login('', 'xxxx')
#用例3:
def test_login3_password_null(self):
self.user_login('xx', '.')
@unittest.skip("不需要运行")
# 用例4:
def test_login4_null(self):
self.user_login('', '.')
# 用例5:
def test_login5_password_error(self):
self.user_login('xx', 'xxxxxxxxxxxxxxxx')
#结束测试
def tearDown(self):
sleep(3)
self.driver.quit()
print("测试结束了...")
if __name__ == '__main__':
unittest.main()
编写unittest测试用例,必须test*格式
来源:CSDN
作者:一giao窝里giao
链接:https://blog.csdn.net/CjhLoveAndroid/article/details/103671035