最新出炉 -Web自动化测试之playwright:概述

news2024/9/28 11:17:13

概述

playwright是由微软开发的Web UI自动化测试工具, 支持Node.js、Python、C# 和 Java语言,本文将介绍playwright的特性以及它的简单使用。

playwright特性

playwright具有以下特点:

一、支持所有主流浏览器

  • 支持所有主流浏览器:基于Chromium内核的Google Chrome 和 Microsoft Edge浏览器), WebKit内核的Apple Safari 和 Mozilla Firefox浏览器,不支持IE11。
  • 跨平台:Windows、Linux 和macOS
  • 可用于模拟移动端WEB应用的测试,不支持在真机上测试。
  • 支持无头模式(默认)和有头模式
     

二、快速可靠的执行

  • 自动等待元素
  • Playwright基于Websocket协议,可以接受浏览器(服务端)的信号。selenium采用的是HTTP协议,只能客户端发起请求。
  • 浏览器上下文并行:单个浏览器实例下创建多个浏览器上下文,每个浏览器上下文可以处理多个页面。
  • 有弹性的元素选择:可以使用文本、可访问标签选择元素。

三、强大的自动化能力

  • playwright是一个进程外自动化驱动程序,它不受页面内JavaScript执行范围的限制,可以自动化控制多个页面。
  • 强大的网络控制:Playwright 引入了上下文范围的网络拦截来存根和模拟网络请求。
  • 现代web特性:支持Shadow DOM选择,元素位置定位,页面提示处理,Web Worker等Web API。
  • 覆盖所有场景:支持文件下载、上传、OOPIF(out-of-process iframes),输入、点击,暗黑模式等。
     

安装

Playwright有Node.js、Python、C# 和 Java语言版本,本文介绍Python版本的Playwright使用方法。

Playwright的Python版本仓库地址:https://github.com/microsoft/playwright-python

官方文档地址:Getting started | Playwright Python

Playwright安装简单,pip安装时会自动下载浏览器驱动:

 
  1. pip install playwright

  2. playwright install # 安装支持的浏览器:cr, chromium, ff, firefox, wk 和 webkit

  3. playwright install chromium # 安装指定的chromium浏览器

安装时会自动下载浏览器依赖,windows系统在%USERPROFILE%\AppData\Local\ms-playwright 路径下。

命令行工具

脚本录制

在命令行窗口使用如下语法格式进行脚本录制:

npx playwright codegen [options] [url]

options参数:

-o, --output <file name> :保存生成脚本
--target <language> :生成的脚本语言,可以设置javascript, test, python, python-async和csharp,默认为python。
-b, --browser <browserType> :要使用的浏览器,可以选择cr, chromium, ff, firefox, wk和webkit,默认chromium。
--channel <channel>:chromium版本,比如chrome, chrome-beta, msedge-dev等,
--color-scheme <scheme>:模拟器的颜色主题,可选择light 或者 dark样式。
--device <deviceName> :模拟的设备,比如iPhone 11。
--save-storage <filename> :保存上下文状态,用于保存cookies 和localStorage,可用它来实现重用。例如playwright codegen --save-storage=auth.json
--load-storage <filename> :加载--save-storage 保存的数据,重用认证数据。
--proxy-server <proxy> :指定代理服务器
--timezone <time zone> : 指定时区
--geolocation <coordinates> :指定地理位置坐标
--lang <language> :指定语言/地区,比如中国大陆:zh-CN
--timeout <timeout> :超时时间,定位毫秒,默认10000ms
--user-agent <ua string> :用户代理
--viewport-size <size> :浏览器窗口大小
-h, --help :查看帮助信息

 示例:模拟iPhone 12 Pro设备打开百度,使用Chromium驱动,生成的脚本语言设置为python,保存名称为test_playwright.py:

playwright codegen -o test_playwright.py --target python  -b chromium --device="iPhone 12 Pro" https://www.baidu.com/

对页面进行的操作会生成对应脚本代码。

打开网页

语法格式:

npx playwright open [options] [url]

除了没有 -o 和 --target options参数外,playwright open 支持 playwright codegen 的其它参数。

 
  1. playwright open https://www.baidu.com/ # 默认使用Chromium打开

  2. playwright wk https://www.baidu.com/ # 使用WebKit打开

  3. playwright open --device="iPhone 12 Pro" https://www.baidu.com/ # 使用iPhone 12 Pro模拟器打开

截图

语法格式:

npx playwright open [options] [url]

