RSpecでテストケースごとにHTTPサーバーを立てて試験する

puppeteer-rubyを開発していて、いよいよ単体試験を書くことにした。

そこで問題となったのが、「ボタンだけを含むHTMLページを開く」みたいな試験。

本家Puppeteerでは静的なHTMLページをいくつか用意してHTTPサーバーを立ててmocha(JavaScriptのテスト)を流しているっぽいのだけど、単体試験としてそれはどうなの?

Rubyだったら適当なDSLを駆使して

describe 'click button' do
  http_server do
    get '/button.html' do
      <<~HTML
      <html>
        <head><title>button</title></head>
        <body>
          <button onclick='document.body.innerHTML="123"'>click here</button>"
        </body>
      </html>
    end
  end

  it 'can click button' do
    page.goto('/button.html')
    page.click('button')
    expect(page.body).to eq("123")
  end
end

こんな感じで必要最低限のHTMLを返すHTTPサーバーを都度立てるspecを書けたらいいのに?と思った。

Webmockはtoo much

続きを読む

セブンイレブンのWifiスポット 7SPOTは、むちゃくちゃ速い!

コンビニWifiといえば、

  • ログイン画面がとてもユーザフレンドリーなローソンWifi
  • 死ぬほど使いづらいFamima-WiFi
  • ほぼどこのセブンでも使える7SPOT

だ。nuro光が全然開通しないので、写真や動画のアップロードをするのにコンビニに行ったりカフェに少しだけ行ったりしてるんだけど、そのなかでの大発見。

セブンのWiFiはむちゃくちゃ速い

正直、3桁のMbpsはフレッツ光ネクストを使っていても一度も見たことはない。

続きを読む

Selenium (Ruby) やCapybaraの弱いところをPuppeteerで救いに行く

f:id:YusukeIwaki:20200605001527p:plain

「puppeteer-rubyは、Capybaraと共存して動作精度を向上できるのでは?!」っていうことに先週くらいにふと気づいたので、カッとなって実装してみた。

github.com

CapybaraとPuppeteerの共存

そもそもなんで共存させる必要があるのか?

  • Seleniumだと「○○の要素が現れるまで待つ」「△△の要素が消えるまで待つ」みたいなところで、時々DOMの変化通知を拾いそこねて、失敗してしまうことがある。
  • PuppeteerはDOMの変化通知には強い。ただ、全部をPuppeteerで書き直す気力は無い...。

みたいな感じで、SeleniumやCapybaraの既存コードをなるべく書き換えないうえでPuppeteerのを動かしたい需要は、割とある気がした。

で、需要はありそうなのに、世の中にあるのは

のように、Capybara/Chromeドライバを完全に置き換える仕組みばっかりだなぁと。

「おれはべつにSeleniumを否定したいわけじゃないんだ。Seleniumの不満ポイントをどうにかPuppeteerで補強したいだけなんだ」ということで、puppeteer-rubyをそっちの方向で使えるように Puppeteer.connect を実装した。

実際に動作させた例

image

続きを読む