Playwright学习

学习了 Cypress 工具后,突然发现目前很流行的 Playwright,Playwright 提供了一套功能强大且灵活的工具,使得在不同浏览器上执行自动化测试变得更加容易和可靠,这使得 Playwright 成为很多开发者选择的首选工具之一。

这么厉害的工具必须看看!! 以此来记录自己学习 Playwright 过程中的一些内容。

环境准备

学习一个新的工具框架,必须优先阅读官方文档。阅读 Playwright 官方文档,考虑使用 Python + Playwright 进行学习,创建一个新的 Python虚拟环境(我使用 IDEA 进行开发,还可选择使用 VS Code / Pycharm ):

Python + Playwright

安装 Playwright: 使用 npm 进行安装。打开终端并运行以下命令:

npm init playwright@latest

命令途中需要我们对以下内容进行选择:

在 TypeScript 或 JavaScript 之间进行选择(默认为 TypeScript,TypeScript 提供了更强大的开发工具和更丰富的功能,尤其适用于大型项目和需要严格类型检查的场景,JavaScript 则更适合小型项目和快速原型开发);

您的测试文件夹的名称(如果您的项目中已有测试文件夹,则默认为测试或 e2e);

添加 GitHub Actions 工作流程以轻松在 CI 上运行测试;

安装 Playwright 浏览器(默认为 true)。

Playwright 将下载所需的浏览器并创建一些配置文件,可以在playwright.config中添加Playwright 配置,包括修改想要运行 Playwright 的浏览器。如果在现有项目中运行测试,那么依赖项将直接添加到package.json。tests文件夹包含一个基本示例测试,可帮助我们开始测试。有关更详细的示例,可查看tests-examples包含为测试待办事项应用程序而编写的测试的文件夹。

简单测试

直接快速测试tests文件夹中的基本示例:

npx playwright test

此测试在无浏览器模式下运行,这意味着运行测试时不会打开浏览器。测试结果和测试日志将显示在终端中。

测试完成后,将生成一个HTML 报告器,其中显示完整的测试报告,允许按浏览器、通过的测试、失败的测试、跳过的测试和不稳定测试来过滤报告。可以单击每个测试并探索测试的错误以及测试的每个步骤。默认情况下,如果某些测试失败,将自动打开 HTML 报告。

HTML报告

UI模式

即为headful 模式: 在此模式下,可以看到浏览器界面,就像正常使用浏览器一样。这对于调试和观察测试执行过程非常有帮助。

npx playwright test --ui

Playwright UI模式

Playwright + Python

Playwright 的原生版本是用 TypeScript 编写的,并提供了 JavaScript 和 TypeScript 的 API,因此可以使用这两种语言来编写测试脚本。Playwright 还提供了 Python 版本的 API,可以使用 Python 编写和执行自动化测试脚本。

使用Python版本,需pip导入所需要的playwright:

pip install playwright

之后就可以import相应的如playwright模块中的函数,使用 Python 语言编写相应的端到端测试。

同步与异步

在使用 Playwright + Python 进行自动化测试时,可以选择同步或异步编程风格,具体取决于个人偏好和项目的需求。

同步编程:

在同步编程中,代码按照顺序执行,每个操作都会等待前一个操作完成后再执行下一个操作。使用同步编程风格编写的代码通常更易于理解和调试,因为它们是线性执行的。在 Python 中,可以使用同步的方式来编写 Playwright 测试,例如使用time.sleep()来等待页面加载完成或执行其他操作。

import time

from playwright.sync_api import sync_playwright #同步

with sync_playwright() as p:

    browser = p.chromium.launch()

    page = browser.new_page()

    page.goto("https://www.baidu.com")

    time.sleep(2) # 等待 2 秒

    browser.close()

异步编程:

在异步编程中,代码可以并发执行,不必等待前一个操作完成就可以执行下一个操作。这样可以提高程序的性能和响应速度。使用异步编程风格编写的代码通常更适合处理大量的并发任务。在 Python 中,可以使用asyncio库和异步版本的 Playwright API 来编写异步代码。

import asyncio

from playwright.async_api import async_playwright