除了没有 -o 和 --target options参数外,playwright open 支持 playwright codegen 的其它参数。

 
  1. playwright open https://www.baidu.com/ # 默认使用Chromium打开

  2. playwright wk https://www.baidu.com/ # 使用WebKit打开

  3. playwright open --device="iPhone 12 Pro" https://www.baidu.com/ # 使用iPhone 12 Pro模拟器打开

截图

语法格式:

npx playwright screenshot [options] <url> <filename>

options参数和 playwright codegen 的选项类似,可以使用 playwright screenshot --help 命令查看。

 
  1. playwright screenshot --device="iPhone 12 Pro" -b wk https://www.baidu.com/ baidu-iphone.png # 截取显示的页面

  2. playwright screenshot --full-page --device="iPhone 12 Pro" -b wk https://www.baidu.com/ baidu-iphone-full-page.png # 截取当前全部页面

同步和异步API

Playwright支持同步和异步两种API,使用异步API需要导入asyncio库,它是一个可以用来实现Python协程的库,

下面介绍如何使用python语言编写简单的playwright自动化脚本。

一共有2条测试用例,用例1步骤如下:

  1. chrome浏览器打开百度
  2. 搜索框输入“test”
  3. 点击百度一下搜索
  4. 点击搜索结果的第2页

用例2步骤:

  1. chrome浏览器打开搜狗搜索
  2. 搜索框输入“test”
  3. 点击搜狗搜索
  4. 点击搜索结果的第2页

1、同步方式

 
  1. import time

  2. from playwright.sync_api import sync_playwright

  3. def testcase1():

  4. print('testcase1 start')

  5. with sync_playwright() as p:

  6. browser = p.chromium.launch(headless=False)

  7. page = browser.new_page()

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

  9. print(page.title())

  10. page.fill("input[name=\"wd\"]", "test")

  11. page.click("text=百度一下")

  12. page.click("#page >> text=2")

  13. browser.close()

  14. print('testcase1 done')

  15. def testcase2():

  16. print('testcase2 start')

  17. with sync_playwright() as p:

  18. browser2 = p.chromium.launch(headless=False)

  19. page2 = browser2.new_page()

  20. page2.goto("https://www.sogou.com/")

  21. print(page2.title())

  22. page2.fill("input[name=\"query\"]", "test")

  23. page2.click("text=搜狗搜索")

  24. page2.click("#sogou_page_2")

  25. browser2.close()

  26. print('testcase2 done')

  27. start = time.time()

  28. testcase1()

  29. testcase2()

  30. end = time.time()

  31. print('Running time: %s Seconds'%(end-start))

执行结果:

 
  1. testcase1 start

  2. 百度一下,你就知道

  3. testcase1 done

  4. testcase2 start

  5. 搜狗搜索引擎 - 上网从搜狗开始

  6. testcase2 done

  7. Running time: 11.476110458374023 Seconds

2、异步方式

 
  1. import asyncio

  2. import time

  3. from playwright.async_api import async_playwright

  4. async def testcase1():

  5. print('testcase1 start')

  6. async with async_playwright() as p:

  7. browser = await p.chromium.launch(headless=False)

  8. page = await browser.new_page()

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

  10. print(await page.title())

  11. await page.fill("input[name=\"wd\"]", "test")

  12. await page.click("text=百度一下")

  13. await page.click("#page >> text=2")

  14. await browser.close()

  15. print('testcase1 done')

  16. async def testcase2():

  17. print('testcase2 start')

  18. async with async_playwright() as p:

  19. browser2 = await p.chromium.launch(headless=False)

  20. page2 = await browser2.new_page()

  21. await page2.goto("https://www.sogou.com/")

  22. print(await page2.title())

  23. await page2.fill("input[name=\"query\"]", "test")

  24. await page2.click("text=搜狗搜索")

  25. await page2.click("#sogou_page_2")

  26. await browser2.close()

  27. print('testcase2 done')

  28. async def main():

  29. task1 = asyncio.create_task(testcase1())

  30. task2 = asyncio.create_task(testcase2())

  31. tasks = [task1,task2]

  32. print('before await')

  33. await asyncio.gather(*tasks)

  34. start = time.time()

  35. asyncio.run(main())

  36. end = time.time()

  37. print('Running time: %s Seconds'%(end-start))

执行结果:

  1. before await

  2. testcase1 start

  3. testcase2 start

  4. 百度一下,你就知道

  5. 搜狗搜索引擎 - 上网从搜狗开始

  6. testcase1 done

  7. testcase2 done

  8. Running time: 6.0248863697052 Seconds

