一、介绍
在自动化中,Selenium自动化测试中有一个PageObject(思想与面向对象的特征相同),通常PO模型可以大大提高测试用例的维护效率
二、优点
- 页面对象与用例分离,使得我们更好的复用对象
- 可复用页面的方法代码会变得更加优化
- PO提供了一种业务流程与页面元素 *** 作分离的模式,这使得测试代码变得更加清晰
- 更加有效的命令方式使得我们更加清晰的知道方法所 *** 作的UI元素,便于代码维护
三、PageObject设计模式
- 在PO模式中抽离封装集成一个BasePage类,该基类应该拥有一个只实现webdriver实例的属性,以及selenium常用方法
- 每一个page都继承BasePage,通过driver来管理本page中元素,一个page代表一个页面中的相关 *** 作
- TestCase继承unittest.Testcase类,并依赖page类,将page中的 *** 作封装成一个个方法
四、PO实现(代码展示,以12306查询余票为例)
1.基类:
#鼠标 *** 作
from selenium.webdriver.common.action_chains import ActionChains
class BasePageClass():
'''BasePage封装所有界面都公用的方法。例如driver,find_element等'''
'''实例化BasePage类时,事先执行的__init__方法,该方法需要传递参数'''
def __init__(self,driver):
self.driver = driver
# 进入网址
def get(self,url):
self.driver.get(url)
#元素定位,替代八大定位
def get_element(self,*locator):
return self.driver.find_element(*locator)
#点击
def left_click(self,*locator):
ActionChains(self.driver).click(self.get_element(*locator)).perform()
#输入
def send_text(self,text,*locator):
self.driver.find_element(*locator).send_keys(text)
#清除
def clear_text(self,*locator):
self.driver.find_element(*locator).clear()
# 表单切换
def switch_iframe(self, *locator):
self.driver.switch_to.frame(self.driver.find_element(*locator))
# 窗口切换
def switch_window(self, n):
self.driver.switch_to.window(self.driver.window_handles[n])
2.页面:
#页面1
from BasePageDemo.BasePage import BasePageClass
from selenium.webdriver.common.by import By
#百度搜索12306官网
class BaiduSearchClass(BasePageClass):
#初始化驱动
def __init__(self,driver):
BasePageClass.__init__(self,driver)
#访问百度
def visit_baidu(self,url):
self.get(url)
#输入框输入
def input_text(self,text):
self.send_text(text,By.ID,"kw")
#鼠标左键点击百度一下按钮
def clickBaidu(self):
self.left_click(By.ID,"su")
#进入12306官网
def click12306(self):
self.left_click(By.XPATH,'//*[@id="3"]/h3/a[1]')
#多窗口跳转,切换句柄
def multiWindowJump(self,n):
self.switch_window(n)
#页面2
from BasePageDemo.BasePage import BasePageClass
from selenium.webdriver.common.by import By
#输入地址查询余票
class RailwayQueryClass(BasePageClass):
#初始化驱动
def __init__(self,driver):
BasePageClass.__init__(self,driver)
#定位出发地
def clickStartPlace(self):
self.left_click(By.XPATH,'//*[@id="fromStationText"]')
def searchStartPalce(self,text):
self.send_text(text,By.XPATH,'//*[@id="fromStationText"]')
def chooseStartPlace(self):
self.left_click(By.XPATH,'//*[@id="citem_1"]/span[1]')
#定位到达地
def clickEndPlace(self):
self.left_click(By.XPATH,'//*[@id="toStationText"]')
def searchEndPalce(self,text):
self.send_text(text,By.XPATH,'//*[@id="toStationText"]')
def chooseEndPlace(self):
self.left_click(By.XPATH,'//*[@id="citem_1"]/span[1]')
#点击查询
def queryTicket(self):
self.left_click(By.XPATH,'//*[@id="search_one"]')
3.测试用例类:
from selenium import webdriver
from pages.baidu_page1 import BaiduSearchClass
from pages.railway_page2 import RailwayQueryClass
import unittest,time
class TestRailwayClass(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
#谷歌浏览器驱动
cls.driver=webdriver.Chrome("E:\PyCharm2021.3.3\pythonProject\selenium0425\Chrome\Application\chromedriver.exe")
#窗口最大化
cls.driver.maximize_window()
#隐式等待时间
cls.driver.implicitly_wait(30)
#页面1
def test001(self):
b=BaiduSearchClass(self.driver)
#访问百度
b.visit_baidu("https://www.baidu.com/")
#输入12306
b.input_text(12306)
time.sleep(2)
#点击搜索
b.clickBaidu()
#点击12306官网
b.click12306()
#切换句柄
b.multiWindowJump(1)
#页面2
def test002(self):
r=RailwayQueryClass(self.driver)
#定位出发地
r.clickStartPlace()
time.sleep(2)
r.searchStartPalce("徐州")
time.sleep(2)
r.chooseStartPlace()
time.sleep(2)
#定位到达地
r.clickEndPlace()
time.sleep(2)
r.searchEndPalce("宿州")
time.sleep(2)
r.chooseEndPlace()
time.sleep(2)
#查询
r.queryTicket()
@classmethod
def tearDownClass(cls) -> None:
time.sleep(5)
cls.driver.quit()
if __name__ == '__main__':
unittest.main()
4.unittest生成测试报告:
from common.HTMLTestRunner import HTMLTestRunner
from testCase.testRailway import TestRailwayClass
import unittest
class RailwayHtmlClass():
def htmlMethod(self):
#创建测试套件
suite = unittest.TestSuite()
#创建列表储存测试用例名
testList = ["test001","test002"]
for test_i in testList:
suite.addTest(TestRailwayClass(test_i))
#生成测试报告,以二进制形式写入
with open("RailwayReport.html", "wb") as obj:
HTMLTestRunner(
stream=obj,
title="Railway单元测试",
description="测试一期",
verbosity=2
).run(suite) # 执行测试套件
#实例化调用方法
r=RailwayHtmlClass()
r.htmlMethod()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)