IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> PO模型-PageObject -> 正文阅读

[开发测试]PO模型-PageObject

目录

一、PO模型的介绍

二、PageObject设计模式

三、PO的核心要素

四、非PO实现

代码展示:

代码结构分析:

五、PO实现

1、实现BasePage

2、实现SearchPage

3、实现TestCase

六、组织代码

七、总结

八、PO模式的优点

九、多个page(界面)的操作

1、提供一个basepage类

2、多个page(界面操作)

3、单元测试

4、生成测试报告

5、测试报告代码展示


一、PO模型的介绍

在自动化中,selenium自动化测试中有一个名字经常被提及PageObject(统称为PO模型,思想与面向对象的特性相同),通常PO模型可以大大提高测试用例的维护效率。

优点:重用,业务和对象分离,代码结构清晰,方便代码维护

二、PageObject设计模式

三、PO的核心要素

1、在PO模式中抽离封装集成一个BasePage类,该基类应该拥有一个只实现webdriver实例的属性

2、每一个page都继承BasePage,通过driver来管理本page中元素,将page中的操作封装成一个个方法

3、TestCase继承unittest.Testcase类,并依赖page类,从而实现相应的测试步骤

四、非PO实现

代码展示:

from selenium import webdriver

from time import sleep

driver = webdriver.Firefox()

driver.get("http://www.baidu.com")

driver.find_element_by_id("kw").send_keys("jack")

sleep(1)

driver.find_element_by_id("su").click()

sleep(2)

driver.quit()

代码结构分析:

1、不同的运行脚本环境,游览器不同:驱动webdriver.Firefox()可以剥离

2、请求地址的变化(生产环境和测试环境):url = http://www.baidu.com可以剥离

3、操作元素时,常常要等待元素加载完成方可进行操作:可以把webdriver提供的find_element*方法封 装,在元素操作前,先判断元素是否可以操作

4、实际测试场景中,可能有多个测试场景,如果每个测试场景都需要维护url,游览器驱动,元素定位等,效 率会非常低

5、因此基于以上分析,是否可以设计一个所有测试界面(selenium本身是B/S系统开展测试)的基类,来维护公共的方法,此处定义名字为BasePage.py,用于存放页面公共方法及? ? ? ? ? ? webdriver原有方法二次封装等

五、PO实现

1、实现BasePage

代码实现展示:

from selenium import webdriver

from selenium.webdriver.common.action_chains import ActionChains #鼠标操作

class BasePage():