async def main():

    async with async_playwright() as p:

        browser = await p.chromium.launch()

        page = await browser.new_page()

        await page.goto("https://www.baidu.com") # 在异步编程中,可以使用 await 来等待异步操作完成

        await asyncio.sleep(2) # 等待 2 秒

        await browser.close()

asyncio.run(main())

await

在 Python 的异步编程中,使用 await 关键字是为了让当前协程暂停执行,等待另一个协程完成后再继续执行。如果不使用 await,而是直接调用异步函数,会导致当前协程立即执行下一行代码,而不等待异步操作完成,这可能会导致错误或不符合预期的行为。

在这个例子中,如果不使用await,而是直接调用异步函数,会导致当前协程立即执行下一行代码,而不等待异步操作完成。具体来说,如果不使用await来等待异步操作p.chromium.launch()、browser.new_page()和page.goto()完成,而是直接调用它们,可能会导致以下问题:

浏览器对象可能尚未完全初始化:在调用p.chromium.launch()后,浏览器对象可能尚未完全初始化,如果不等待它初始化完成,直接调用browser.new_page(),可能会导致浏览器对象尚未准备好,从而引发错误。

页面可能尚未加载完成:在调用page.goto()后,页面可能尚未完全加载完成,如果不等待页面加载完成,直接执行后续操作,可能会导致页面尚未准备好,从而导致无法获取到预期的页面内容。

浏览器对象可能尚未关闭:在调用browser.close()后,如果不等待浏览器对象关闭完成,直接执行后续操作,可能会导致浏览器对象尚未完全关闭,从而造成资源泄漏或其他问题。

综上所述,不使用await来等待异步操作完成,可能会导致程序无法按预期执行,出现错误或不符合预期的行为。因此,在异步编程中,使用await是确保异步操作按顺序执行和完成的关键。

总的来说,同步编程更直观易懂,而异步编程更适合处理大规模的并发任务。在选择编程风格时,需要考虑项目的需求、复杂度和性能要求。

Playwright codegen

Playwright 的 codegen 是一个非常实用的工具,它可以帮助我们自动生成执行浏览器操作的代码。该工具可以在浏览器中记录用户的交互操作,并将其转换为 Playwright 脚本,这样可以大大简化编写自动化测试脚本的过程。

npx playwright codegen <url>

命令生成的代码为 TypeScript 是因为 Playwright 本身是使用 TypeScript 编写的,因此默认情况下,codegen 工具生成的代码也是 TypeScript。

如果想要生成 Python 语言的代码,可以在执行 codegen 命令时,通过指定--target参数来指定生成的代码语言。例如:

npx playwright codegen --target=python <url>

这样就可以生成 Python 语言的代码了。同时,Playwright 的 codegen 工具会根据项目环境和执行上下文来选择适当的脚本语言。具体来说,如果项目中已经存在 TypeScript 或 Python 文件,那么 codegen 工具可能会选择与项目中已有文件相同的脚本语言。这样可以保持项目的一致性,并减少集成和维护的复杂性。在执行 codegen 工具时,它会检查当前的执行上下文。例如,如果在 TypeScript 环境中运行 codegen 工具,它可能会自动选择生成 TypeScript 代码。同样地,如果在 Python 环境中运行 codegen 工具,它可能会自动选择生成 Python 代码。

因为我的项目环境为 Python,当我直接使用

playwright codegen <url>

可以直接生成 Python 语言的代码。

同时,codegen还支持很多不同的参数,如:

--device: 指定要模拟的设备类型(例如,iPhone X、iPad、Galaxy S5)。

--geolocation: 指定地理位置坐标,格式为纬度和经度,例如37.7749,-122.4194。

--permissions: 指定要授予的权限,例如geolocation、notifications、midiSysex。

--lang: 指定要使用的语言代码,例如en-US、zh-CN。

--proxy: 指定代理服务器的地址和端口。

可以查阅官方文档使用这些参数。

Playwright Insepctor

在 Playwright Insepctor 中,我们可以直接生成包括 Pytest 或者async异步等不同类型的代码(👍),之后还会学习 Pytest + Playwright的内容。

通过检查器生成不同类型的代码
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343