当前位置: 首页 > news >正文

自动化神器 Playwright 的 Web 自动化测试解决方案

 

 

 

1. 主流框架的认识

image.png

  • 总结:
    • 由于Selenium在3.x和4.x两个版本的迭代中并没有发生多大的变化,因此Selenium一统天下的地位可能因新框架的出现而变得不那么稳固。
    • 后续的Cypress、TestCafe、Puppeteer被誉为后Selenium时代Web UI自动化的三驾马车。但是由于这三个框架都是基于JavaScript开发的,且都不支持Python,所以使用率并没有很高。
    • playwright则是综合了上述框架的优点,提供了很好的体验,将来可能成为流行的趋势。

2. Playwright认识

  • Playwright简介

    • 2020年,微软(Microsoft)开源了一个名为Playwright的工具,与Selenium一样入门简单,支持多语言(Python、Java、Node.js、.NET),支持多浏览器(Chromium、Firefox、Webkit),可跨平台(Windwos、Linux、Mac OS)
    • Playwright同时支持接口自动化和UI自动化,为现代web应用提供了可靠的端到端的测试能力。
  • Playwright优势

    • 1)自动等待功能让自动化更可靠
    • 2)自动追踪:可以很方便地配置重试策略,自动的追踪结果,以截图和录屏的方式进行记录。
    • 3)断言机制:会根据网络环境进行自动断言,直到满足某种条件为止。
    • 4)异步执行:Playwright基于socket进行双向通讯,支持同步与异步执行两种方式
    • 5)可运行多页仿真场景:Playwright是通过上下文管理浏览器,相当于每一个测试用例都会创建一个独立的上下文,浏览器的上下文其实就是一个全新的浏览器,这种方式的好处就是在提速的同时又实现测试与测试之间的隔离,使得测试结果更加准确,所以可以实现并行执行。
    • 6)强大的工具集:还我们提供了强大的工具集,例如:脚本录制工具codegen、脚本编写以及调试工具playwright等

3. Playwright环境搭建

  • Python环境:python解释器+IDE工具,不知道怎么安装的可参考: python3.4 + pycharm 环境安装 + pycharm 使用

  • Playwright环境:

    • 安装Playwright:pip install playwright -i https://pypi.tuna.tsinghua.edu.cn/simple

image.png

  • 安装内置浏览器(chromium,firefox,webkit):playwright install

image.png

4. Playwright入门实战

1)脚本录制
  • 案例1:实现Web ui自动化,打开浏览器,访问测试派(测试派 - 软件测试工程师的心灵社区),点击登录后在进行登录操作(输入用户名、密码,点击登录按钮)
  • 操作步骤:
    • 第一步:pycharm--Terminal中输入命令:playwright codegen,会自动打开浏览器和Playwright Inspector工具,Playwright Inspector工具自动开启录制功能
    • 第二步:在打开的浏览器中进行相关的操作,如访问地址、点击或输入操作
    • 第三步:操作完成后,在Playwright Inspector中点击Record停止录制,然后复制代码即可
from playwright.sync_api import Playwright, sync_playwright, expectdef run(playwright: Playwright) -> None:browser = playwright.chromium.launch(headless=False)context = browser.new_context()page = context.new_page()page.goto("http://testingpai.com/")page.get_by_text("登录").click()page.get_by_placeholder("用户名/邮箱/手机号").click()page.get_by_placeholder("用户名/邮箱/手机号").fill("kemi")page.get_by_placeholder("用户名/邮箱/手机号").press("Tab")page.get_by_placeholder("密码").fill("123456")page.pause()  # 断点调试功能page.get_by_role("button", name="登录").click()# ---------------------context.close()browser.close()with sync_playwright() as playwright:run(playwright)

2)录制工具快速定位元素
  • 如果我自己写代码,需要定位元素,通过Playwright Inspector工具的Pick locator可以快速获取元素定位的信息,具体操作如下截图:

image.png

  • Playwright支持两大类元素定位方式,包括:
  • 1)get_by方式
    • get_by_id: 通过元素的 id 属性来查找元素,例如:element = page.get_by_id("my-id")
    • get_by_name: 通过元素的 name 属性来查找元素,例如:element = page.get_by_name("my-name")
    • get_by_text: 通过元素的文本内容来查找元素,例如:element = page.get_by_text("Submit")
    • get_by_title: 通过元素的 title 属性来查找元素,例如:element = page.get_by_title("my-title")
    • get_by_placeholder: 通过元素的 placeholder 属性来查找元素,例如:element = page.get_by_placeholder("my-placeholder")
    • get_by_selector: 通过 CSS 选择器来查找元素,例如:element = page.get_by_selector("#submit-button")
    • get_by_xpath: 通过 XPath 表达式来查找元素,例如:element = page.get_by_xpath("//div[@class='my-class']")
    • get_by_label: 根据label属性值查找元素,类似于HTML中的label标签和对应的for属性。
    • get_by_role: 通过角色方式定位元素,例如:element = page.get_by_role("button", name="Submit")
  • 2)page.locator方式
    • 通过ID定位元素:使用page.locator("#element-id")page.locator('id=element-id')定位。
    • 通过CSS选择器定位元素:使用page.locator("css=selector")定位。例如:element = page.locator("button#submit-button")
    • 通过XPath表达式定位元素:使用page.locator("xpath=expression")定位。例如:element = page.locator("//button[@id='submit-button']")
    • 通过名称定位元素:使用page.locator("name=element-name")定位。
    • 通过链接文本定位元素:使用page.locator("text=link-text")定位。
    • 通过部分链接文本定位元素:使用page.locator("partial_text=partial-link-text")定位。
    • 通过元素属性定位元素:使用page.locator("[attribute=value]")定位。
    • 通过标签名定位元素:使用page.locator("tag=tag-name")定位。

4. Pytest+Allure+Playwright完整项目演示

1)脚本转为测试用例
  • 案例需求:将上面测试派(百度一下)的登录操作转为测试用例
  • 操作步骤:
    • 第一步:pycharm--Terminal中输入命令:playwright codegen,会自动打开浏览器和Playwright Inspector工具,Playwright Inspector工具自动开启录制功能
    • 第二步:在打开的浏览器中进行相关的操作,如访问地址、点击或输入操作
    • 第三步:操作完成后,在Playwright Inspector中点击Record停止录制
    • 第四步:在Target中选择Python下的pytest,就会自动化将录制的代码转为测试用例,然后复制代码即可。具体操作如下截图所示:

image.png

  • 代码如下:
 
from playwright.sync_api import Page, expectdef test_example(page: Page) -> None:page.goto("http://testingpai.com/")page.get_by_text("登录").click()page.get_by_placeholder("用户名/邮箱/手机号").click()page.get_by_placeholder("用户名/邮箱/手机号").fill("kemi")page.get_by_placeholder("用户名/邮箱/手机号").press("Tab")page.get_by_placeholder("密码").fill("123456")page.get_by_role("button", name="登录").click()

  • 执行用例前必须先安装插件,否则会报错,因为用例只有核心的业务操作,没有浏览器、上下文、页面的初始化,装了插件后会自动做这些初始化的操作,从而执行用例不会报错。命令:pip install pytest-playwright

image.png

2)数据驱动
  • 集合pytest的parametrize实现数据驱动
import pytest
from playwright.sync_api import Page, expect# 测试用例数据
case_data = [{'caseid':1,'username':'kemi123', 'password':'kemi123'},{'caseid':2,'username':'zhangsan', 'password':'123456'},{'caseid':3,'username':'lisi', 'password':'123456'}]# 数据驱动
@pytest.mark.parametrize('case', case_data)
def test_example(page: Page,case) -> None:username = case['username']password = case['password']page.goto("http://testingpai.com/")page.get_by_text("登录").click()page.get_by_placeholder("用户名/邮箱/手机号").click()page.get_by_placeholder("用户名/邮箱/手机号").fill(username)page.get_by_placeholder("用户名/邮箱/手机号").press("Tab")page.get_by_placeholder("密码").fill(password)page.get_by_role("button", name="登录").click()page.screenshot(path=f"images/login/登录{case['caseid']}.png")  # 截图保存到指定位置

3)报告显示
  • 通过pytest执行用例后,通过命令生成报告:allure serve outputs/allure,查看报告显示,截图如下:

image.png

 



相关文章:

自动化神器 Playwright 的 Web 自动化测试解决方案

1. 主流框架的认识 总结: 由于Selenium在3.x和4.x两个版本的迭代中并没有发生多大的变化,因此Selenium一统天下的地位可能因新框架的出现而变得不那么稳固。后续的Cypress、TestCafe、Puppeteer被誉为后Selenium时代Web UI自动化的三驾马车。但是由于这三…...