'''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、实现SearchPage

代码实现展示:

'''
实现步骤:(1)继承basepage,(2)元素传参,(3)调取方法
'''

from selenium.webdriver.common.by import By

from pomodel.Base.base_page import BasePage

class Search(BasePage):
    def __init__(self,driver):
        BasePage.__init__(self,driver)

#进入百度
def open_baidu(self,url):
self.get(url)

#输入搜索内容
def input_search_content(self,text):
self.send_text(text,By.ID,"kw")

#点击按钮
def click_baidu_search(self):
self.left_click(By.ID,"su")

3、实现TestCase

代码实现展示:

import unittest

from selenium import webdriver

from pomodel.Pages.search_pages import Search

class BaiBu(unittest.TestCase):

    def setUp(self) -> None:
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(10)

    def test_serach(self):
        url="http://www.baidu.com"

s = Search(self.driver)

s.open_baidu(url)

s.input_search_content("jack")

s.click_baidu_search()

def tearDown(self) -> None:
self.driver.quit()

if __name__ == '__main__':
unittest.main()

六、组织代码

七、总结

1、PO设计模式中的BasePage基类对应案例中的BasePage.py文件

2、PO模式中的pages中的案例显示Search.py

3、PO模式设计中TestCase对应案例中的TestCase.py

八、PO模式的优点

1、PO提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变得更加清晰

2、页面对象与用例分离,使得我们更好的复用对象

3、可复用的页面方法代码会变得更加优化

4、更加有效的命令方式使得我们更加清晰的知道方法所操作的UI元素

九、多个page(界面)的操作

1、提供一个basepage类

from selenium.webdriver.support.ui import WebDriverWait # 显示等待

from selenium.webdriver.support import expected_conditions as EC # 期望条件

from selenium import webdriver

from selenium.webdriver.common.action_chains import ActionChains #鼠标操作

class BasePage():
    '''BasePage封装所有界面都公用的方法。例如driver,find_element等'''
    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).double_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 get_attribuit_value(self,name,*locator):
        return self.get_element(*locator).get_attribute(name)

    def get_title(self):
        return self.driver.title

    def get_current_url(self):
        return self.driver.current_url

    def get_element_text(self,*locator):
        return self.driver.find_element(*locator).text

    def switch_iframe(self,*locator):
        self.driver.switch_to.frame(self.driver.find_element(*locator))

    #显示等待
    def find_element_by_wait(self,*locator):
        element =
        WebDriverWait(self.driver,10,0.5).until(EC.presence_of_element_located((locator[
        0],locator[1])))
        return element

2、多个page(界面操作)

page1:在游览器中访问:qq邮箱(https://qzone.qq.com/)

'''
实现步骤:(1)继承basepage,(2)元素传参,(3)调取方法
'''

from po10.basepage.base_page import BasePage

from selenium.webdriver.common.by import By

class DLpage(BasePage):

    def __init__(self,driver):
        BasePage.__init__(self,driver)

    def open_qq(self,url):
        self.get(url)

    def dlget_title(self):
        self.get_title()

page2:在page2中在表单中输入用户名和密码

from po10.basepage.base_page import BasePage

from selenium.webdriver.common.by import By

class BDpage(BasePage):

    def __init__(self,driver):
        BasePage.__init__(self,driver)

    def bd_switch_frame(self):
        self.switch_iframe(By.ID,"login_frame")

    def click_zhmmdl(self):
        self.left_click(By.ID,"switcher_plogin")

    def clear_zh(self):
        self.clear_text(By.ID,"u")

    def send_zh(self,text):
        self.send_text(text,By.ID,"u")

    def clear_mm(self):
        self.clear_text(By.ID,"p")

    def send_mm(self,text):
        self.send_text(text,By.ID,"p")

    def clink_login(self):
        self.left_click(By.ID,"login_button")

    def dyys(self):
        self.get_element_text(By.ID,"forgetpwd")

page3:在主界面中点击留言板?

from po10.basepage.base_page import BasePage

from selenium.webdriver.common.by import By

class ZjmClass(BasePage):

    def __init__(self,driver):
        BasePage.__init__(self,driver)

    def click_lyb(self):
        self.left_click(By.XPATH,".//*[@id='menuContainer']/div/ul/li[4]/a")

3、单元测试

import unittest

from selenium import webdriver

from po10.pages.dlpage import DLpage

from po10.pages.bdpage import BDpage

from po10.pages.zjmpage import ZjmClass

class Baidu(unittest.TestCase):

    @classmethod

    def setUpClass(cls) -> None:
        cls.driver =webdriver.Firefox()
        cls.driver.maximize_window()
        cls.driver.implicitly_wait(30)

    def test_01qq(self):
        url ="https://qzone.qq.com/"
        s= DLpage(self.driver)
        s.open_qq(url)

    def test_02bd(self):
        db = BDpage(self.driver)
        db.bd_switch_frame()
        db.click_zhmmdl()
        db.clear_zh()
        db.send_zh("账号")
        db.clear_mm()
        db.send_mm("密码")
        db.clink_login()

    def test_03zjm(self):
        zjm = ZjmClass(self.driver)
        zjm.click_lyb()
        @classmethod

    def tearDownClass(cls) -> None:
        cls.driver.close()
        if __name__ == '__main__':
            unittest.main()

4、生成测试报告

import unittest

from testcase.test02 import Baidu

from tooldemo.HTMLTestRunner import HTMLTestRunner

class HtmlClass():

    def htmlMethod(self):
        suite = unittest.TestSuite() # 创建测试套件
        case_list = ["test_01qq","test_02bd","test_03zjm"]

        for case in case_list:
            suite.addTest(Baidu(case))

        with open("../report.html","wb") as f:
            HTMLTestRunner(
                stream=f,
            title="单元测试",
                description="测试一期",
                verbosity=2
            ).run(suite)

htmlclass = HtmlClass()

htmlclass.htmlMethod()

5、测试报告代码展示

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-10-25 12:46:39  更:2021-10-25 12:46:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 2:23:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码