python+playwright 学习-1.环境准备与快速开始

前言

说到 web 自动化,大家最熟悉的就是 selenium 了,selenium 之后又出现了三个强势的框架Puppeteer、CyPress、TestCafe, 但这3个都需要掌握 JavaScript 语言,所以只是少部分人在用。

2020年微软开源一个 UI 自动化测试工具 Playwright,  支持 Node.js、Python、C# 和 Java 语言。

为什么要学 Playwright ?

selenium 在国内普及程度非常高,说到 web 自动化很多人第一个就会想到 selenium,它的出现确实是给整个行业带来了很多的影响。
支持多语言,开源的框架,可以兼容多种浏览器,上手非常容易。

那么现在微软推出的 Playwright 到底有没必要去学呢?先看下官方介绍https://playwright.dev/python/

跨浏览器和平台

跨浏览器。

Playwright 支持所有现代渲染引擎,包括 Chromium、WebKit 和 Firefox。

跨平台。

在 Windows、Linux 和 macOS 上进行本地测试或在 CI 上进行无头或有头测试。

跨语言。

在TypeScript、JavaScript、Python、.NET、Java中使用 Playwright API 。

测试移动网络。

适用于 Android 和 Mobile Safari 的 Google Chrome 浏览器的本机移动仿真。

相同的渲染引擎适用于您的桌面和云端。

稳定性

自动等待。

Playwright 在执行动作之前等待元素可操作。

它还具有一组丰富的内省事件。

两者的结合消除了人为超时的需要——这是不稳定测试的主要原因。

Web优先断言。

Playwright 断言是专门为动态网络创建的。

检查会自动重试,直到满足必要的条件。

追踪。

配置测试重试策略,捕获执行跟踪、视频、屏幕截图以消除薄片。

运行机制

浏览器在不同进程中运行属于不同来源的 Web 内容。Playwright 与现代浏览器架构保持一致,并在进程外运行测试。这使得 Playwright 摆脱了典型的进程内测试运行器的限制。

多重一切。

测试跨越多个选项卡、多个来源和多个用户的场景。

为不同的用户创建具有不同上下文的场景,并在您的服务器上运行它们,所有这些都在一次测试中完成。

可信事件。

悬停元素,与动态控件交互,产生可信事件。

Playwright 使用与真实用户无法区分的真实浏览器输入管道。

测试框架,穿透 Shadow DOM。

Playwright 选择器穿透影子 DOM 并允许无缝地输入帧。

完全隔离-快速执行

浏览器上下文。

Playwright 为每个测试创建一个浏览器上下文。

浏览器上下文相当于一个全新的浏览器配置文件。

这提供了零开销的完全测试隔离。

创建一个新的浏览器上下文只需要几毫秒。

登录一次。

保存上下文的身份验证状态并在所有测试中重用它。

这绕过了每个测试中的重复登录操作,但提供了独立测试的完全隔离。

强大的工具

代码生成器。

通过记录您的操作来生成测试。

将它们保存为任何语言。

调试。

检查页面、生成选择器、逐步执行测试、查看点击点、探索执行日志。

跟踪查看器。

捕获所有信息以调查测试失败。

Playwright 跟踪包含测试执行截屏、实时 DOM 快照、动作资源管理器、测试源等等。

环境准备

Playwright 是专门为满足端到端测试的需要而创建的。Playwright 支持所有现代渲染引擎,包括 Chromium、WebKit 和 Firefox。在 Windows、Linux 和 macOS 上进行本地测试或在 CI 上进行测试.

python 版本要求 python3.7+ 版本。

安装 playwright:

pip install playwright

安装所需的浏览器 chromium,firefox 和 webkit:

playwright install

仅需这一步即可安装所需的浏览器,并且不需要安装驱动包了(解决了selenium启动浏览器,总是要找对应驱动包的痛点)

简单使用

安装后,您可以在 Python 脚本中使用 Playwright,并启动 3 种浏览器中的任何一种(chromium,firefox和webkit)。

启动浏览器并打开百度页面

from playwright.sync_api import sync_playwright
# 咖啡加剁椒 
# blog:https://www.cnblogs.com/yoyoketang/with sync_playwright() as p:browser = p.chromium.launch(headless=False)          # 启动 chromium 浏览器page = browser.new_page()              # 打开一个标签页page.goto("https://www.baidu.com")     # 打开百度地址print(page.title())                    # 打印当前页面titlebrowser.close()                        # 关闭浏览器对象

Playwright 支持2种运行方式:同步和异步。如果您的现代项目使用asyncio,您应该使用 async API:

以下是异步运行方式