docker filebeat 将日志多级目录和多维json数据日志同步到es

注 使用的时候先调试调试配置,调试成功在尝试写入es,如果es写入失败就是es账户.密码/白名单.和index未创建的问题,细节可以留言 setup.template.priority 模板优先级 调整这个可以配置一台机器多个filebeat 容器启动 多级目录日志和多维josn日志结构 filebeat.inputs:- typ…...

【机器学习】模型参数优化工具:Optuna使用分步指南(附XGB/LGBM调优代码)

常用的调参方式和工具包 常用的调参方式包括网格搜索(Grid Search)、**随机搜索(Random Search)和贝叶斯优化(Bayesian Optimization)**等。 工具包方面,Scikit-learn提供了GridSearchCV和RandomizedSearchCV等用于网格搜索和随机搜索的工具。另外,有一…...

webview全屏处理,即插即用

去年双十一有个直播的需求,听起来很简单,技术也都很成熟,但是真的开始实现后,还是有不少坑的,首先第一个uc内核不支持webRTC协议,需要重新开发chrome内核的webview,其次webview全屏处理、悬浮窗…...

实录分享 | 央企大数据平台架构发展趋势与应用场景的介绍

分享嘉宾: 孟子涵-中国华能集团信息中心平台架构师 2021年华能就与Alluxio建立了合作,共同写了整个华能统一纳管的架构方案。这个方案我认为是现在我们在央企里边比较核心的一套体系,能让全集团所有我们认为重要的数字化资源实现真正的统一集…...

UE5 将类修改目录

有个需求,需要修改ue里面类的位置,默认在Public类下面,我想创建一个二级目录,将所有的类分好位置,方便查看。 上图为创建一个类所在的默认位置。 接下来,将其移动到一个新的目录中。 首先在资源管理器中找…...

GPT实战系列-ChatGLM3管理工具的API接口

GPT实战系列-ChatGLM3管理外部借力工具 用ChatGLM的工具可以实现很多查询接口和执行命令,外部工具该如何配置使用?如何联合它们实现大模型查询助手功能?例如调用工具实现股票信息查询,网络天气查询等助手功能。 LLM大模型相关文章…...

Python 列表、元组、字典区别

1.列表、元组和字典都是序列 2.列表字典可以修改和删除序列中的某个元素,而元组就是一个整体,不能修改和删除,一定要修改或删除的话,只能修改和删除整个元组。 3.既然元组不能删除和修改,有什么作用呢? 1…...

[足式机器人]Part2 Dr. CAN学习笔记 - Ch03 傅里叶级数与变换

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Ch03 傅里叶级数与变换 1. 三角函数的正交性2. 周期为 2 π 2\pi 2π的函数展开为傅里叶级数3. 周期为 2 L 2L 2L的函数展开4. 傅里叶级数的复数形式5. 从傅里叶级数推导傅里叶变换FT6. 总结 1. …...

你想使用域名访问一个ip的网页,你应该怎么办呢?

你想使用域名访问一个ip的网页,你应该怎么办呢? eg:你想用https://test.com/访问http://1.1.1.1/方法: eg:你想用https://test.com/访问http://1.1.1.1/ 方法: 1.首先,如果你是服务器的管理者,你需要在服务器的官网申请一个test.com的域名,然后在官网将域名映射到1.1.1.1上. …...

SAP存放状态的几个常用表

SAP存放状态的几个常用表 在sap中,包括订单、项目、计划、设备主数据等,存在审批流程的业务单据,这些业务对象都会有状态的属性,用来控制和约束该业务当前的操作。 主要的表 JEST:存放了该对象编号的当前状态 JCDS…...

AUTO SEG-LOSS SEARCHING METRIC SURROGATES FOR SEMANTIC SEGMENTATION

AUTO SEG-LOSS: 搜索度量替代语义分割 论文链接:https://arxiv.org/abs/2010.07930 项目链接:https://github.com/fundamentalvision/Auto-Seg-Loss ABSTRACT 设计合适的损失函数是训练深度网络的关键。特别是在语义分割领域,针对不同的场…...

openssl3.2 - 官方demo学习 - 索引贴

