Golangで、playwrightをrocky linux内で動かしたメモ
golang on rockylinux9.x で、playwrightを動かしたときのメモです。
Playwrightは、ブラウザを操作して、高度なend-to-end testingができるプロダクトですが、
非常に細かくブラウザの挙動を制御できるので、RPAのような目的での使い方もできます。
Playwrightはnode系で動作しますが、私は普段バックエンドにnode系は使っていないので、golangのwrapperである
playwright-goを使います。
Playwrightはwindows,mac,linuxで動きます。
ただし、linuxの推奨環境にはdebian,ubuntu等の記載が有りますが、centos系(rocky,almaなども)は対象になっていません。
今回はサーバーとして、rocky9が要件なので、ここで動作させてきます。
参考にさせていただいた記事
playwright-goを動かすためには、
playwright-goモジュール取得の他、ブラウザ等の必要プログラムをインストールする必要が有ります。
go installなどのコマンドで入れることができる他、
goのコード上で、インストールすることもできます。
import "github.com/playwright-community/playwright-go"
...
err := playwright.Install()
今回、goを入れていない環境での動作のため、上記のgoコードでインストールを行いました。
初回、playwright.Install()の結果
各種ブラウザのダウンロードの後、ブラウザを実行するのに必要な依存モジュールが入っていない旨の
メッセージが出ました(errが返ってきます)
BEWARE: your OS is not officially supported by Playwright; downloading fallback build for ubuntu20.04-x64.
Downloading Chromium 129.0.6668.29 (playwright build v1134) from https://playwright.azureedge.net/builds/chromium/1134/chromium-linux.zip
164 MiB [] 100% 0.0s
Chromium 129.0.6668.29 (playwright build v1134) downloaded to /root/.cache/ms-playwright/chromium-1134
BEWARE: your OS is not officially supported by Playwright; downloading fallback build for ubuntu20.04-x64.
Downloading FFMPEG playwright build v1010 from https://playwright.azureedge.net/builds/ffmpeg/1010/ffmpeg-linux.zip
2.3 MiB [] 100% 0.0s
FFMPEG playwright build v1010 downloaded to /root/.cache/ms-playwright/ffmpeg-1010
BEWARE: your OS is not officially supported by Playwright; downloading fallback build for ubuntu20.04-x64.
Downloading Firefox 130.0 (playwright build v1463) from https://playwright.azureedge.net/builds/firefox/1463/firefox-ubuntu-20.04.zip
86.4 MiB [] 100% 0.0s
Firefox 130.0 (playwright build v1463) downloaded to /root/.cache/ms-playwright/firefox-1463
BEWARE: your OS is not officially supported by Playwright; downloading fallback build for ubuntu20.04-x64.
Downloading Webkit 18.0 (playwright build v2070) from https://playwright.azureedge.net/builds/webkit/2070/webkit-ubuntu-20.04.zip
135.4 MiB [] 100% 0.0s
Webkit 18.0 (playwright build v2070) downloaded to /root/.cache/ms-playwright/webkit-2070
Playwright Host validation warning:
╔══════════════════════════════════════════════════════╗
║ Host system is missing dependencies to run browsers. ║
║ Please install them with the following command: ║
║ ║
║ npx playwright install-deps ║
║ ║
║ Alternatively, use apt: ║
║ apt-get install libnss3\ ║
║ libnspr4\ ║
║ libdbus-1-3\ ║
║ libatk1.0-0\ ║
║ libatk-bridge2.0-0\ ║
║ libcups2\ ║
║ libdrm2\ ║
║ libxcb1\ ║
║ libxkbcommon0\ ║
║ libatspi2.0-0\ ║
║ libx11-6\ ║
║ libxcomposite1\ ║
║ libxdamage1\ ║
║ libxext6\ ║
║ libxfixes3\ ║
║ libxrandr2\ ║
║ libgbm1\ ║
║ libpango-1.0-0\ ║
║ libcairo2\ ║
║ libasound2 ║
║ ║
║ <3 Playwright Team ║
╚══════════════════════════════════════════════════════╝
playwrightはdebian系での利用が想定されているので、
apt でのモジュールインストールが促されていますが、centosではaptが使えません。
playwright本家でもこのissueが立ち上がっていて、以下のコメントが見つかりました。
そこで、必要モジュール群を、CentOSでのモジュールに置き換えて、以下のように追加しました。
置き換えは、chatGPTやwebでのリサーチ、エラーメッセージなどから調査しました。
yum install nss
yum install nss-devel
yum install dbus
yum install at-spi2-atk
yum install cups
yum install mesa-libdrm
yum install libxcb
yum install libX11
yum install libXcomposite
yum install libXdamage
yum install libXext
yum install libXfixes
yum install libXrandr
yum install mesa-libgbm
yum install pango
yum install cairo
yum install alsa-lib
yum install libxkbcommon
以上で、rocky linux9上で、playwrightが動作しました!
動作したコードは以下の通りです。
package controller
import (
"fmt"
"log"
"github.com/playwright-community/playwright-go"
)
func main() {
pw, err := playwright.Run()
if err != nil {
log.Fatalf("could not start playwright: %v", err)
}
browser, err := pw.Chromium.Launch()
if err != nil {
log.Fatalf("could not launch browser: %v", err)
}
page, err := browser.NewPage()
if err != nil {
log.Fatalf("could not create page: %v", err)
}
if _, err = page.Goto("https://news.ycombinator.com"); err != nil {
log.Fatalf("could not goto: %v", err)
}
entries, err := page.Locator(".athing").All()
if err != nil {
log.Fatalf("could not get entries: %v", err)
}
for i, entry := range entries {
title, err := entry.Locator("td.title > span > a").TextContent()
if err != nil {
log.Fatalf("could not get text content: %v", err)
}
fmt.Printf("%d: %s\n", i+1, title)
}
if err = browser.Close(); err != nil {
log.Fatalf("could not close browser: %v", err)
}
if err = pw.Stop(); err != nil {
log.Fatalf("could not stop Playwright: %v", err)
}
}
ログ
1: Apple Mobile Processors Are Now Made in America. By TSMC
2: Scramble: Open-Source Alternative to Grammarly
3: Entire Independent Board of Directors of 23andMe Resigns
4: macOS Sequoia 15 may bypass DNS encryption
5: Atkinson Hyperlegible Font
6: GraalPy – A high-performance embeddable Python 3 runtime for Java
7: The Lego Great Ball Contraption
8: Rga: Ripgrep, but also search in PDFs, E-Books, Office documents, zip, etc.
9: Reports of the Death of Dental Cavities Are Greatly Exaggerated
10: Asgard launches world's first DDR5-9600 DIMMs
11: John Peralta Explodes Historic Technology into Three-Dimensional Diagrams
12: Show HN: Open Scanner, an open-source document scanning app for iPhone
13: Scrolling Text Display
14: Emerge Tools (YC W21) is hiring a senior front end engineer
15: The Double Irish Dutch Sandwich: End of a Tax Evasion Strategy
16: A Friendly Introduction to Assembly for High-Level Programmers
17: OpenTelemetry Tracing in < 200 lines of code
18: Hezbollah pager explosions kill several people in Lebanon
19: Why Gauss wanted a heptadecagon on his tombstone
20: STORM: Get a Wikipedia-like report on your topic
21: The port of the Windows 95 Start Menu was not all it seemed
22: WonderWorld: Interactive 3D Scene Generation from a Single Image
23: Launch HN: Marblism (YC W24) – Generate full-stack web apps from a prompt
24: The centrality of stupidity in mathematics
25: Exploring pre-1990 versions of wc(1) (2023)
26: Show HN: Finic – Open source platform for building browser automations
27: Rustpad is an efficient and minimal open-source collaborative text editor
28: TexTube: Chat with any YouTube video transcript in ChatGPT fast
29: In 1926, TV Was Mechanical
30: Signatures of gravitational atoms from black hole mergers
バージョンを変えて利用しようとしたら、別のモジュールを要求された。
╔══════════════════════════════════════════════════════╗
║ Host system is missing dependencies to run browsers. ║
║ Please install them with the following command: ║
║ ║
║ npx playwright install-deps ║
║ ║
║ Alternatively, use apt: ║
║ apt-get install libx11-xcb1\ ║
║ libxcursor1\ ║
║ libgtk-3-0\ ║
║ libcairo-gobject2\ ║
║ libgdk-pixbuf2.0-0 ║
║ ║
║ <3 Playwright Team ║
╚══════════════════════════════════════════════════════╝
一応こちらもインストール
yum install libX11
yum install libX11-xcb
yum install libXcursor
yum install gtk3
yum install cairo
yum install gdk-pixbuf2
ファイルダウンロード後のトラブル
このissueの通りですが、
ダウンロードイベント後、ファイルを別の場所に保存しようとして download.SaveAs()
をしようとしたら、
固まりました。
download,err:=page.ExpectDownload(func() error {
return page.Click("#ctl32_ctl05_ctl04_ctl00_Menu > div:nth-child(6) > a")
})
fmt.Println(err) // nil
fmt.Println(download.SuggestedFilename()) // "User Metrics.csv"
// Stuck Here
fmt.Println(download.Failure())
// stuck when execute one of the Failure(), Path() or SaveAs() functions.
バージョンを、
v0.4501.1、v0.4102.0、v0.3700.0・・・と 遡って動作確認していたら、v0.2000.1で、ちゃんと動作した。
なので、v0.2000.1の次でエラーが起こるのかと思いきや、
その後、バージョンを最新に戻したら、何故か問題解消した。
深く追うと時間かかりそうなので、いったん調査は終了。