puppeteer-rubyでChromeブラウザ自動操作

趣味で開発しているpuppeteer-rubyがだいぶまともに動くようになってきたので、このあたりで一筆を。

puppeteer-ruby爆誕のきっかけ

f:id:YusukeIwaki:20200605001527p:plain

そういえば過去の2記事(puppeteer-rubyを作ろうとして挫折した - YusukeIwakiのブログ, やっぱりPuppeteerをRubyから使えないと困るので、puppeteer-rubyを作ることにした - YusukeIwakiのブログ)には書いていなかった。puppeteer-rubyを作ろうと思った一番の理由を。

まず、Rubyで自動テストするならSeleniumがある。それなのにSeleniumではなくpuppeteerを使う最大の理由は... waitForSelector だ。

「まだかなーまだかなー」とポーリングでDOM要素が現れるのを待つSeleniumとは対照的に、「DOMに変化があったら都度おしえてねー」とリスナー仕掛けてDOM要素が現れるのを監視するのがpuppeteer。SeleniumではときどきDOM要素が現れるのを検知できないことがあるが、puppeteerは(MutationObserverがバグらない限りは)DOM要素が現れる瞬間を絶対に逃さない。

Rubyで受け入れテストや自動テストを書きたいけど、Seleniumの精度だとしんどい」 っていう人はたぶん自分以外にも居るんじゃないか。

そんな思いからpuppeteer-rubyは誕生した。(支離滅裂w)

(2020.08.30 追記) Capybaraで運用中の受け入れテストをpuppeteer-rubyで補強することができる

「こんなこともできます」程度の内容ですが、別記事に載せてます

yusukeiwaki.hatenablog.com

「Capybaraで書いた受け入れテストが、何故かタイムアウトエラーで落ちて、リトライとか色々しんどい・・・」「けど、改めてCypressやCodeceptJSなどで再実装するのもしんどい・・・」という場合に。puppeteer-rubyはCapybaraを置き換えるものではなく共存することができるので、既存テストの弱い部分だけをpuppeteerのwaitForSelector/waitForNavigationで補強することができます!

最近のpuppeteer-rubyのアップデート

waitForSelectorは、2週間前くらいに実装した。

github.com

あとは、地味に写真のアップロードとかできないと困るので、ファイルのアップロードも実装した。

github.com

waitForSelectorで一気に気が抜けてしまったので、最近は実に低調である。

 

そんなことはどうでもいい。自動操作だ。

無駄な前置きは長すぎた。自動操作の話をしよう。

puppeteer-rubyをインストール

$ bundle init
$ echo 'gem "puppeteer-ruby"' >> Gemfile
$ bundle install

とりあえずggrksしてみよう。

qiita.com

ggrks.rb を作って

require 'puppeteer'

search_keyword = ARGV.join(" ")
search_keyword = "puppeteer" if search_keyword.empty?

launch_options = {
  # ブラウザ画面を表示しながら(ヘッドレスモードを無効にする)。
  headless: false,

  args: [
    # ゲストセッションで操作する。
    "--guest",

    # ウインドウサイズをデフォルトより大きめに。
    '--window-size=1280,800',
  ],

  # 人間味のある速度で入力/操作する。
  slow_mo: 50,
}

Puppeteer.launch(launch_options) do |browser|
  page = browser.pages.first || browser.new_page

  page.viewport = Puppeteer::Viewport.new(width: 1280, height: 800)

  page.goto("https://google.com/")
  page.type_text("input[name='q']", search_keyword)

  await_all(
    page.async_wait_for_navigation,
    page.keyboard.async_press("Enter"),
  )

  sleep 10
end

以下のように実行すると・・・

$ bundle exec ruby ggrks.rb

ぐりぐり動いて検索結果画面が出る。

f:id:YusukeIwaki:20200605225226p:plain

サンプルは書くモチベーションがなくなってきたので・・・

実はサンプルスクリプトリポジトリを用意してあるw

github.com

今後も公開できるような(秘匿情報を含まない)スクリプトはどんどんアップしていこうと思う。

 

まとめ

ただの、puppeteer-rubyの宣伝でした。

まだちょっと不安定だけど、「Rubyで受け入れテストや自動テストを書きたいけど、Seleniumの精度だとしんどい」っていうのに共感するかたはぜひ使ってみてください。

rubygems.org

(2020.08.16追記: 0.0.11でだいぶ安定して動くようになりました。 puppeteer-ruby 0.0.11で完走率が劇的に改善。ブラウザの自動操作が快適に。 - YusukeIwakiのブログ )

nuro光が全然開通しない

引っ越しを機に、ネットの回線速度が速いと評判のnuro光に契約をした。 Twitter切り貼り記事だけど、メモっておく。

nuro光の申し込み: 4/17

住宅ローンの手続きが一段落したので、新居用のネットを申し込もうと思って、nuro光に公式Webページから申し込み。

1回目のnuro光の工事: 4/27

引越し日に、1回目の工事予約を入れた。

フレッツ光ネクストの解約が・・・できない!

フレッツ光はなぜかTELでの解約(0120-116-116)しかできない。そして、コールセンターは激混みで、全然つながらない。