文章目录 openssl3.2 - 官方demo学习 - 索引贴概述笔记工程的搭建和调试环境BIOBIO - client-arg.cBIO - client-conf.cBIO - saccept.cBIO - sconnect.cBIO - server-arg.cBIO - server-cmod.cBIO - server-conf.cBIO - 总结certsciphercipher - aesccm.ccipher - aesgcm.ccip…...

textarea文本框根据输入内容自动适应高度

第一种&#xff1a; <el-input auto-completeoff typetextarea :autosize"{minRows:3,maxRows:10}" class"no-scroll"> </el-input> /* 页面的样式表 */ .no-scroll textarea {overflow: hidden; /* 禁用滚动条 */resize: none; /* 禁止用户…...

【JAVA基础--计算机网络】--TCP三次握手+四次挥手

三次握手四次挥手 写在前面1. 三次握手1.1 作用&#xff1a; 为了在不可靠的信道上建立起可靠的连接&#xff1b;1.2 建立过程1.3 面试提问 2. 四次挥手2.1 作用&#xff1a;为了在不可靠的网络信道中进行可靠的连接断开确认2.2 断开过程2.3 面试提问 写在前面 三次握手建立连…...

最新靠谱可用的-Mac-环境下-FFmpeg-环境搭建

最近在尝试搭建 FFmpeg 开发环境时遇到一个蛋疼的事&#xff0c;Google 了 N 篇文章竟然没有一篇是可以跑起来的&#xff01; 少部分教程是给出了自我矛盾的配置&#xff08;是的&#xff0c;按照贴出来的代码和配置&#xff0c;他自己都跑不起来&#xff09;&#xff0c;大部…...

【漏洞复现】Hikvision SPON IP网络对讲广播系统存在命令执行漏洞CVE-2023-6895

漏洞描述 Hikvision Intercom Broadcasting System是中国海康威视(Hikvision)公司的一个对讲广播系统。 Hikvision Intercom Broadcasting System是中国海康威视(Hikvision)公司的一个对讲广播系统。Hikvision Intercom Broadcasting System 3.0.3_20201113_RELEASE(HIK)版…...

微软为Windows内置记事本应用开发AI功能;2024年15个 AI 语音生成器

&#x1f989; AI新闻 &#x1f680; 微软为Windows内置记事本应用开发AI功能 摘要&#xff1a;微软正在开发一个新的生成式AI功能&#xff0c;名为"Cowriter"&#xff0c;用于Windows内置的记事本应用。该功能类似于画图应用中的"Cocreator"功能&#x…...

【C++进阶06】红黑树图文详解及C++模拟实现红黑树

一、红黑树的概念及性质 1.1 红黑树的概念 AVL树用平衡因子让树达到高度平衡 红黑树可以认为是AVL树的改良 通过给每个节点标记颜色让树接近平衡 以减少树在插入节点的旋转 在每个结点新增一个存储位表示结点颜色 可以是Red或Black 通过对任何一条从根到叶子的路径上 各个结点…...

2023年最严重的10起0Day漏洞攻击事件

根据谷歌公司威胁分析小组去年 7 月发布的报告显示&#xff0c;2022 年全球共有 41 个 0day 漏洞被利用和披露。而研究人员普遍认为&#xff0c;2023 年被利用的 0Day 漏洞数量会比 2022 年更高&#xff0c;这些危险的漏洞被广泛用于商业间谍活动、网络攻击活动以及数据勒索攻击…...

Linux之Iptables简易应用

文档形成时期&#xff1a;2009-2024年 和iptables打交道有15年了&#xff0c;经过无数实践后&#xff0c;形成一个简易应用文档。 文档主题是简易应用&#xff0c;所以其原理不详述了。 因软件世界之复杂和个人能力之限&#xff0c;难免疏漏和错误&#xff0c;欢迎指正。 文章目…...

树状结构查询 - 华为OD统一考试

OD统一考试 分值: 200分 题解: Java / Python / C++ 题目描述 通常使用多行的节点、父节点表示一棵树,比如: 西安 陕西 陕西 中国 江西 中国 中国 亚洲 泰国 亚洲 输入一个节点之后,请打印出来树中他的所有下层节点。 输入描述 第一行输入行数,下面是多行数据,每行以…...

版本控制系统教程

1.Git的基本介绍 1.1 Git的概念 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目.Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件.Git与常用的版本控制工具CVS&#xff0c;Subversion等不同&#xff…...

Java多线程并发篇----第十篇