可以看到,使用异步编程的方式可以显著提升测试效率。

浏览器

前面提到过,Playwright支持所有主流浏览器,下面介绍4种浏览器的启动方法:

 
  1. # chrome

  2. browser = p.chromium.launch(channel="chrome", headless=False)

  3. # Microsoft Edge

  4. browser = p.chromium.launch(channel="msedge", headless=False)

  5. # firefox

  6. browser = p.firefox.launch(headless=False)

  7. # webkit

  8. browser = p.webkit.launch(headless=False)

浏览器上下文

在进行web自动化控制之前需要对浏览器进行实例化,比如:

browser = p.chromium.launch(channel="chrome", headless=False)

browser是一个Chromium实例,创建实例其实是比较耗费资源的,Playwright支持在一个browser实例下创建多个浏览器上下文(BrowserContext),BrowserContext的创建速度很快,并且比创建browser实例消耗资源更少。对于多页面场景可以使用创建浏览器上下文的方式。

 
  1. import asyncio

  2. from playwright.async_api import async_playwright

  3. async def testcase1():

  4. print('testcase1 start')

  5. async with async_playwright() as p:

  6. browser = await p.chromium.launch(headless=False)

  7. page = await browser.new_page()

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

  9. print(await page.title())

  10. await page.fill("input[name=\"wd\"]", "test")

  11. await page.click("text=百度一下")

  12. await page.click("#page >> text=2")

  13. context = await browser.new_context()

  14. page2 = await context.new_page()

  15. await page2.goto("https://www.sogou.com/")

  16. print(await page2.title())

  17. await page2.fill("input[name=\"query\"]", "test")

  18. await page2.click("text=搜狗搜索")

  19. await page2.click("#sogou_page_2")

  20. print(await page.title())

  21. print('testcase1 done')

  22. asyncio.run(testcase1())

多页面

一个浏览器上下文可以有多个页面,也就是多个窗口。

 
  1. async def testcase2():

  2. print('testcase2 start')

  3. async with async_playwright() as p:

  4. browser = await p.chromium.launch(headless=False)

  5. context = await browser.new_context()

  6. page1 = await context.new_page()

  7. await page1.goto("https://www.sogou.com/")

  8. print(await page1.title())

  9. await page1.fill("input[name=\"query\"]", "test")

  10. await page1.click("text=搜狗搜索")

  11. await page1.click("#sogou_page_2")

  12. page2 = await context.new_page()

  13. await page2.goto("https://www.baidu.com/")

  14. print(await page2.title())

  15. print('testcase2 done')

断言

Python中可以使用assert 进行断言:

assert page.title() == "百度一下,你就知道"

除了使用assert断言以外,还可以使用功能更加强大的断言方法Hamcrest ,具有丰富的断言匹配器。

Hamcrest文档:PyHamcrest Tutorial — PyHamcrest 2.0.2 documentation

安装PyHamcrest:

pip install PyHamcrest
 
  1. from hamcrest import *

  2. assert_that(page.title(), equal_to("百度一下,你就知道"))

playwright Robot Framework库

如果你使用robot framework来管理和编写测试用例,可以使用robotframework-browser测试库。

browser测试库的github地址:https://github.com/MarketSquare/robotframework-browser, 安装方法参考README.md文档。

关键字使用说明文档:https://marketsquare.github.io/robotframework-browser/Browser.html

安装失败:
https://github.com/MarketSquare/robotframework-browser/issues/682

可能是node版本太高,可以使用node v12.9.1版本
 

常见报错

Node版本问题

 
  1. Node.js is only supported on Windows 8.1, Windows Server 2012 R2, or higher.

  2. Setting the NODE_SKIP_PLATFORM_CHECK environment variable to 1 skips this

  3. check, but Node.js might not execute correctly. Any issues encountered on

  4. unsupported platforms will not be fixed.Traceback (most recent call last):

  5. File "test.py", line 112, in <module>

  6. p = RobotPlaywright()

  7. File "test.py", line 29, in __init__

  8. self.playwright = sync_playwright().start()

  9. File "D:\attrobot3\lib\site-packages\playwright\sync_api\_context_manager.py",

  10. line 76, in start

  11. return self.__enter__()

  12. File "D:\attrobot3\lib\site-packages\playwright\sync_api\_context_manager.py",

  13. line 71, in __enter__

  14. playwright = self._playwright

  15. AttributeError: 'PlaywrightContextManager' object has no attribute '_playwright'

  16. Task was destroyed but it is pending!

  17. task: <Task pending coro=<Connection.run.<locals>.init() running at D:\attrobot3

  18. \lib\site-packages\playwright\_impl\_connection.py:175> wait_for=<Future pending

  19. cb=[<TaskWakeupMethWrapper object at 0x0000000003199288>()]>>