import asyncio
from playwright.async_api import async_playwright
# 咖啡加剁椒
# blog:https://www.cnblogs.com/yoyoketang/async def main():async with async_playwright() as p:browser = await p.chromium.launch(headless=False)page = await browser.new_page()await page.goto("https://www.baidu.com")print(await page.title())await browser.close()asyncio.run(main())

headless 模式

默认情况下,Playwright 以无头模式运行浏览器。要查看浏览器 UI,请headless=False在启动浏览器时传递标志。

headless 无头模式运行浏览器示例:

from playwright.sync_api import sync_playwright
# 咖啡加剁椒 
# blog:https://www.cnblogs.com/yoyoketang/with sync_playwright() as p:browser = p.chromium.launch()          # 启动 chromium 浏览器page = browser.new_page()              # 打开一个标签页page.goto("https://www.baidu.com")     # 打开百度地址print(page.title())                    # 打印当前页面titlebrowser.close()                        # 关闭浏览器对象

关于等待

Playwright 打开浏览器运行脚本的速度那就是一个字:快!

您还可以用来slow_mo (单位是毫秒)减慢执行速度。它的作用范围是全局的,从启动浏览器到操作元素每个动作都会有等待间隔,方便在出现问题的时候看到页面操作情况。

chromium.launch(headless=False, slow_mo=50)

使用示例

from playwright.sync_api import sync_playwright
# 咖啡加剁椒 
# blog:https://www.cnblogs.com/yoyoketang/with sync_playwright() as p:browser = p.chromium.launch(headless=False)page = browser.new_page()page.goto("https://www.baidu.com")print(page.title())page.fill('#kw', "程序员")page.click('#su')browser.close()

运行后会发现每个操作都会有间隔时间。

time.sleep() 不再使用

Playwright 在查找元素的时候具有自动等待功能,如果你在调试的时候需要使用等待,你应该使用page.wait_for_timeout(5000) 代替 time.sleep(5)并且最好不要等待超时。

from playwright.sync_api import sync_playwright
# 咖啡加剁椒
# blog:https://www.cnblogs.com/yoyoketang/with sync_playwright() as p:browser = p.chromium.launch(headless=False, slow_mo=1000)page = browser.new_page()page.goto("https://www.baidu.com")print(page.title())# 等待5秒page.wait_for_timeout(5000)page.fill('#kw', "程序员")page.click('#su')browser.close()

请使用 wait( wait_for_timeout) 方法而不是time模块。这是因为我们内部依赖于异步操作,并且在使用时time.sleep(5)无法正确处理它们。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/606116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端设计】文字聚光灯

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 案例 文字聚光灯效果可以用于网站标题 html <!DOCTYPE html> <html lang"en&quo…

书生·浦语第二次作业

我最近在参加书生浦语大模型实战营&#xff0c;这是第二次作业打卡&#xff01; 如果你也想两周玩转大模型微调&#xff0c;部署与测评全链路。报名链接&#xff1a;invite 书生浦语大模型实战营报名 邀请码可以填026014 1. 基础作业&#xff08;一&#xff09;&#xff1a;…

什么是检索增强生成 (RAG)

什么是 RAG RAG&#xff0c;即检索增强生成&#xff0c;是一种将预训练的大型语言模型的功能与外部数据源相结合的技术。这种方法将 GPT-3 或 GPT-4 等 LLM 的生成能力与专用数据搜索机制的精确性相结合&#xff0c;从而形成一个可以提供细微响应的系统。 本文更详细地探讨了…

QTDAY1

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> #include <QLabel> #include <QMovie> #include <QLineEdit> #include <QPushButton> class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *p…

探寻智能酒精壁炉在人类文化传承和精神需求中的重要意义

真火壁炉在人类文明中扮演着至关重要的角色&#xff0c;它不仅是温暖与照明的来源&#xff0c;更承载着人类的情感、记忆和文化传承。从古至今&#xff0c;真火壁炉一直都是家庭和社区聚集的焦点&#xff0c;象征着温暖、交流与家庭团聚。并且随着科技的进步&#xff0c;能使用…

SkyWalking介绍和Docker环境下部署

一、Skywalking概述 1、Skywalking介绍 Skywalking是分布式系统的应用程序性能监视工具&#xff0c;专为微服务&#xff0c;云原生架构和基于容器&#xff08;Docker&#xff0c;K8S,Mesos&#xff09;架构而设计&#xff0c;它是一款优秀的APM&#xff08;Application Perfo…

Halcon灰度的平均值和偏差intensity

Halcon灰度的平均值和偏差 intensity 算子用于计算单张图像上多个区域的灰度值的平均值和偏差。该算子的原型如下&#xff1a; intensity (Regions, Image ::: Mean, Deviation )其各参数的含义如下。 参数1&#xff1a;Regions&#xff08;输入参数&#xff09;&#xff0c;…