系列文章目录 文章目录 系列文章目录前言一、start 与 run 区别二、JAVA 后台线程三、什么是乐观锁前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、start 与 r…...

模型\视图一般步骤:为什么经常要用“选择模型”QItemSelectionModel?

一、“使用视图”一般的步骤&#xff1a; //1.创建 模型(这里是数据模型&#xff01;) tabModelnew QSqlTableModel(this,DB);//数据表 //2.设置 视图的模型(这里是数据模型&#xff01;) ui->tableView->setModel(tabModel); 模型种类&#xff1a; QStringListModel…...

C#,愚弄数(Hoax Number)的计算方法与源代码

一、愚弄数&#xff08;Hoax Number&#xff09; 愚弄数&#xff08;Hoax Number&#xff09;是一种组合数字, 其数字总和等于其不同质因数的数字总和。 注&#xff1a;1不被视为质数, 因此它不包含在不同质因数的总和中。 有些愚弄数&#xff08;Hoax Number&#xff09;数字也…...

c JPEG编码,此程序没有处现MCU中亮度分量的排序

#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/videodev2.h> //v4l2 头文件 #include <strin…...

前端规范扩展

前端编程规范是基于原有vue2基础上那套《编码风格及标准》上&#xff0c;应用于vue3、typescript、vite2基础上延伸出来的扩展补充&#xff0c;持续完善 一、编码规范 ESLint 代码检测工具 Pretter 代码格式化工具配合双校验代码 Git 规范 - 编码工具 vscode 同步参考文档中…...

【AI视野·今日NLP 自然语言处理论文速览 第七十二期】Mon, 8 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 8 Jan 2024 Totally 17 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers DeepSeek LLM: Scaling Open-Source Language Models with Longtermism Authors DeepSeek AI Xiao Bi, Deli Ch…...

RT-Thread基于AT32单片机的CAN应用

1 硬件电路 2 RT-Thread驱动配置 RT-Studio中没有CAN相关的图形配置&#xff0c;需要手动修改board.h。在board.h的末尾&#xff0c;增加相关的BSP配置。 #define RT_CAN_USING_HDR #define BSP_USING_CAN13 IO配置 at32_msp.c中的IO配置是PB9和PB10&#xff0c;掌上实验室V…...

微信二维码网站制作/重庆百度推广开户

1cmd查看 ipconfig -all 2电脑设置查看...

抚州市建设局招标办网站/优化设计七年级上册数学答案

正文本文参考自《剑指offer》一书&#xff0c;代码采用Java语言。题目输入一个链表&#xff0c;输出该链表中倒数第k个结点。为了符合大多数人的习惯&#xff0c;本题从1开始计数&#xff0c;即链表的尾结点是倒数第1个结点。例如一个链表有6个结点&#xff0c;从头结点开始它们…...

网站验收流程/百度百科合作模式

2019独角兽企业重金招聘Python工程师标准>>> 个人主页&#xff1a; 记录自己的发展历程&#xff0c;包括自己的学习、工作、生活&#xff0c;希望自己努力奋进&#xff0c;不要荒废时光。 欢迎大家访问&#xff1a;http://www.xujiangfei.com 转载于:https://my.osc…...

动态网站设计作品/关键词分类哪八种

前言 上篇博客&#xff0c;我们学习了实现多态的两个条件 父类的指针或引用子类重写父类的虚函数 还有&#xff0c;final&#xff0c;override&#xff0c;纯虚函数&#xff0c;抽象类等相关知识。 本篇我们将学习多态实现的底层原理 话不多说&#xff0c;马上开始今天的学习 文…...

tale博客和wordpress/公司网站制作

[edit by xingoo] kmp算法其实就是一种改进的字符串匹配算法。复杂度可以达到O(nm)&#xff0c;n是参考字符串长度&#xff0c;m是匹配字符串长度。 传统的算法&#xff0c;就是匹配字符串与参考字符串挨个比较&#xff0c;如果相同就比较下一个&#xff0c;如果不相同&#xf…...

企业年金查询在哪查/seo优化是什么职业

一.查询构建器的get方法 查询构建器的get方法返回了一个集合$users App\User::where(active, 1)->get(); foreach ($users as $user) {echo $user->name; }二.访问器&调整器 1.访问器:为数据库的某列在用属性读取的时候做处理 class User extends Model{/*** 获取用…...