WebDriverとFirefoxでいくつかのテストを実行しています。
次のコマンドで問題が発生しています。
WebDriver.get(www.google.com);
このコマンドを使用すると、WebDriverはonloadイベントが発生するまでブロックします。これには通常数秒かかる場合がありますが、読み込みが完了しないWebサイトでは数時間かかる場合があります。
私がやりたいのは、Firefoxの停止ボタンをシミュレートして、特定のタイムアウト後にページの読み込みを停止することです。
ページを読み込もうとするたびに、最初に次のJSコードを実行しようとしました。
var loadTimeout=setTimeout(\"window.stop();\", 10000);
残念ながら、これは機能しません。おそらく次の理由によります。
スクリプトがロードされる順序のため、stop()メソッドは、スクリプトが含まれているドキュメントのロードを停止できません 1
更新1:接続と要求のタイムアウトを追加するためにSquidProxyを使用しようとしましたが、問題は解決しませんでした。
今日私が見つけた奇妙なことの1つは、自分のマシン(FF3.6-4.0およびMac Os 10.6.7)へのロードを停止しなかった1つのWebサイトが、他のブラウザーやコンピューターに正常にロードされたことです。
更新2:Firefoxに画像を読み込まないように指示することで、問題は明らかに解決できます。うまくいけば、その後すべてがうまくいくでしょう...
WebDriverがそれを使用するためにより良いChromeドライバーを持っていたらいいのにと思います。Firefoxは毎日私を失望させています!
更新3:Selenium 2.9は、ドライバーがハングしているように見える場合を処理するための新機能を追加しました。これは、次のようにFirefoxProfile
で使用できます。
FirefoxProfile firefoxProfile = new ProfilesIni().getProfile("web");
firefoxProfile.setPreference("webdriver.load.strategy", "fast");
試してみたら、うまくいくかどうか投稿します。
更新4:最後に、上記の方法はいずれも機能しませんでした。終了するのに時間がかかるスレッドを「殺す」ことになります。私は試してみるつもりです Ghostdriver これはバックエンドとしてPhantomJSを使用するリモートWebDriverです。 PhantomJSはヘッドレスのWebKitスクリプト可能であるため、Firefoxなどの実際のブラウザーの問題は発生しないと思います。 Firefox(クロール目的)を使用する義務がない人のために、私は結果で更新します
更新5:更新の時間。 FirefoxDriverの代わりにghostdriver1.1を5か月間使用して、彼のパフォーマンスと安定性に本当に満足していると言えます。適切な動作がない場合もありますが、一般的にghostdriverは十分に安定しているように見えます。したがって、私のように、クロール/ Webスクレイピングの目的でブラウザが必要な場合は、Firefoxとxvfbの代わりにghostdriverを使用することをお勧めします。これにより、いくつかの頭痛の種が発生します...
私はいくつかのことをしてこれを回避することができました。
まず、Webドライバーのタイムアウトを設定します。例えば。、
_WebDriver wd;
... initialize wd ...
wd.manage().timeouts().pageLoadTimeout(5000, TimeUnit.MILLISECONDS);
_
次に、getを実行するときに、TimeoutExceptionをラップします。 (念のため、UnhandledAlertExceptionキャッチを追加しました。)例:
_for (int i = 0; i < 10; i++) {
try {
wd.get(url);
break;
} catch (org.openqa.Selenium.TimeoutException te) {
((JavascriptExecutor)wd).executeScript("window.stop();");
} catch (UnhandledAlertException uae) {
Alert alert = wd.switchTo().alert();
alert.accept();
}
}
_
これは基本的にページの読み込みを試みますが、タイムアウトすると、javascriptによるページの読み込みを強制的に停止してから、ページの取得を再試行します。あなたの場合は役に立たないかもしれませんが、特にWebdriverのgetCurrentUrl()
コマンドを実行する場合は間違いなく役立ちます。これも時間がかかりすぎ、アラートが発生し、取得する前にページの読み込みを停止する必要があります。 URL。
私の解決策は、次のクラスを使用することです。WebDriverBackedSelenium
;
//When creating a new browser:
WebDriver driver = _initBrowser(); //Just returns firefox WebDriver
WebDriverBackedSelenium backedSelenuium =
new WebDriverBackedSelenium(driver,"about:blank");
//This code has to be put where a TimeOut is detected
//I use ExecutorService and Future<?> Object
void onTimeOut()
{
backedSelenuium.runScript("window.stop();");
}
私は同じ問題に遭遇しました、そしてそれが思われる一般的な解決策はありません。ただし、バグ追跡システムにはバグがあり、「スター」を付けて投票することができます。
http://code.google.com/p/Selenium/issues/detail?id=687
そのバグに関するコメントの1つには、うまくいく可能性のある回避策があります-基本的に、必要な時間待機する別のスレッドを作成し、ブラウザーでエスケープを押すことをシミュレートしようとしますが、ブラウザーウィンドウが最前面にある必要があります、これは問題になる可能性があります。
さて、次の概念はChrome、同じことを試してください:
1)「about:blank」に移動します2)要素「body」を取得します3)要素で、SendKeysËsc
解決するのは本当に退屈な問題でした。しかし、なぜ人々がそれを複雑にしているのか疑問に思います。私はちょうど次のことをしました、そして問題は解決されました(おそらく最近サポートされました):
driver= webdriver.Firefox()
driver.set_page_load_timeout(5)
driver.get('somewebpage')
Firefoxドライバー(およびChromeドライバーも)を使用して動作しました。
基本的に、ブラウザーのタイムアウトをSeleniumハブよりも低く設定してから、エラーをキャッチします。次に、ブラウザの読み込みを停止してから、テストを続行します。
webdriver.manage().timeouts().pageLoadTimeout(55000);
function handleError(err){
console.log(err.stack);
};
return webdriver.get(url).then(null,handleError).then(function () {
return webdriver.executeScript("return window.stop()");
});
私が今日見つけた奇妙なことの1つは、私のマシン(FF3.6-4.0およびMac Os 10.6.7)へのロードを停止しない1つのWebサイトが、Chrome in myマシンと、私の同僚の別のMac OSおよびWindowsマシンでも!
この問題はFirefoxのバグと密接に関連していると思います。詳細については、 このブログ投稿 を参照してください。たぶんFireFoxを最新バージョンにアップグレードすることで問題が解決するでしょう。とにかく、「停止」ボタンをシミュレートするSeleniumのアップデートを見たいです...