最近在做一些接口测试和数据调试相关的事情,本来想使用HttpClient模拟POST、GET进行操作,但是有一些前端逻辑无法模拟,准备用Python+Selenium来实现。无奈Ptyhon处于半桶水,有很多想法去实现还要找一些资料。正翻着资料,微软官方出的Playwright进入到了我的视野。本文用于记录在使用过程中的一些问题。
首先,简单的将当前流行的几个测试框架进行一个对比:
库 | Selenium | Puppeteer | Playwright |
---|---|---|---|
JavaScript 支持 | 官方支持 | 官方支持 | 官方支持 |
Python 异步支持 | 无 | 第三方,而且 bug 不少 | 官方支持 |
Python 同步支持 | 官方支持 | 无 | 官方支持 |
维护者 | 社区 | 微软 | |
可操作性浏览器 | Chrome/Firefox/Safari/Edge | Chrome/Firefox | Chrome/Firefox/Safari/Edge |
模拟操作丰富度 | 一般 | 极好 | 很好 |
Cookie 支持 | 一般 | 一般 | API 非常友好 |
代理切换支持 | 一般 | 一般 | 极好 |
开始使用
# 安装 Playwright 工具
dotnet tool install --global Microsoft.Playwright.CLI
# 创建项目
dotnet new console -n PlaywrightDemo
cd PlaywrightDemo
# 安装依赖
dotnet add package Microsoft.Playwright
# 用Playwright 工具安装浏览器
playwright install
# 运行项目(PlaywrightDemo)
dotnet run
以上主要是常规使用说明,在这之外,我从编写、调试、发布、运行也遇到了很多操作上的问题。
在新的环境中部署
# 安装 Playwright 工具
dotnet tool install --global Microsoft.Playwright.CLI
# 用Playwright 工具安装浏览器(要在项目部署的目录)
dotnet Microsoft.Playwright.dll -- install
在这就会有一个问题,就是你发布的目录中要包含:Microsoft.Playwright.runtimeconfig.json
文件,不然会报错。
其它一些操作
// 创建Chromium浏览器实例
await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions()
{
Headless = false, // 关闭无头模式(有界面)
Channel = "chrome", // 指定采用chrome浏览器类型
Devtools = true, // 启用开发者工具
ChromiumSandbox = false, // 关闭浏览器沙盒
ExecutablePath = string.Empty, // 不指定浏览器可执行文件位置,会自动寻找 ms-playwright 下载的浏览器
Args = new[] { "--enable-automation=true", "--disable-blink-features=AutomationControlled" }, // 防止selenium被检测
});
// 浏览器上下文
await using var context = await browser.NewContextAsync(new BrowserNewContextOptions
{
ViewportSize = new ViewportSize
{
Width = 1536, // 1920 * 0.8
Height = 864, // 1080 * 0.8
}, // 窗口大小
Locale = "zh-CN", // 指定语言(区域)
TimezoneId = "Asia/Shanghai", // 指定时区
});
// 存储当前会话
await context.StorageStateAsync(new BrowserContextStorageStateOptions
{
Path = "state.json"
});
// 使用会话,当state.json文件不存在时会报错
await browser.NewContextAsync(new BrowserNewContextOptions
{
StorageStatePath = "state.json"
});
// 等待登录按钮出现
await page.WaitForSelectorAsync(".login");
// 点击登录
await page.ClickAsync(".login");
// 查找页面元素 可匹配到 <div class="title-text-n4df3g8">美食</div>
var locator = page.Locator(“div[class^='title-text-']:text-is('美食')”);
// 获取匹配到元素的个数
var count = await locator.CountAsync();
// 鼠标悬停在元素上
await page.HoverAsync("#title");
// 执行js获取页面地址
var href = await page.EvaluateAsync<string>("document.location.href");
以上就是我在使用中一些常用的操作,体验起来感觉非常方便,Playwright for .NET官网上的文档也写的非常详细。朋友们如果有兴趣可以在留言区交流哦。
2023-3-10 更新
在发布到新的环境时需要运行脚本进行初始化,如果在代码中加入:
//以下代码可设置playwright环境的默认目录
Environment.SetEnvironmentVariable("PLAYWRIGHT_BROWSERS_PATH", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ms-playwright"));
//初始化playwright环境,chromium, chrome, chrome-beta, msedge, msedge-beta, msedge-dev, firefox, webkit 可选
Microsoft.Playwright.Program.Main(new[] { "install", "chromium" });
即可在程序运行时进行环境初始化,也可以通过指定默认目录直接将相关依赖打包一起打包,但直接打包可能会有跨平台等问题,可以根据自身需求进行选择。
本博客所有文章如无特别注明均为原创
如果觉得对你有帮助,可以通过下方打赏对作者表示鼓励
本文采用知识共享署名-非商业性使用-相同方式共享
如若转载,请注明出处:《Playwright for .NET 初次使用记录》https://www.fangsi.net/1811.html