PO模型

PO模型,第1张

一、介绍

在自动化中,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()

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/794981.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存