Playwright for .NET 初次使用记录

最近在做一些接口测试和数据调试相关的事情,本来想使用HttpClient模拟POST、GET进行操作,但是有一些前端逻辑无法模拟,准备用Python+Selenium来实现。无奈Ptyhon处于半桶水,有很多想法去实现还要找一些资料。正翻着资料,微软官方出的Playwright进入到了我的视野。本文用于记录在使用过程中的一些问题。

Playwright for .NET 初次使用记录

首先,简单的将当前流行的几个测试框架进行一个对比:

SeleniumPuppeteerPlaywright
JavaScript 支持官方支持官方支持官方支持
Python 异步支持第三方,而且 bug 不少官方支持
Python 同步支持官方支持官方支持
维护者社区Google微软
可操作性浏览器Chrome/Firefox/Safari/EdgeChrome/FirefoxChrome/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

(19)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
锋哥的头像锋哥管理员
上一篇 2021年12月12日 18:59
下一篇 2022年1月5日 22:50

相关推荐

发表回复

登录后才能评论