【Selenium|进阶】超详细讲解PO模式

文章目录

1.什么是PO模式

PO(Page Object)模式是一种在自动化测试中广泛应用的设计模式,它将页面元素和操作封装成独立的类,提高了测试代码的可维护性、可复用性和可读性。

优点:

  1. 解决元素定位改变带来的维护成本增加
  2. 元素定位与用例分离

大家看到元素定位与用例分离是不是有点懵,别急接我们先来看元素定位与用例分离会有哪些问题

2.元素定位与用例分离会有哪些问题

下面是两条百度页面的测试用例,一个是登录状态下的,另一个是未登录状态下的。

python 复制代码
from selenium.webdriver.common.by import By

class TestBaidu:
    def test_baidu_1(self,driver):
        # 未登录状态下
        driver.get("https://www.baidu.com/")
        title = driver.title
        url = driver.current_url
        text = driver.find_element(By.CSS_SELECTOR, 'a[href="http://news.baidu.com"]').text
        button_text = driver.find_element(By.ID, 'su').accessible_name
        assert title == "百度一下,你就知道"
        assert url == "https://www.baidu.com/"
        assert text == "新闻"
        assert button_text == "百度一下"

    def test_baidu_2(self,driver):
        # 登录状态下
        driver.get("https://www.baidu.com/")
        title = driver.title
        url = driver.current_url
        text = driver.find_element(By.CSS_SELECTOR, 'a[href="http://news.baidu.com"]').text
        button_text = driver.find_element(By.ID, 'su').accessible_name
        assert title == "百度一下,你就知道"
        assert url == "https://www.baidu.com/"
        assert text == "新闻"
        assert button_text == "百度一下"

两个用例都有textbutton_text,都是需要用到元素定位。假设这个页面还有很多测试用例也需要用到这几个元素的定位,如果哪天元素的样式改变了,原本的定位方式定位不到元素了,那么测试用例中所有用到这个元素定位的地方都需要更改。因此会造成维护成本的增加。那么上述问题如何解决呢?
我们可以将定位元素的方法抽离出来 ,之后用的时候引用一个就可以了,如果后面需要修改,只需要修改一个地方就可以了

如图所示:

上述只是一个简单的分离,我们要学习的是这种解决问题的思路。一般来说我们需要新建一个Page类对象

python 复制代码
from selenium.webdriver.common.by import By

class PageBaidu:
    # 新闻
    news = (By.CSS_SELECTOR, 'a[href="http://news.baidu.com"]')
    # 百度一下按钮
    button = (By.ID, 'su')
    # 百度输入框
    input = (By.ID, 'kw')
    # 帮助
    help = (By.CSS_SELECTOR, 'a[href="//help.baidu.com"]')
    # 更多
    more = (By.XPATH, '//*[@id="s-top-left"]/div/a')

我们在使用的时候直接创建page的实例化对象即可

这种只是单独将元素抽离了出来,对于定位元素的操作我们还是写在测试用例里面的。

其实还有一种思路,我们也可以封装对于元素的操作,作为page对象的方法,例如输入框搜索内容

python 复制代码
    def search_keyword(self, keyword):
        self.driver.find_element(*self.input).send_keys(keyword)
        self.driver.find_element(*self.button).click()

那么如果要在测试用例中搜索内容,只需要传入变量,调用方法即可,这是PO模式两种分离的思路。

相关推荐
硬禾科技16 小时前
连接世界的工程哲学
嵌入式硬件·测试工具·自动化·硬件工程
wuhuhuan1 天前
Case Generator 平台升级
python·测试工具·自动化
柒儿吖1 天前
SSCom 重构全记录:用 Rust 把串口调试助手送上鸿蒙 PC、macOS、Windows和Linux
测试工具·rust·harmonyos
AngusKit1 天前
AngusTester 与 Postman、MeterSphere:私有化统一测试怎么选
测试工具·jmeter·压力测试·metersphere·web测试·移动端测试
蒲公英内测分发1 天前
App 更新一次就换一个二维码?智能硬件配套 App 的版本和下载入口怎么管理
人工智能·测试工具·智能家居·智能硬件
测试老哥2 天前
接口测试的测试用例应该怎么写?
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
是Leo刘啊2 天前
别再手敲 JSON 造数据了!Mock 数据生成器实战与避坑指南
测试工具
Luminbox紫创测控2 天前
航天热平衡试验用太阳模拟器:光学积分器设计与均匀性提升方法
测试工具·安全性测试·太阳光模拟器·测试标准·航天热平衡实验
程序员杰哥2 天前
UI自动化测试:Jenkins配置
自动化测试·软件测试·python·测试工具·职场和发展·jenkins·测试用例
TomEval2 天前
【性能测试】17 - 性能测试入门
测试工具·jmeter