17

WebDriver と Firefox でいくつかのテストを実行しています。

次のコマンドで問題が発生しています。

WebDriver.get(www.google.com);

このコマンドを使用すると、onload イベントが発生するまで WebDriver がブロックされます。これには通常数秒かかりますが、読み込みが終わらない Web サイトでは数時間かかる場合があります。

私がやりたいのは、特定のタイムアウト後にページの読み込みを停止し、何らかの形で Firefox の停止ボタンをシミュレートすることです。

ページを読み込もうとするたびに、最初に次の JS コードを実行しようとしました。

var loadTimeout=setTimeout(\"window.stop();\", 10000);

残念ながら、これはおそらく次の理由で機能しません。

スクリプトがロードされる順序のため、stop() メソッドは、それが含まれているドキュメントのロードを停止できません1

更新 1: 接続と要求のタイムアウトを追加するために SquidProxy を使用しようとしましたが、問題は解決しませんでした。

今日見つけた奇妙なことの 1 つは、私のマシン (FF3.6 - 4.0 および Mac Os 10.6.7) での読み込みが停止しない Web サイトが、他のブラウザーやコンピューターでは正常に読み込まれたことです。

更新 2: この問題は、Firefox に画像を読み込まないように指示することで解決できるようです。うまくいけば、すべてがその後うまくいくでしょう...

WebDriver を使用するには、より優れた Chrome ドライバーがあればいいのにと思います。Firefox には毎日がっかりさせられます。

更新 3: Selenium 2.9 では、ドライバーがハングしているように見えるケースを処理するための新しい機能が追加されました。FirefoxProfileこれは次のように使用できます。

FirefoxProfile firefoxProfile = new ProfilesIni().getProfile("web");
firefoxProfile.setPreference("webdriver.load.strategy", "fast");

試した後、これが機能するかどうかを投稿します。

更新 4: 最後に、上記の方法はどれも機能しませんでした。完了するのに時間がかかるスレッドを「殺す」ことになります。PhantomJS をバックエンドとして使用するリモート WebDriver であるGhostdriverを試す予定です。PhantomJS はヘッドレス WebKit スクリプト可能であるため、firefox などの実際のブラウザーの問題は発生しないと予想されます。firefox (クロール目的) を使用する義務がない人のために、結果を更新します。

更新 5: 更新の時間です。FirefoxDriver の代わりに Ghostdriver 1.1 を 5 か月間使用して、パフォーマンスと安定性に本当に満足していると言えます。適切な動作をしていないケースがいくつかありましたが、一般的にゴーストドライバーは十分に安定しているようです。したがって、私のように、クロール/Webスクレイピング用のブラウザーが必要な場合は、firefoxとxvfbの代わりにghostdriverを使用することをお勧めします。これにより、いくつかの頭痛の種になります...

4

8 に答える 8

6

いくつかのことを行うことで、これを回避することができました。

まず、webdriver のタイムアウトを設定します。例えば、

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 を介してページの読み込みを強制的に停止し、再度ページを取得しようとします。getCurrentUrl()あなたの場合は役に立たないかもしれませんが、特にウェブドライバーのコマンドを実行するときに、時間がかかりすぎたり、アラートが表示されたり、URLを取得する前にページの読み込みを停止する必要がある場合に、間違いなく役に立ちました。

于 2014-02-18T16:23:16.607 に答える
2

私の解決策は、このクラスを使用すること 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();");
}
于 2012-12-06T18:11:21.450 に答える
2

私は同じ問題に遭遇しましたが、一般的な解決策はないようです。ただし、バグ追跡システムにはバグがあり、「スター」を付けて投票することができます。

http://code.google.com/p/selenium/issues/detail?id=687

そのバグに関するコメントの 1 つに、うまくいく可能性のある回避策があります。基本的には、必要な時間を待機する別のスレッドを作成し、ブラウザでエスケープを押すことをシミュレートしようとしますが、ブラウザ ウィンドウを最前面にする必要があります。 、これは問題になる可能性があります。

http://code.google.com/p/selenium/issues/detail?id=687#c4

于 2011-06-20T08:06:30.877 に答える
0

基本的に、ブラウザーのタイムアウトをセレンハブよりも低く設定してから、エラーをキャッチします。次に、ブラウザーの読み込みを停止して、テストを続行します。

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()");
        });

于 2015-06-18T09:22:53.953 に答える
0

今日見つけた奇妙なことの 1 つは、私のマシン (FF3.6 - 4.0 および Mac Os 10.6.7) でのロードが停止しない Web サイトが、私のマシンの Chrome と別の Mac OS および Windows で正常にロードを停止することです。私の同僚のマシン!

この問題は Firefox のバグと密接に関連していると思います。詳細については、このブログ投稿を参照してください。FireFox を最新バージョンにアップグレードすると、問題が解決する場合があります。とにかく、「停止」ボタンをシミュレートする Selenium の更新を希望します...

于 2012-01-19T18:01:51.127 に答える
-1

他の誰かが同じ永遠の読み込みの煩わしさで立ち往生している可能性がある場合に備えて、Firefox 用の Killspinnersなどの単純なアドオンを使用して、簡単に作業を行うことができます.

編集:javascriptが問題である場合、この解決策は機能しません。次に、次のような Greasemonkey スクリプトを使用できます。

// ==UserScript==
// @name        auto kill
// @namespace   default
// @description auto kill
// @include     *
// @version     1
// @grant       none
// ==/UserScript==

function sleep1() {
  window.stop();
  setTimeout(sleep1, 1500);
}

setTimeout(sleep1, 5000);

于 2016-09-24T08:42:37.647 に答える