概述
一、po模型介绍
1、介绍:在自动化中,Selenium自动化测试中有一个名字经常被提及PageObject(思想与面向对象的特征相 同),通常PO模型可以大大提高测试用例的维护效率。
优点:重用,业务和对象分离,代码结构清晰,方便代码维护
2、核心要素:
1).
在
PO
模式中抽离封装集成一个
BasePage
类,该基类应该拥有一个只实现
webdriver
实例的属性
2).
每一个
page
都继承
BasePage
,通过
driver
来管理本
page
中元素,将
page
中的操作封装成一个个方法
3).TestCase
继承
unittest.Testcase
类,并依赖
page
类,从而实现相应的测试步骤
3、代码分析:
a、不同的运行脚本环境,游览器不同:驱动
webdriver.Firefox()
可以剥离
b、请求地址的变化(
生产环境和测试环境
):url = http://www.baidu.com
可以剥离
c、操作元素时,常常要等待元素加载完成方可进行操作:可以把
webdriver
提供的
find_element*
方法 封装,在元素操作前,先判断元素是否可以操作
d、实际测试场景中,可能有多个测试场景,如果每个测试场景都需要维护
url,
游览器驱动
,
元素定位等
,
效 率会非常低
因此基于以上分析,是否可以设计一个所有测试界面(
selenium
本身是
B/S
系统开展测试)的基类,来 维护公共的方法,此处定义名字为BasePage.py,
用于存放页面公共方法及
webdriver
原有方法二次封装
二、po实现
1、创建baseDemo包(基类、基础api,重用性比较高),包内创建BasePage类
代码:
from selenium.webdriver.common.action_chains import ActionChains #鼠标操作
class BasePage():
# 实例化BasePage类时,事先执行的__init__方法,该方法需要传递参数
def __init__(self,driver,url):
self.driver=driver
self.url=url
# 进入网址
def get(self):
self.driver.get(self.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])
# 用于断言
def get_title(self):
return self.driver.title
2、创建pageDemo包(业务、页面、登录、搜索),包内创建page类
代码:page1和page2
from pypo1.basepage.basepage import BasePage
from selenium.webdriver.common.by import By
class PageOne(BasePage):
def __init__(self,driver,url):
BasePage.__init__(self,driver,url)
# 进入百度
def open_baidu(self):
self.get()
# 输入搜索内容
def input_search_content(self, text):
self.send_text(text, By.ID, "kw")
# 点击按钮
def click_baidu_search(self):
self.left_click(By.ID, "su")
# 进入123
def open_hao(self):
self.left_click(By.XPATH, "//div[@id='1']/h3/a/em")
from pypo1.basepage.basepage import BasePage
from selenium.webdriver.common.by import By
class PageTwo(BasePage):
def __init__(self,driver,url):
BasePage.__init__(self,driver,url)
# 进入百度地图
def open_ditu(self):
self.left_click(By.CSS_SELECTOR,".js_bd > li:nth-child(6) > div:nth-child(1) > a:nth-child(1)")
3、创建测试类case(单元测试框架中执行的业务逻辑)
代码:
from pypo1.pages.page1 import PageOne
import unittest
from selenium import webdriver
from pypo1.pages.page2 import PageTwo
class Baidu(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.driver=webdriver.Firefox()
cls.driver.implicitly_wait(30)
# 测试第一个页面
def test_001(self):
url="https:www.baidu.com"
s=PageOne(self.driver,url)
s.open_baidu()
s.input_search_content("123")
s.click_baidu_search()
s.open_hao()
self.driver.switch_to.window(self.driver.window_handles[1])
# 测试第二个页面
def test_002(self):
url=""
t=PageTwo(self.driver,url)
t.open_ditu()
@classmethod
def tearDownClass(cls) -> None:
pass
# self.driver.quit()
if __name__ == '__main__':
unittest.main()
结果:
总结:
PO
设计模式中的
BasePage
基类对应案例中的
BasePage.py
文件
PO
模式中的
pages
中的案例显示
page1.py,page2.py
PO
模式设计中
TestCase
对应案例中的
Tbaidu.py
三、
PO
模式的优点
1:PO
提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变得更加清晰
2
:页面对象与用例分离,使得我们更好的复用对象
3
:可复用的页面方法代码会变得更加优化
4
:更加有效的命令方式使得我们更加清晰的知道方法所操作的
UI
元素
最后
以上就是任性棉花糖为你收集整理的关于web自动化的模型的全部内容,希望文章能够帮你解决关于web自动化的模型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复