10

特定の未知の状況で、selenium は open メソッドを使用したときにページが読み込まれたことを検出しません。Java API を使用しています。例 (このコードはこのエラーを生成しません。外部から表示されるページを知りません。):

Selenium browser = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com");
browser.start();
browser.open("http://www.google.com/webhp?hl=en");
browser.type("q", "hello world");

エラーが発生すると、タイムアウトが発生する前にページが正常にロードされたことを明確に確認できますが、「open」の呼び出しがタイムアウトになります。タイムアウトを増やしても効果はありません。「type」の呼び出しは発生せず、進行はありません。

このエラーが発生したときにページが読み込まれたことをセレンに認識させるにはどうすればよいですか?

4

9 に答える 9

2

私はごく最近この問題に直面しました。

すべての JS ベースのソリューションは、私が持っている ICEFaces 2.x + Selenium 2.x/Webdriver の組み合わせには完全には適合しませんでした。

私がしたことと私のために働いたことは次のとおりです。

画面の隅には、接続アクティビティ インジケーターがあります。

            <ice:outputConnectionStatus id="connectStat"
                                        showPopupOnDisconnect="true"/>

私の Java 単体テストでは、「アイドル」イメージが再び返されるまで待ちます。

private void waitForAjax() throws InterruptedException {
    for (int second = 0;; second++) {
        if (second >= 60) fail("timeout");
        try { 
            if ("visibility: visible;".equals(
                selenium.getAttribute("top_right_form:connectStat:connection-idle@style"))) { 
                break;
            }
        } catch (Exception e) {

        }
        Thread.sleep(1000);
    }
}

ページに表示する必要がない場合は、本番ビルドでこのインジケーターのレンダリングを無効にするか、空の 1x1 gif を画像として使用できます。

100% (ポップアップ、プッシュされたメッセージなどで) 動作し、要素ごとに個別に waitForElement(...) を指定する地獄から解放されます。

これが誰かに役立つことを願っています。

于 2011-11-10T11:54:17.383 に答える
1

'open'の代わりに'openAndWait'を使用するとうまくいきます。

ウェブサイトから:

多くのアクションは、「andWait」サフィックスを付けて呼び出すことができます(例:「clickAndWait」)。この接尾辞は、アクションによってブラウザーがサーバーを呼び出すようになり、Seleniumは新しいページがロードされるのを待つ必要があることをSeleniumに通知します。

于 2008-09-18T19:44:28.830 に答える
1

Selenium のテストを行うときは、特定の要素が表示されるかどうかを確認するのを待ってから (waitForVisible)、アクションを実行します。私は通常、入力している要素の後に要素を使用しようとします。

于 2008-09-17T22:25:05.287 に答える
0

もう 1 つのアイデアは、AJAX API を変更することです (AJAX アクションの後にテキストを追加するため)。ajaxアクションが終了した後、戻る前に、非表示フィールドをTRUEに設定すると、セレンはそれを見つけて青信号として読み取ります

htmlで:

<input type='hidden' id="greenlight">

セレンで

if(driver.findElement(By.id("greenlight")).getAttr("value").equals("TRUE")){
    // do something after page loading
}
于 2013-09-18T11:22:20.513 に答える
0

If you page has no AJAX, try to seek footer of page (I also use Junit fail(""), you may use System.err.println() instead):

    element.click();
    int timeout =120; 
    // one loop = 0.5 sec, co it will be one minute 
    WebElement myFooter = null;

    for(int i=0; i<timeout; i++){
      myFooter = driver.findElement(By.id("footer"));
      if(myFooter!= null){
        break;
      }
      else{
        timeout--;
      }
}
if(timeout==0 && myFooter == null){
  fail("ERROR! PAGE TIMEOUT");
}
于 2013-09-18T11:15:51.430 に答える
0

「マルチウィンドウ」機能を有効にすると問題は解決しましたが、理由はわかりません。

SeleniumServer(int ポート、boolean slowResources、boolean multiWindow)

SeleniumServer server = new SeleniumServer(4444, false, true);

明確化は役に立ちます。

于 2008-09-17T22:25:27.970 に答える
0

Selenium を使用して iFrame でアプリケーションをテストしているときに、同様の問題に遭遇しました。基本的に、プライマリ ページ (iframe を含むページ) が読み込まれると、Selenium は iframe コンテンツの読み込みがいつ完了したかを判断できなかったようです。

読み込もうとしているリンクのソースを見ると、ページが読み込まれると追加のページ要素を作成する Javascript があるようです。確かではありませんが、上記の状況と似ているように見えるため、これが問題の原因である可能性があります。

静的ページをロードすると同じようなエラーが発生しますか? (つまり、ストレートな html を持つもの)

より良い回答が得られない場合は、Selenium フォーラムを試してみてください。通常、フォーラムは非常に活発で、Selenium 開発者は適切な質問に回答しています。

http://clearspace.openqa.org/community/selenium_remote_control

また、まだ試していない場合は、開く呼び出しの後に browser.WaitForPageToLoad("15000") への呼び出しを追加します。技術的には必須ではありませんが、ページ遷移のたびにこれを行うと、テストがもう少し確実になることがわかりました。(Selenium がページが実際に読み込まれたことを検出すると、それは続行されるため、実際のタイムアウト変数は実際には問題になりません..

于 2008-09-18T12:41:09.380 に答える