首页 > 其他分享 >playwright+Pytest+UI 自动化分成设计框架

playwright+Pytest+UI 自动化分成设计框架

时间:2024-04-08 17:55:25浏览次数:29  
标签:playwright self page locator Pytest UI path frame def

  • Auth:认证登录token机制
  • BasePage:公共方法
  • Common:
  • Config
  • Logs
  • PageLocators
  • Pages
  • TestCases
  • TestDatas

新建BasePage.py文件

点击查看代码
from playwright.sync_api import expect, Page
from Config.config import Config
import os,time


class BasePage:

    def __init__(self, page: Page):
        self.page = page

    def _goto_url(self, url):
        """打开网页"""
        self.page.goto(url)

    def _click(self, locator, frame_locator=None):
        """
        点击元素
        :param locator: 传入元素定位器
        :param frame_locator: 传入frame框架的的定位器,如果没有传入,则一般点击
        :return:
        """
        try:
            if frame_locator is not None:
                self.page.frame_locator(frame_locator).locator(locator).click()
            else:
                self.page.click(locator)
        except Exception as e:
            print(e)

    def click_text(self, text):
        """
        点击指定文本内容的元素
        :param text: 文本
        :return:
        """
        try:
            self.page.get_by_text(text).click()
        except Exception as e:
            print(e)


    def hover(self, locator, frame_locator=None):
        """
        定位目标元素,并执行鼠标悬停操作
        :param locator: 传入元素定位器
        :param frame_locator: 传入frame框架的的定位器,如果没有传入,则一般点击
        :return:
        """
        try:
            if frame_locator is not None:
                self.page.frame_locator(frame_locator).locator(locator).hover()
            else:
                self.page.hover(locator)
        except Exception as e:
            print(e)


    # def _fill(self, locator, value, frame_locator=None):
    #     """
    #     定位元素,输入内容
    #     :param locator:传入元素定位器
    #     :param value:传入输入的值
    #     :param frame_locator: 传入frame框架
    #     :return:
    #     """
    #     try:
    #         if frame_locator is not None:
    #             self.page.frame_locator(selector=frame_locator).locator(selector_or_locator=locator).fill(value)
    #         else:
    #             self.page.fill(selector=locator, value=value)
    #     except Exception as e:
    #         print(e)

    def type(self, locator, value, frame_locator=None):
        """
        模拟人工输入,一个键一个键的输入
        :param locator:传入元素定位器
        :param value:传入输入的值
        :param frame_locator: 传入frame框架
        :return:
        """
        try:
            if frame_locator is not None:
                self.page.frame_locator(selector=frame_locator).locator(selector_or_locator=locator).type(text=value,
                                                                                                          delay=50)
            else:
                self.page.type(selector=locator, text=value, delay=50)
        except Exception as e:
            print(e)


    def file(self, locator, files, frame_locator=None):
        """
        上传文件的方法
        :param locator: 定位器
        :param files: 单个文件名,或者列表存放多个文件
        :param frame_locator: iframe框架定位器,如果没有就不传
        :return:
        """
        try:
            if frame_locator is not None:
                self.page.frame_locator(frame_locator).locator(locator).set_input_files(files=files)
            else:
                self.page.locator(locator).set_input_files(files=files)
        except Exception as e:
            print(e)

    def choose_file_from_custom_button(self, button_selector, file_path):
        # 如果不是input输入框,必须点开文件框的情况(selenium上没法实现的操作)
        # 使用expect_file_chooser()来等待文件选择器出现
        try:
            with self.page.expect_file_chooser() as fc_info:
                self.page.locator(button_selector).click()
            # 获取文件选择器对象并设置文件路径
            file_chooser = fc_info.value.set_files(file_path)
            return file_chooser
        except Exception as e:
            print(e)

    def ele_to_be_visible(self, locator):
        """断言元素可见"""
        return expect(self.page.locator(locator)).to_be_visible()

    def _ele_to_be_visible_force(self, locator, frame_locator=None, timout: int = 5):
        """强制等待某个元素可见"""
        ele = None
        if frame_locator is not None:
            ele = self.page.frame_locator(frame_locator).locator(locator)
        else:
            ele = self.page.locator(locator)
        for t in range(0, timout):
            self.page.wait_for_timeout(500)
            if ele.is_visible():
                break
        else:
            raise Exception("元素未找到!")

    def select_option_by_keyword(self, dropdown_locator, option_locator, keyword):
        """下拉选项操作"""
        try:
            # 点击下拉框,展开选项
            self.click(dropdown_locator)
            time.sleep(1)
            print(f"文本内容为:{keyword}")
            # 定位选项列表
            options = self.page.query_selector_all(option_locator)
            print(f"options为:{options}")
            # 遍历选项并选择匹配的关键字
            for option in options:
                print(f"option为:{option}")
                # assert keyword in option.text_content(), f"{option.text_content()} 不包含关键字 {keyword}"
                text = option.evaluate('(element) => element.textContent')
                print(f"option.text为:{text}")
                if keyword in text:
                    print("进入了判断")
                    option.click()
                    print("点击完成")
                    break
        except Exception as e:
            print(e)

    def _ele_is_checked(self, selector):
        """判断元素是否被选选中"""
        return self.page.is_checked(selector)

    def _browser_operation(self, reload=False, forward=False, back=False):
        """浏览器操作,reload 刷新,forward 前进,back 后退"""
        if reload:
            self.page.reload()
        if back:
            self.page.go_back()
        if forward:
            self.page.go_forward()

    def screenshot(self, path, full_page=True, locator=None):
        """截图功能,默认截取全屏,如果传入定位器表示截取元素"""
        if locator is not None:
            self.page.locator(locator).screenshot(path=path)
            return path
        self.page.screenshot(path=path, full_page=full_page)
        return path

    def _del_auth(self):
        auth_path = Config.auth_dir + os.path.sep + "auth.json"
        if os.path.exists(auth_path):
            os.remove(auth_path)

    # def ocr_image(image_path):
    #     ocr = ddddocr.DdddOcr(show_ad=False)  # 实例化 OCR 对象
    #     with open(image_path, 'rb') as f:  # 打开图片
    #         img_bytes = f.read()  # 读取图片内容
    #     result = ocr.classification(img_bytes)  # 进行 OCR 分类
    #     return result








