メモログ

塵が積もって山とならないメモのログ

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では、それを簡単に実行するためのメソッドを紹介しています。使い方はこんな感じ。

1
2
3
4
5
6
7
8
9
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での回避方法はわかっておりません。