メモログ

watir-webdriver でjavascriptのポップアップをなんとかする

watir と watir-webdriver 違いはComparison with watir 1.x - watir-webdriver - GitHubにリストアップされていますが、ここにリストアップされていないもので大きな点というと、autoit を扱えなくなったという点があります。autoit は windows でのみ動作しない機能ですし、マルチプラットフォーム化している webdriver では当たり前と言えば当たり前ですが。

ここで困るのは javascript のポップアップなどの処理です。watir 1.x には WinClicker などのツールもありましたが、watir-webdriver ではそうした OS 依存の機能は現在のところありません(私は日本語のメニューの処理などがあったので WinClicker を使用せずに、autoit で処理していました)。

そこで watir-webdriver ではexecute_script のメソッドを使用して、javascript を回避する方法が紹介されています。execute_script は(詳しくは理解できていませんが)表示しているページで使用している javascript を上書きして実行することができるメソッドです。

そしてTesting webpages with JavaScript popups correctlyでは、それを簡単に実行するためのメソッドを紹介しています。使い方はこんな感じ。

require 'rubygems'
require 'watir-webdriver'
require 'watir-webdriver/extensions/alerts'

browser = Watir::Webdriver.new
browser.confirm(true) do
  browser.link.click
end

watir-webdriver/extensions/alerts は拡張機能(extension)という位置づけであるため、watir-webdriver とは別に require する必要があります。

上記の場合では、リンクをクリックすると Javascript で confirmation のメッセージを表示されるような場合に、メッセージが表示されることなく「ok」の状態で次の状態に進みます。これで Javascript のメッセージは回避することができます。Javscript をオーバーライドして回避するので、(素のままのアプリケーションをテストするわけではないので)完璧なテストとは言えないかもしれませんが、そのへんはわりきって。

あと蛇足ですが、watir-webdriver では、link のメソッドなど elment 関連のメソッドに引数を与えない場合は、はじめの link エレメントを実行します(watir 1.x で言うと link(:index,1) と同じ動作になる)。

autoit を使用して処理していたものとして、BASIC 認証のハンドリングなんかもあるんですが、今のところ watir-webdriver での回避方法はわかっておりません。

私について

Yutaka Yamaguchi
東京在住。TypeScript, Node.js, Reactなどフロンエンドが主力。Perlも書く。SwiftやRubyも過去には使ってた。過去のTOEIC 860くらい。