如果是windows7系统,错误原因可能是node版本太高,v12.16.2以上版本不支持win7,node历史版本下载地址:Index of /dist/。

卸载安装低版本后再次执行脚本,如果还是报上面的错误,可以尝试设置系统变量 NODE_SKIP_PLATFORM_CHECK 绕过校验。

set NODE_SKIP_PLATFORM_CHECK=1

安装msedge报错

 
  1. $ playwright install msedge

  2. 无法加载文件 C:\Program Files\Python37\Lib\site-packages\playwright\driver\package\bin\reinstall_msedge_stable_win.ps1,因为在此系统中禁止执行脚本。有关详细信息,请参阅 "get-help about_signing"。

  3. + CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordE

  4. xception

  5. + FullyQualifiedErrorId : RuntimeException

解决方案:
打开 Windows PowerShell,执行如下命令:

set-ExecutionPolicy RemoteSigned

重新执行 playwright install msedge 命令安装。 

  最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

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

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

相关文章

从开发到集成:视频美颜SDK与直播美颜API详解

在本文中&#xff0c;我们将详细探讨视频美颜SDK的开发过程及其与直播美颜API的集成方案&#xff0c;帮助开发者更好地理解和应用这些技术。 一、视频美颜SDK的开发概述 视频美颜SDK是一个用于实时视频处理的开发工具包&#xff0c;提供了包括磨皮、美白、瘦脸、眼睛放大等多…

各类软件历史版本的下载地址

postman,notpad等 https://www.filehorse.com/software-developer-tools/https://www.filehorse.com/software-developer-tools/

数业智能心大陆AI大模型,共情陪伴你的心理健康

大模型的出现&#xff0c;使得AI在语音识别、自然语言处理、计算机视觉等领域的性能得到了极大的提升&#xff0c;随着硬件设备的不断升级和优化&#xff0c;以及算法的不断改进&#xff0c;大模型的规模和性能也在不断提升&#xff0c;大模型的优势在于其强大的表示能力和泛化…

不愿回流上班,离职博主们不断寻找新的“栖息地”

文 | 螳螂观察 作者 | 如意 “替大家试过了&#xff0c;不上班真的很爽。” “985本硕&#xff0c;年薪40万裸辞了。” “不干了&#xff0c;谁家好人半夜12点还在司啊&#xff01;” 标题熟悉吧&#xff1f;对&#xff0c;这拨人你一定看到了&#xff0c;说人生是旷野&am…

45+用户占比近30%,网文产业如何赋能IP长链?

网文市场加速发展&#xff0c;巨头抢占中老年用户 作者&#xff5c;吕娆炜 排版&#xff5c;张思琪 干货抢先看 1. 我国网文产业市场规模突破3000亿元&#xff0c;在用户方面&#xff0c;截至2023年底&#xff0c;我国网文用户数量达5.37亿&#xff0c;同比增长9%&#xff0c…

【FreeRTOS】信号量

0 前言 学习视频&#xff1a; 【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS&#xff08;FreeRTOS教程 基于STM32&#xff0c;以实际项目为导向&#xff09;】 【精准空降到 00:42】 https://www.bilibili.com/video/BV1Jw411i7Fz/?p39&share_sourcecopy_web&…

源2.0-M32大模型发布4bit/8bit量化版! 运行显存仅需23GB,性能可媲美LLaMA3

近日&#xff0c;浪潮信息发布源2.0-M32大模型4bit和8bit量化版&#xff0c;性能比肩700亿参数的LLaMA3开源大模型。4bit量化版推理运行显存仅需23.27GB&#xff0c;处理每token所需算力约为1.9 GFLOPs&#xff0c;算力消耗仅为同等当量大模型LLaMA3-70B的1/80。而LLaMA3-70B运…

删除Eureka注册中心已经注册的服务

1.登录Eureka查看需要删除的服务。 2.使用postman或者apipost工具&#xff0c;请求方式DELETE, 接口地址输入&#xff1a;eureka的ip地址/eureka/apps/ Application / Status 例如: http://192.168.194.60:8761/eureka/apps/VUE-MANAGER-SERVICE/10.42.0.138:vue-manager…

