IkumaTadokoro / diary

MIT License
0 stars 0 forks source link

2022-08-28 #74

Open IkumaTadokoro opened 2 years ago

IkumaTadokoro commented 2 years ago

一夜明けて、記憶無くなる。再開。

今確認している事象自体はIssueとして上がっているんだけど、だいぶ前。 かつなんか微妙に解決していない。

一方で、cdprotoのリポジトリをみると、ちゃんと定義が生成されているっぽい。 どれを使って更新されているか確認してみる。

kenshawって人が呪王でpushしているっぽい?だとするとそれをどう生成しているかは確認できないな

でもREADMEにはcdproto-genコマンドを使っているってあるから、どうなっているんだよという感じではある。

IkumaTadokoro commented 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

これでやっと動いたよ...

IkumaTadokoro commented 2 years ago

生成物を見ていくけど、これ結局cd-protoができたっていうだけだな?

自動生成のところは大体仕組みを理解したので、次はこれを利用しているchromedp本体の挙動を確かめていく。

今回Olaywrightを実装するにあたって、HTTP→WebSocketの接続開始をどういう風にやるのがいいかのイメージがまだついていないので、ついでに参考にできるといいなという魂胆。

IkumaTadokoro commented 2 years ago
$ 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番地から渡した引数が格納される。

IkumaTadokoro commented 2 years ago

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

https://pkg.go.dev/time

これが表示されるようになっている。

go run click/main.go

https://pkg.go.dev/time#After

ここの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 (今日では通常タブであり、場合によってはウィンドウまたはページ内のフレーム) を表示する環境です。

まあタブと思っておけばよさそう。

IkumaTadokoro commented 2 years ago

このDiary、日付ベースで書くのもいいけど、テーマベースですぐ書けるようにすると良さそうですね。