

將 Playwright 網頁自動操作程式部署到客戶端執行
source link: https://blog.darkthread.net/blog/playwright-app-dep-issue/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

將 Playwright 網頁自動操作程式部署到客戶端執行-黑暗執行緒
上回提到我想用 Playwright for .NET 也可以用來開發網頁操作自動化機器人,但部署到客戶端可能會是問題。Playwright 原本被設計用於 End-To-End 測試,多在開發測試環境或 Build 主機上執行,程式庫下載安裝不用太講究 User Friendly。我想把它放到客戶端應用,得研究所需檔案數量、大小、目錄位置要求,評估可行性。
首先,我想借用客戶端上現有的 Chrome 或 Edge,不要再另外下載安裝瀏覽器軟體,這不是難事。以 Chrome 為例,Chromium.LaunchAsync() 時可查詢 Registry 找到 Chrome 安裝路徑,傳入 ExecutablePath。
using System.Text.RegularExpressions;
using Microsoft.Playwright;
using var playwright = await Playwright.CreateAsync();
await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions {
Headless = false,
ExecutablePath = GetChromePath()
});
var page = await browser.NewPageAsync();
await page.GotoAsync("https://playwright.dev/dotnet");
await page.ScreenshotAsync(new()
{
Path = "screenshot.png"
});
// get Chrome installed path from registry (Windows only)
string GetChromePath()
{
var path = Microsoft.Win32.Registry.GetValue(
@"HKEY_CLASSES_ROOT\ChromeHTML\shell\open\command", null, null) as string;
if (string.IsNullOrEmpty(path))
throw new ApplicationException("Chrome not installed");
var m = Regex.Match(path, "\"(?<p>.+?)\"");
if (!m.Success)
throw new ApplicationException($"Invalid Chrome path - {path}");
return m.Groups["p"].Value;
}
實測 dotnet publish -r Release -r win-x64 --no-self-contained
,除了 dll 外,還有一個 .playwright 目錄,其下包含 node.exe 及 TypeScript、JavaScript 程式及設定檔。由此可知 Playwright 本體仍是跑在 Node.js 平台,Playwright for .NET 只是溝通整合的中介層。
但有點要注意,Microsoft.Playwright.dll 必須獨立存在,若使用 -p:PublishSignleFile=true 整併進 .exe,執行時會噴出錯誤:
Unhandled exception. System.NotSupportedException: CodeBase is not supported on assemblies loaded from a single-file bundle.
at System.Reflection.RuntimeAssembly.get_CodeBase()
at Microsoft.Playwright.Helpers.Driver.GetExecutablePath() in /_/src/Playwright/Helpers/Driver.cs:line 43
at Microsoft.Playwright.Transport.StdIOTransport.GetProcess() in /_/src/Playwright/Transport/StdIOTransport.cs:line 114
at Microsoft.Playwright.Transport.StdIOTransport..ctor() in /_/src/Playwright/Transport/StdIOTransport.cs:line 44
at Microsoft.Playwright.Playwright.CreateAsync() in /_/src/Playwright/Playwright.cs:line 44
at Program.<Main>$(String[] args) in X:\Github\MiscLabs\playwright-dep-test\Program.cs:line 4
at Program.<Main>(String[] args)
全部程式共 310 個檔案,近 70 MB,大小還可被接受:
將整包程式丟到客戶端,實測能成功執行!
如此,至少驗證未來將發佈將整包程式複製過去並裝好 .NET SDK,要在客戶端跑 Playwright for .NET 是可行的。
還有一個待優化的地方 - 程式附帶的 68MB .playwright 資料夾內容都是相同的,每支程式都複製一份是種浪費,有沒有可能多支程式共用一份呢?追進原始碼,GetExecutablePath() 假設 .playwright 資料夾放在執行程式所在目錄或是 Microsoft.Playwright.dll 的同目錄下,目前並未提供自訂路徑的選項。有人提了 PR 想比照 PuppeteerSharp 為 Playwright.CreateAsync(driversPath: "path/.playwright") 加個自訂路徑參數但沒被接受。現階段要解決,可考慮 Fork 一個魔改版本或用 Hacking 技巧搞定,有空再來想想。
Recommend
-
14
手動將 Vue CLI build 出來,然後再 push 至遠端部署,這些步驟雖然很簡單,但這樣不是很有效率,所以應透過自動部署來處理。本篇介紹如何透過 GitLab CI/CD 來將 Vue...
-
5
最近迷上了 Playwright 這套 E2E 框架,他不但同時支援 Chromium, Firefox 與 WebKit 瀏覽器,還可以跨平台支援 Windows, macOS 與 Linux,而且針對 SPA 類型的應用程式進行 E2E 測試完全不用撰寫太多非常 Hacky 的程式碼,寫起來非常的順手。除此之外,他還同...
-
13
如何利用 PowerShell 自動將應用程式註冊到工作排程器 (Task Scheduler)最近一直在處理不同專案的 CI/CD 作業,有個自動化排程作業就需要將應用程式註冊到 工作排程器 (Task Scheduler) 之中,因此就研究了一下如何利用 PowerShell 來完成這個...
-
6
web.config PowerShell 更新函式庫-黑暗執行緒有些 IIS 設定要靠改 web.config 完成,有些環境較一致,可以預先寫好覆寫即可,但如果更新的 web.config 有多個且內容不同,最無腦的做法是寫成操作指示請相關人員執行:「打開 web.conf,找到 system.webSesrver/...
-
12
打造極簡式 ASP.NET Core 桌面小工具 陸續介紹在 ASP.NET Core 專案內嵌 HTML、.js 跑介面、呼叫 Minimal API MapPost("...") 寫的 WebAPI,
-
6
上次...
-
5
我個人目前偏好的工具是M牌的Playwright。因為早期calypso的e2e tests是用Puppeteer,不知為何它的行為常常跟我預期的相差甚遠,只...
-
4
使用 Server-Sent Event-黑暗執行緒 多因素認證(Multiple Factor Authentication,MFA)網頁常會用到一種技巧,介面停在登入網頁,等待手機 App 操作,網頁能偵測 App 動作是否完成,若驗證成功自動導向已登入畫面。 以 Facebook 為例,...
-
6
Playwright for .NET 筆記-黑暗執行緒 之前在用 C# 呼叫 Chrome 批次產生網頁快照的簡便做法 讀者 Rong 留言提到 Playwright。最近計劃寫...
-
5
Tor 的 Onion 導入防禦機制,在遭受 DoS 的時候要求用戶端執行 PoW 任務 在「
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK