用pytest实现POM模型

本文介绍了如何用pytest构建POM模型,包括封装浏览器、创建basepage和casepage,以及进阶版的配置,如browser层、basepage层、common层和util层。详细阐述了数据调用流程、数据库连接和业务逻辑处理,提供了一个完整的pytest-POM执行顺序图解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

底层实现原理(简易版):

代码示例:

1.先封装浏览器,创建单例模式(无论怎样,类里只会创建一个实例对象)

from selenium import webdriver

class Browser(object):
    """单例浏览器的类"""
    __instance = None  # 实例对象  #原始不存在   #单例模式:确保某一个类只有一个实例存在。即,无论创建多少个实例对象,都是同一个对象。
    driver = None  # 浏览器driver

    def __new__(cls, browser_name, *args, **kwargs):
        if cls.__instance is None:
            cls.__instance = object.__new__(cls)  #创建私有实例对象
            # 打开浏览器
            if browser_name in ("chrome", "Chrome", "gc", "谷歌"):
                cls.driver = webdriver.Chrome()  # 驱动在默认的python目录下,也可以实现指定项目的驱动文件
            elif browser_name in ("firefox", "ff", "火狐"):
                cls.driver = webdriver.Firefox()
            else:
                raise TypeError(f"你传入的浏览器类型 [ browser_name ] 不受支持")
        return cls.__instance

    # 关闭浏览器-->并且要结束单例模式
    @classmethod
    def close_all_browsers(cls):
        if cls.driver is not None:  # 不是空的时候才关闭,防止多次调用。
            cls.driver.quit()
        cls.driver = None
        cls.__instance = None  # 解除单例

2.创建basepage,指定浏览器,封装元素操作和去网页

import time

import allure

from rtest.browser.browser import Browser  #导入browser里面的类。
from selenium.webdriver.support.select import Select

class BasePage(object):
    """提供所有页面操作的公共方法-->类似SeleniumLibrary"""
    def __init__(self):
        """拿到driver"""
        self.instance_browser=Browser("chrome")   #创建浏览器实例
        self.dr = self.instance_browser.driver  #实现driver

    def input_text(self, locator, text, clear=True):  #两个参数,一个布尔做判断。
        """
        定位元素,输入文本
        :param locator: 定位器,例如("xpath","//input")、("id","username")
        :param text: 输入的文本
        :param clear: 默认清空
        :return: None
        """
        ele = self.dr.find_element(*locator)  #因为元素通常是('id','name')这种格式的,localtor是个元组,要解包
        if clear is True:
            ele.clear()
        ele.send_keys(text)

    @allure.step("点击按钮")
    def click_button(self, locator):
        """点击按钮"""
        self.dr.find_element(*locator).click()

    @allure.step("断言")
    def element_text_should_be(self, locator, expected):
        ele = self.dr.find_element(*locator)
        assert expected in ele.text

    @allure.step("去往一个url地址 {url}")
    def goto_location(self,url):
        """去往一个url地址"""
        self.dr.get(url)
    @allure.step("清空输入框的文本",locotor)
    def clear_text(self)
        self.dr.find_element(*locotor).clear()

    @allure.step("设置隐式等待 {implicitly_wait}")
    def set_driver(self,implicitly_wait):
        self.dr.maximize_window()
        self.dr.implicitly_wait(implicitly_wait)

    @allure.step("关闭浏览器")
    def close_all_browsers(self):
        filename=fr"F:\tester\image\screenshot\{int(time.time())}.png"
        self.dr.get_screenshot_as_file(filename)
        allure.attach.file(filename,"关闭前截图",attachment_type=allure.attachment_type.PNG)
#allure添加附件(allure.attach) ,语法:allure.attach(body, name, attachment_type, extension),对测试用例、测试步骤以及fixture的结果加以补充。
        self.instance_browser.close_all_browsers()#结束单例模式

    @allure.step("得到文本消息")
    def get_text_info(self,locator):
        text=self.dr.find_element(*locator).text
        print(text)

    @allure.step("点击文本链接")
    def click_link_text(self,text):
        self.dr.find_element("link text",text).click()
    @allure.step("按下拉列表的文本选择")
    def select_from_list_by_label(self,locator,lable):
        """
        根据参入的lable文本进行下拉列表的选择
        :param locator: select 的定位器
        :param lable: 根据文本选择
        :return: None
        """
        Select(self.dr.find_element(*locator)).select_by_visible_text(lable)
    
    @allure step("js查找元素并传入值")
    def execute_javascript_date(self,locator,date):
        """执行js脚本"""
self.dr.execute_script('arguments[0].value=arguments[1]',self.dr.find_element(*locator),date)
        #js操作ÿ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值