基于pytest的主流POM模式——测试框架的设计与实现

1、POM设计模式

——页面对象模型(Page object Modules),又名:PO/POM,是UI自动化最佳设计模式之一。把一个页面的测试用例,测试逻辑,封装为一个测试方法或者一个测试类(说白了,就是把如send_keys、click等方法封装一下,方便我们调用,后续不需要每次使用时在每次的写一遍)。

  •  优点:
  1. 测试代码和页面的特定代码(如:定位符、布局)之间有清晰的区分(定位代码、行为代码)
  2. 页面提供的服务或操作只有一个存储库(如:类、py文件),不需要把服务分散到整个测试中,集中进行管理,开发或是测试修改时,只需要修改页面对象就可以了

import pytest
from selenium import webdriver
from time import sleep

class Test_Selenium():
    #环境准备
    @classmethod
    def setup_class(cls):
        cls.driver = webdriver.Chrome()#打开浏览器驱动,这样编写测试的时长会短,测试损耗的资源也会降低

    def test_baidu_case01(self):
        self.driver.get('http://www.baidu.com')
        sleep(1)
        self.driver.find_element_by_id('kw').send_keys('狗狗币')
        self.driver.find_element_by_id('su').click()
        sleep(1)
        assert self.driver.title == "狗狗币_百度搜索" #根据进入的网页title做断言

    def test_baidu_case02(self):
        self.driver.get('http://www.baidu.com')
        sleep(1)
        self.driver.find_element('id','kw').send_keys('selenium')
        self.driver.find_element('id','su').click()
        sleep(6)
        assert self.driver.title == "selenium_百度搜索"  # 根据进入的网页title做断言

    def test_baidu_case03(self):
        self.driver.get('http://www.baidu.com')
        sleep(2)
        self.driver.find_element_by_id('kw').send_keys('pytest')
        self.driver.find_element_by_id('su').click()
        sleep(1)
        assert self.driver.title == "pytest_百度搜索"  # 根据进入的网页title做断言

    #环境清理
    @classmethod
    def teardown_class(cls):
        cls.driver.quit() #退出浏览器

if __name__ == '__main__':
    pytest.main(['-s','test_selenium.py'])

 直接使用selenium的原生代码编写有2个问题:

  1. 测试用例与自动化用例的定位符(如:百度搜索中的kw、su)之间没有分开,如果UI更改了属性值kw、su,所有涉及到这些元素的用例都要改,用例过多时,工作量将会更大
  2. 元素定位代码将在每个测试用例都需要重复的使用,造成代码冗余

——这2个问题,使用到POM就可以解决掉。

2、POM涉及模式的编码实现

目录:

 base.py——基类,封装一些常用的方法

from selenium import webdriver
import pytest
import time

class BasePage:
    """
    基础page层,封装一些常用的方法
    """

    def __init__(self,driver):
        #导入一下webdriver包,方便后边代码的编写
        self.driver = webdriver.Chrome()

    #打开页面
    def open(self,url=None):
        if url is None: #如果url没传参就会走这里,就会默认进入子类中的url
            self.driver.get(self.url)
        else:
            self.driver.get(url)

    #元素定位
    def locator(self,name,value):#可直接使用8种单数形式的定位方法
        return self.driver.find_element(name,value)

    #获取title,就是获取网页标题栏
    def get_title(self):
        return self.driver.title

    #获取页面text,获取页面文本,使用xpath定位
    def get_text(self,path):
        return self.locator("xpath",path).text #获取文本

    #执行JavaScript
    def js(self,script):#脚本作为参数传进来
        self.driver.execute_script(script)

    #休眠时间(等待时间)
    def sleep(self,sec):
        time.sleep(sec)

 baidu_page.py页面对象类:

from base import BasePage

"""
baidu_page.py文件是用来存储百度页面
"""

#创建BaiduPage类继承BasePage
class BaiduPage(BasePage):
    #定义url变量,供父类中的open()方法使用
    url = "http://www.baidu.com"

    #文本定位,并输入关键字
    def search_input(self,search_key):
        #使用父类locator方法来定位元素
        #比原生的selenium更加精简
        self.locator("id","kw").send_keys(search_key)

    #按钮定位,并点击
    def search_button(self):
        self.locator("id","su").click()

test_baidu.py

结果:

============================= test session starts =============================
platform win32 -- Python 3.8.5, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: C:\Users\11130\PycharmProjects\pythonProject2\demo\data
plugins: forked-1.4.0, html-3.1.1, metadata-1.11.0, rerunfailures-10.2, xdist-2.5.0
collected 3 items

test_baidu.py ...

============================= 3 passed in 11.73s ==============================

——使用这样的方法,我们的代码将大幅度减少冗余,参数更加的便于管理。

 

  总结:

感谢每一个认真阅读我文章的人!!!

 我个人整理了我这几年软件测试生涯整理的一些技术资料,包含:电子书,简历模块,各种工作模板,面试宝典,自学项目等。欢迎大家点击下方名片免费领取,千万不要错过哦。

   Python自动化测试学习交流群:全套自动化测试面试简历学习资料获取点击链接加入群聊【python自动化测试交流】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DhOSZDNS-qzT5QKbFQMsfJ7DsrFfKpOF&authKey=eBt%2BF%2FBK81lVLcsLKaFqnvDAVA8IdNsGC7J0YV73w8V%2FJpdbby66r7vJ1rsPIifg&noverify=0&group_code=198408628

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值