奇跡的に1回つながったところ、「お客様はマンションプランなので・・・」と、別のところを案内された。

その番号もまたコールセンターは激混みで、この日は夕方までずっとつながらず、終了を迎えた・・・

翌朝、奇跡的につながった。すると「お客様はマンションプランなのですが、解約は0120-116-116のほうで承ります」とのこと。

正直、この時点で「もう二度と、フレッツ光は使わない」というのを心に決めた。

ただでさえ速度出ないフレッツ光ネクストを前回の引越し時に勧誘してきて騙されたというのに、解約時にここまでされたら、もうどこを褒めたら良いのかわからない。

フレッツ光ネクスト 隼 さらば!!:5/4

なんとか0120-116-116を攻略して、5/4に旧住居のネット解約。

ちなみに、解約の数日前にとったベンチマークがこれ

nuro光の2回めの工事が遅いことを知る: 5/10

so-netの入会証が届かないトラブルがあって、

ついでにnuro光調べたときに、2回めの工事がめちゃくちゃ遅いということを知った。

モバイルルータを借りることにする: 5/10

nuro光の人向けにモバイルルータを980円で借りられるよ!みたいなのがある。

f:id:YusukeIwaki:20200526230333p:plain

https://www.nuro.jp/article/wifionu/

ちなみに、 実際には、送料が上乗せされるので、2000円くらいかかる。 みんな誇大広告が大好きなのね。

モバイルルータが届く: 5/11

誇大広告は許せないが、Wifiが翌日に届いたのはさすが。

在庫の関係で、5GB制限があると書いてあったが、しばらくは使えていた

ついにnuro光のレンタルモバイルルータで帯域制限: 5/15

どうやら12GBを超えると帯域制限がかかるらしい。どこにもそんな記載はないが。

あまりに遅くて仕事ができなくなった。IIJmioのSIMでしばらく頑張ることにした。

個人スマホも帯域制限・・・急いで、IIJmioの大容量オプションを購入: 5/21

手持ちの通信手段すべてが128kbpsになってしまった。これはもはや人権がないに等しい。流石にやばいので、IIJmioの大容量オプションを課金することにした。

nuro光の2回めの工事見込みの連絡がSMSでキタ: 5/22

f:id:YusukeIwaki:20200526225935p:plain

7月・・・?!

・・・もうしばらくネット難民だ

Try WimaxWimaxの実力を見ることに: 5/24

UQ Wimaxのギガ放題は、2年縛りっぽくみえるが解約金が1000円だ。UQ以外のWimaxでも短期契約に向いているプランを出しているところがいくつかある。

ということで、Wimaxの実力をまずは見てみようと思い、Try wimaxに申し込む。

5/23の夜だと

全然在庫はなかった。しかし5/24の朝8:30頃にみてみたところ、Wimax Home 01の在庫が有った。速攻で申し込んだ。

Try Wimaxの端末が届いた。

そうそう、大事なことを書き忘れていたが、新居はdocomoLTEの電波がとても弱い。(nuro光の提携のモバイルルータはソフトバンクLTEだったけど、言わずもがな。)

Wimaxだとどうなんだろ?と思って、数カ所で測定してみた。

LTEに比べると2〜3倍の速度が出た。

久々に安心してネットが使える環境になった。Wimaxは俺を裏切らない。

nuro光?おまえはほんとうにやってくるのか?

7月中旬まで、

  • なんらかのwimax契約をする
  • IIJmioの大容量オプションで頑張る

の二本立てでしのぐ生活は続きそうだ。

・・・・つーかさ、、4月17日に申し込んで7月中旬になるなんて思ってなかったよ! nuro光

とはいえ、nuro光がなかなか開通しないのは、自分の調査不足もあるので、我慢するとしよう。

・・・つーかさ。、ふつうに帯域制限のゆるいWimaxを短期契約したほうがいいじゃないか!!モバイルルーターは全然おすすめできないよ!!!

帯域制限は本当にストレスである。

まとめ

  • nuro光を契約するときには、代替インターネット環境が必須だ
  • nuro光が紹介しているモバイルルーターは、980円ではなく、送料を含めると2000円くらいかかる。
  • nuro光が紹介しているモバイルルーターは12GBで帯域制限がかかる。自分のようなビジネス用途でインターネットを使う人には不向き。
    • UQ Wimaxのギガ放題など、帯域制限のない&解約手数料の安いサービスを利用したほうがいい。

糸島の立石山が最高だった

コロナコロナ言われている中、先週末も今週末も登山している。

f:id:YusukeIwaki:20200425164429p:plain

10年前の滑落で肩を脱臼したところが、ここのところの在宅勤務で痛み始めていることもあり、家にじっとしているとどうしても体が弱くなるように思う。

「不要不急の外出だ!」って言われそうだけども、本当にそうか?体を動かして体温を高めて、適度に筋力もキープしてたほうが、いざというときに病気に戦える体になるんじゃないか?

他にも写真をアップしようとしたけど、はてながアップさせてくれなかった・・・ざんねん。

f:id:YusukeIwaki:20200425165108p:plain