seleniumer’s diary

「手動でExcelにスクショ貼付け」地獄からきました。テスト自動化しか望みがありません。java + selenium(since 2015/5)

SafariDriverがalertその他に対応してくれないので自分的措置(書きかけ)

(以下、書きかけです)

SafariDriverはポップアップ(alert / cofirm / prompt)には非対応で、エラーとなってしまいます。

これではMac OS+Safariでは必ず手動テストをやる羽目になります。

それは絶対に避けたい!

ということで、なんとか思案。

code.googleさんに良い記事がありました。

Issue 3862 - selenium - SafariDriver cannot handle alerts - Browser automation framework - Google Project Hosting

 

Best solution I found for to handle Selenium safari alert workaround is

Inject this javascript into browser before alert will occur, and you will found alert will automatically accepted.

((JavascriptExecutor)browser).executeScript("confirm = function(message){return true;};");
((JavascriptExecutor)browser).executeScript("alert = function(message){return true;};");
((JavascriptExecutor)browser).executeScript("prompt = function(message){return true;}");

 

ページロード時にJavascriptExcecutorでalert その他のfunctionをオーバーライドしてしまえば、ということらしいです。しかも強制的に「TRUE」を返す、と。

テストではポップアップメッセージの確認が多いのでこれではちょっと乱暴です。

そこで、ポップアップのメッセージをDom内にこっそり格納してテストメソッドに呼び出させて取得する手法を考えました。(苦しいですが。。。)

 

まず、ページロード時にこいつを読み込むようにして。

alert = function(m){a(m);return true;};
confirm = function(m){a(m);return true;};
prompt = function(m){a(m);return true;};
function a(m){
d=document.body;
e=document.getElementById('%$9e%');
if(e!=null){e.parentNode.removeChild(e)};
c=document.createElement('div');
c.id='%$9e%';
c.style.display = 'none';
c.innerHTML=m;
d.appendChild(c);
}

テストメソッドでよくあるアラートの制御処理

例えば

Alert alert = driver.switchTo().alert()

String message = alert.getText();

で、ブラウザがSafariだったらかわりに

String message = ((JavascriptExecutor)driver).executeScript({次のスクリプト});

m='';
e=document.getElementById('%$9e%');
if(e!=null){m=e.innerHTML;e.parentNode.removeChild(e)};
return m;

とします。かなり、苦しいですが。。。。この特殊処理のバリデーションはどうなってるんだって言われたら、ごめんなさい。しか言えないけど。

あと、Domロード時にポップアップがいきなり表示されるページではこれはオーバーライドが間に合わず使えません。うーむ、改良したい。Safari Extention側でInjectionScriptとかすればいけるかもだけど。私には敷居が高いです。とほほ。

こちらのページでも見ながら研究したいと思います。

時間があれば。

 

os0x.hatenablog.com