标签:playwright,self,page,locator,Pytest,UI,path,frame,def
From: https://www.cnblogs.com/qq-910/p/18121871

相关文章

  • 利用matlab的guide制作一个凯撒密码加解密演示界面
    第一步:在命令行窗口输入guide,回车选择新建gui如图所示,两个粉的是可编辑文本,一个按钮,三个写着字和一个白色的框是静态文本先把我们需要的这些东西都拉出来,数量记得到位,布局自己调粉色什么怎么调就自己探索一下,一般拉出来是白色双击其中一个静态文本,会弹出来一个对话框,......
  • webpack打包的时候如何指定 tsconfig.build.json
    在使用Webpack打包TypeScript项目时,如果你想要指定一个不同于默认的tsconfig.json的配置文件,你可以通过TypeScript的编译器选项tsconfig来实现。以下是一个基本的配置示例,你需要在webpack配置文件中的TypeScriptloader中添加这个选项:constpath=require('path');module.expo......
  • ubuntu2204 部署 stable-diffusion-webui
    显卡:(一个实例仅能用一张卡)顶配:rtx6000ada48g,a10040g,a100 80g,a100 96g,a80080g,h100,h200高端:rtx409024g,rtx4090D24g,rtxa600048g,rtxa500024g,rtx5000ada32g魔改:rtx2080ti22g,rtx308020g性价比:rtx4060ti16g,rtx206012g,rtx306012g,rtx309024g,rtxtitan24g其......
  • WebUI测试-获取html页面表格数据并存到Excel中
    fromselenium.webdriver.supportimportexpected_conditionsasECimportpandasaspdtable=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,'table')))#表格元素rows=table.find_elements(By.CSS_SELECTOR,"tbody......
  • Python项目替换requirements.txt
    一、简述在Python项目开发中,requirements.txt长久以来都是管理项目依赖的标准做法。然而,随着技术的发展和项目复杂度的增加,仅依靠requirements.txt来管理依赖已经远远不够。本文旨在向Python开发新手介绍更现代、更高效的依赖管理工具和方法,帮助你的项目保持健康、可维护和......
  • burp suit 无法抓取 localhost 的数据包
    burpsuit无法抓取localhost的数据包‍Chorme上:在SwitchyOmega插件的不代理的地址列表中,删除默认的localhost​,添加上<-loopback>​​​‍Firefox上:在地址栏中,输入about:config​,然后搜索配置项network.proxy.allow_hijacking_localhost​,将其值设置为true​......
  • VS+QT编程找不到新增UI文件控件对象的问题
    转载自:VS写Qt项目时,ui界面拖拽的控件代码找不到引用的解决办法_vsqt中ui下的组件没有-CSDN博客1.保存Ui文件在拖拽控件之后,Ctrl+S2.重新编译ui文件鼠标右键选择要编译的UI文件,找到编译 3.右键项目,重新扫描解决方案 ......
  • 基于YOLOv8v7v6v5和LPRNet的中文车牌识别系统(深度学习代码+UI界面实现+训练数据集)
    摘要:之前的中文车牌识别系统升级到v2.0版本,本文详细介绍使用深度学习实现的高效中文车牌识别系统完整代码,包括训练过程、原理介绍、模型对比、系统设计等部分。采用了最新的YOLOv8、YOLOv7、YOLOv6、YOLOv5目标检测算法进行车牌检测定位,并应用LPRNet识别车牌字符,另外支持车牌颜......
  • 2-42. 场景切换淡入淡出和动态 UI 显示
    添加Canvas添加FadePanel通过修改CanvasGroup的Alpha就能隐藏或者显示FadePanel在FadePanel下面添加文字和动画动画图片如下图所示切换场景时淡入淡出修改Settings修改Player解决摄像机抖动问题修改Bounds范围项目相关代码代码仓库:https:/......
  • 基于YOLOv8/v5和ByteTrack的多目标检测计数与跟踪系统(深度学习代码+UI界面实现+训练数
    摘要:之前的多目标检测与跟踪系统升级到现在的v2.0版本,本博客详细介绍了基于YOLOv8/YOLOv5和ByteTrack的多目标检测计数与跟踪系统。该系统利用最新的YOLOv8和YOLOv5进行高效目标检测,并通过ByteTrack算法实现精确的目标跟踪,适用于多种场景如人群监控、交通流量分析等。系统设计......