Open IkumaTadokoro opened 2 years ago
これもしかして、oldブランチに切り替えたらうまくいったりするのか?
go install github.com/chromedp/cdproto-gen@cdproto-gen@old
$ cdproto-gen
easyjson-bootstrap693351085.go:14:3: no required module provides package github.com/chromedp/cdproto/media: go.mod file not found in current directory or any parent directory; see 'go help modules'
# こんなのがめっちゃでている
とはいえ、oldブランチに切り替えたら今まで落ちているところも落ちないようになった。 少なくとも
https://github.com/chromedp/pdlgen/blob/abc6091f7244e5c70d1a9ef38f70ec9a6b209d39/main.go#L283
ここまで到達するようになった。後一息である。
https://github.com/mailru/easyjson
Goの構造体とJSONをリフレクションなしに簡潔かつ高速に変換できるパッケージ(リフレクションis何)。標準でencoding/json
があるけど、それよりも早い。
pdlgenのREADMEに書いてあった
The -out command-line option should point to the directory into which the github.com/chromedp/cdproto repository is cloned, so that easyjson can find the go.mod file and use it.
というわけで、このソースも落としてくる。
ghq get git@github.com:chromedp/cdproto.git
cdproto-gen -out=/Users/ikuma/src/github.com/chromedp/cdproto
これでやっと動いたよ...
生成物を見ていくけど、これ結局cd-protoができたっていうだけだな?
自動生成のところは大体仕組みを理解したので、次はこれを利用しているchromedp本体の挙動を確かめていく。
今回Olaywrightを実装するにあたって、HTTP→WebSocketの接続開始をどういう風にやるのがいいかのイメージがまだついていないので、ついでに参考にできるといいなという魂胆。
$ go install github.com/spf13/cobra-cli@latest
$ vim ~/.cobra.yaml
author: ikuma-t <tadokorodev@gmail.com>
license: MIT
$ cd /path/to/directory
$ go mod init github.com/IkumaTadokoro/helloworld
$ cobra-cli init
$ go install
$ helloworld
A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.
cobraの引数には0番地から渡した引数が格納される。
cdprotoがCDPのSDK
https://github.com/chromedp/cdproto
// Message chrome DevTools Protocol message sent/read over websocket
// connection.
type Message struct {
ID int64 `json:"id,omitempty"` // Unique message identifier.
SessionID target.SessionID `json:"sessionId,omitempty"` // Session that the message belongs to when using flat access.
Method MethodType `json:"method,omitempty"` // Event or command type.
Params easyjson.RawMessage `json:"params,omitempty"` // Event or command parameters.
Result easyjson.RawMessage `json:"result,omitempty"` // Command return values.
Error *Error `json:"error,omitempty"` // Error message.
}
こういうMessageの構造体を持っていて、このMessageをJSONにシリアライズ(これはGoでいうところのMarshalなのかな)してWebSocketで送信する。
chromedp
https://github.com/chromedp/chromedp
chromedpが本体で、CDPのラッパーに相当する。内部的にはcdprotoを利用している。seleniumがWebDriverをラップしているようなイメージ。
ghq get git@github.com:chromedp/examples.git
go run text/main.go
これが表示されるようになっている。
go run click/main.go
ここのExampleをクリックするサンプルケース。
構造を見てみよう。例えば前者の方はこうなっている
func main() {
// create context
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
// run task list
var res string
err := chromedp.Run(ctx,
chromedp.Navigate(`https://pkg.go.dev/time`),
chromedp.Text(`.Documentation-overview`, &res, chromedp.NodeVisible),
)
if err != nil {
log.Fatal(err)
}
log.Println(strings.TrimSpace(res))
}
contextを作成して、コマンドを実行する。contextなんだったっけ...?生でWebSocker叩いてた記録を読み返す。
Playwrightでも同じようにContextを作成していた。意味はわかるんだけど、どのレイヤーで定義されているやつなのかがわからない。これ多分Seleniumの時に見たんだよな。
https://developer.mozilla.org/ja/docs/Glossary/Browsing_context
閲覧コンテキストは、ブラウザー が Document (今日では通常タブであり、場合によってはウィンドウまたはページ内のフレーム) を表示する環境です。
まあタブと思っておけばよさそう。
このDiary、日付ベースで書くのもいいけど、テーマベースですぐ書けるようにすると良さそうですね。
一夜明けて、記憶無くなる。再開。
今確認している事象自体はIssueとして上がっているんだけど、だいぶ前。 かつなんか微妙に解決していない。
一方で、cdprotoのリポジトリをみると、ちゃんと定義が生成されているっぽい。 どれを使って更新されているか確認してみる。
kenshawって人が呪王でpushしているっぽい?だとするとそれをどう生成しているかは確認できないな
でもREADMEにはcdproto-genコマンドを使っているってあるから、どうなっているんだよという感じではある。