酷家乐 同盾滑块分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我…

【Hot100】LeetCode—114. 二叉树展开为链表

目录 1- 思路技巧——借助指针 2- 实现⭐114. 二叉树展开为链表——题解思路 3- ACM 实现 原题连接&#xff1a;114. 二叉树展开为链表 1- 思路 技巧——借助指针 思路&#xff1a;通过 ① 将左子树的右下结点的 .next ——> 拼接到当前节点的右子树上。 构造 cur 指针&a…

KPaaS还是ESB?怎样选择合适的集成方案?

在全球经济一体化和数字化转型的背景下&#xff0c;企业正面临着前所未有的挑战与机遇。随着业务的快速发展&#xff0c;企业内部的信息系统日益复杂&#xff0c;系统间的信息孤岛、系统割裂以及高昂的维护成本等问题逐渐凸显&#xff0c;严重制约了企业的创新能力和市场竞争力…

Live800:以数据驱动的客户服务优化,精准洞察,超越期待

在当今这个数字化时代&#xff0c;企业之间的竞争已不仅仅局限于产品本身的质量与功能&#xff0c;更在于如何通过卓越的客户服务体验来赢得客户的忠诚与信赖。数据&#xff0c;作为这一转型过程中的核心驱动力&#xff0c;正引领着客户服务向更加精准、高效、个性化的方向迈进…

3ds Max - 导出顶点色模型

很久之前的笔记&#xff0c;整理归档&#xff1b; 在3ds Max中&#xff0c;给模型添加VetexPaint修改器后&#xff0c;可以给模型&#xff08;顶点色通道R\G\B默认值为255\255\255&#xff09;刷不同颜色的顶点色&#xff08;默认为黑色&#xff0c;即让RGB通道都为0&#xff0…

最新SD换脸插件ReActor,视频换脸全流程!流畅丝滑!(附插件及安装报错说明)

在今天&#xff0c;我给大家继续分享一个使用“ReActor”插件来进行视频换脸的案例。 视频换脸的思路其实也很简单&#xff0c;其实就是把视频的每一帧都提取出来&#xff0c;然后把每一帧的图片都进行换脸&#xff0c;最后重新把这些图片重新合成一个视频。 废话不多说&…

下载bison操作步骤

bison官网链接 bison-3.8.2官网源代码下载链接 选择下载版本

strchr 和 strrchr

char *strchr(const char *s, int c); 在 s 中查找第一次出现字符c的位置&#xff0c;返回指向找到的位置&#xff0c;找不到返回null。 char *strrchr(const char *s, int c); 在 s 中查找最后一次出现字符c的位置&#xff0c;返回指向找到的位置&#xff0c;找不到返回null。…

用Python插入SVG到PDF文档

将SVG&#xff08;可缩放矢量图形&#xff09;文件插入到PDF&#xff08;便携式文档格式&#xff09;文件中不仅能够保留SVG图像的矢量特性&#xff0c;确保图像在任何分辨率下都保持清晰&#xff0c;还能够充分利用PDF格式在跨平台文档分享方面的优势&#xff0c;使得技术文档…

解决 mfc140.dll 文件丢失的问题,5种mfc140.dll解决方法

当您尝试启动一个用 Microsoft Visual Studio 2015 开发的 Windows 应用程序时&#xff0c;如果出现“无法找到 mfc140.dll 文件”的错误&#xff0c;请不要紧张。这类问题通常由DLL文件缺失、损坏或未正确安装引起。好消息是&#xff0c;存在多种解决方案可以帮助您解决这一挑…

打卡学习Python爬虫第五天|Xpath解析的使用

什么是Xpath&#xff1f;是在XML文档中搜索内容的一门语言&#xff0c;HTML可以看作是xml的一个子集。 目录 1、安装lxml模块 2、导入lxml中的etree子模块 3、Xpath使用方法 3.1.选择节点 3.2.选择属性 3.3.选择文本内容 3.4.使用通配符*过滤节点 3.5.使用中括号[]索引…

半个小时写一个自动发朋友圈的工具

最近一直在完善我的手控达人系统&#xff0c;解决了很多难题。白天没事时想思路&#xff0c;晚上写代码验证。这不昨天又加了一个发朋友圈功能。自动发朋友圈&#xff0c;点赞功能。 效果请看:【微信自动发朋友圈&#xff0c;一键发朋友圈&#xff0c;点赞&#xff0c;金币&…