harmonyOS 时间选择组件(TimePicker)

本文 我们来说 TimePicker 时间组件 首先 我们搭一个最基本的组件骨架 Entry Component struct Index {build() {Row() {Column() {}.width(100%)}.height(100%)} }然后 在 Column 组件内 放一个 TimePicker进去 这里 我们就可以看到 一个时间的选择器了 DatePicker 捕获当前…

孪生神经网络MATLAB实战[含源码]

​一、算法原理 孪生神经网络&#xff08; Siamese neural network&#xff09;是一种深度学习网络&#xff0c;它使用两个或多个具有相同架构、共享相同参数和权重的相同子网。孪生网络通常用于寻找两个可比较事物之间的关系的任务。孪生网络的一些常见应用包括面部识别、签名…

node.js+mysql旅游景点分享网站-计算机毕业设计源码03796

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。旅游景点分享网站设计&#xff0c;主要的模块包括查看后台首页、轮播图&#xff08;轮播图管理&#xff09;、网站公告管理&#xff08;网站公告…

AQS 抽象队列同步器

AQS AQS &#xff08;抽象队列同步器&#xff09;&#xff1a; AbstractQueuedSynchronizer 是什么 来自jdk1.5&#xff0c;是用来实现锁或者其他同步器组件的公共基础部分的抽象实现&#xff0c;是重量级基础框架以及JUC的基石&#xff0c;主要用于解决锁分配给谁的问题整体…

Linux第17步_安装SSH服务

secure shell protocol简称SSH。 目的&#xff1a;在进行数据传输之前&#xff0c;SSH先对联级数据包通过加密技术进行加密处理&#xff0c;然后再进行数据传输&#xff0c;确保数据传输安全。 1、在安装前&#xff0c;要检查虚拟机可以上网&#xff0c;否则可能会导致安装失…

电商带货品牌直播间SOP运营执行步骤

【干货资料持续更新&#xff0c;以防走丢】 电商带货品牌直播间SOP运营执行步骤 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 直播运营模板合集&#xff08;完整资料包含以下内容&#xff09; 目录 直播业务商业框架.png直播工作流程SOP梳理.xlsx 2023年抖…

HubSpot的内容管理系统(CMS)好用吗?

HubSpot的内容管理系统&#xff08;CMS&#xff09;通常被认为是功能强大且用户友好的工具&#xff0c;尤其适用于数字营销和在线业务。以下是一些HubSpot CMS的优势和功能&#xff1a; 用户友好的编辑界面&#xff1a; HubSpot CMS提供直观的编辑界面&#xff0c;具有拖放式编…

数字藏品如何赋能线下实体?以 BOOMSHAKE 潮流夜店为例

此篇为报告内容精华版&#xff0c;更多详细精彩内容请点击 完整版 在数字化浪潮的推动下&#xff0c;品牌和企业正在迎来一场前所未有的变革。传统市场营销策略逐渐让位于新兴技术&#xff0c;特别是非同质化代币&#xff08;NFT&#xff09;的应用。这些技术不仅改变了品牌资…

scala 安装和创建项目

Scala&#xff0c;一种可随您扩展的编程语言&#xff1a;从小型脚本到大型多平台应用程序。Scala不是Java的扩展&#xff0c;但它完全可以与Java互操作。在编译时&#xff0c;Scala文件将转换为Java字节码并在JVM&#xff08;Java虚拟机&#xff09;上运行。Scala被设计成面向对…

【JAVA】Iterator 怎么使用?有什么特点

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 Iterator 接口的主要方法&#xff1a; 例子 特点&#xff1a; 结语 我的其他博客 前言 在编程的世界里&#xff0c;迭代…

DTM分布式事务

DTM分布式事务 从内网看到了关于事务在业务中的讨论&#xff0c;评论区大佬有提及DTM开源项目[https://dtm.pub/]&#xff0c;开学开学 基础理论 一、Why DTM ​ 项目产生于实际生产中的问题&#xff0c;涉及订单支付的服务会将所有业务相关逻辑放到一个大的本地事务&#xff…

卷积神经网络|迁移学习-猫狗分类完整代码实现

还记得这篇文章吗&#xff1f;迁移学习|代码实现 在这篇文章中&#xff0c;我们知道了在构建模型时&#xff0c;可以借助一些非常有名的模型&#xff0c;这些模型在ImageNet数据集上早已经得到了检验。 同时torchvision模块也提供了预训练好的模型。我们只需稍作修改&#xf…

qtday1(2024/1/8)

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QMainWindow(parent) {//设置界面固定大小this->resize(1728,972);this->setFixedSize(1728,972);this->setWindowIcon(QIcon("C:\\Users\\78507\\Desktop\\pic\\qq1.png"));this->…