Open5

Golangで、playwrightをrocky linux内で動かしたメモ

yunayuna

golang on rockylinux9.x で、playwrightを動かしたときのメモです。

Playwrightは、ブラウザを操作して、高度なend-to-end testingができるプロダクトですが、
非常に細かくブラウザの挙動を制御できるので、RPAのような目的での使い方もできます。

Playwrightはnode系で動作しますが、私は普段バックエンドにnode系は使っていないので、golangのwrapperである
playwright-goを使います。
https://github.com/playwright-community/playwright-go

Playwrightはwindows,mac,linuxで動きます。
ただし、linuxの推奨環境にはdebian,ubuntu等の記載が有りますが、centos系(rocky,almaなども)は対象になっていません。
https://playwright.dev/docs/intro#system-requirements

今回はサーバーとして、rocky9が要件なので、ここで動作させてきます。

参考にさせていただいた記事

https://log.noid11.com/posts/hello-playwright-with-golang/
https://www.zenrows.com/blog/playwright-golang#tutorial

yunayuna

playwright-goを動かすためには、
playwright-goモジュール取得の他、ブラウザ等の必要プログラムをインストールする必要が有ります。
https://github.com/playwright-community/playwright-go?tab=readme-ov-file#installation

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が立ち上がっていて、以下のコメントが見つかりました。

https://github.com/microsoft/playwright/issues/5780

そこで、必要モジュール群を、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
yunayuna

以上で、rocky linux9上で、playwrightが動作しました!

動作したコードは以下の通りです。

main.go
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
yunayuna

バージョンを変えて利用しようとしたら、別のモジュールを要求された。

╔══════════════════════════════════════════════════════╗
║ 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
yunayuna

ファイルダウンロード後のトラブル

このissueの通りですが、
https://github.com/playwright-community/playwright-go/issues/133

ダウンロードイベント後、ファイルを別の場所に保存しようとして 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の次でエラーが起こるのかと思いきや、
その後、バージョンを最新に戻したら、何故か問題解消した。

深く追うと時間かかりそうなので、いったん調査は終了。