2016-07-27 22 views
0

私はAngularJSアプリケーションをテストするためにセレンを使用しています。私はそれが完全にロードされるまでページ上で何もできないという問題に直面しています。私はThread.sleep()を置くことができますが、これは私が知っているように良い解決策ではありません。ページが読み込まれるまで待つ方法はたくさんありますが(私はGoogleにしました)、私はそれらをすべて試してもまだ運がないと思っています。私のアプリケーションでは、Webページに行くとすべてが視覚的な視点から読み込まれますが、フルページが読み込まれるまで(約1秒)は実行できません。 は、あなたたちは、あなたがそれをやったどのようにあなたの実装を共有することができ、実際にSeleniumとAngularjsが何らかのアクションを行うまで待ちます

に動作しているあなたに

私のコードありがとう:私は似たような状況に直面している

public By ngWait(final By by) { 
    return new FluentBy() { 
     @Override 
     public void beforeFindElement(WebDriver driver) { 
      driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS); 
      ((JavascriptExecutor) driver).executeAsyncScript("var callback = arguments[arguments.length - 1];" + 
        "angular.element(document.body).injector().get('$browser').notifyWhenNoOutstandingRequests(callback);"); 
      super.beforeFindElement(driver); 
     } 

     @Override 
     public List<WebElement> findElements(SearchContext context) { 
      return by.findElements(context); 
     } 

     @Override 
     public WebElement findElement(SearchContext context) { 
      return by.findElement(context); 
     } 

     @Override 
     public String toString() { 
      return "ngWait(" + by.toString() + ")"; 
     } 
    }; 
} 

enter image description here

enter image description here

+0

何を試しましたか?結果は何ですか? [ask]のヘルプトピックをお読みください。あなた自身の問題を研究し、コードサンプルなどを見つけ、問題を解決するためのコードを書く必要があります。あなたがすべてを行い、まだそれを理解できない場合は、あなたの質問を編集し、あなたが行った研究からメモを追加してください。あなたが試したコードは[mcve]に減らしました。エラーメッセージなど。関連するHTMLを含め、HTMLとコードを適切にフォーマットすることも非常に重要です。 – JeffC

+0

"完全に読み込まれた"状態は、特にコンテンツが動的に作成された場合、主観的です。したがって、ページを完全にロードする要素を定義し、最後に作成した要素または要素の状態を待つ必要があります。 –

+0

@FlorentB。、私は完全にアプリケーションで作業できるように待つ必要があると思うものを追加しました。この要素が完全にロードされるのを待つ方法を知っていますか?私がやろうとしたコードを追加しました.. –

答えて

2

を角型アプリに対してセレンを使用してテストを作成しています。実際には、アングルアプリでは、ページのスケルトンまたはビューが即座に読み込まれますが、データをフェッチするためにバックグラウンドで$httpリクエストを呼び出し続けます。角度アプリが$http呼び出しを終了すると、ビューは$ httpコールの応答でレンダリングされます。waitUntilPageToBeLoadwaitUntilElementToBeClickableのような古典的なセレンの待機は、ここではまったく機能しません。もう1つの解決策はThread.Sleep()ですが、あなたが指摘したように、それはインテリジェントな待機ではありません。

なぜ、$httpコールがバックグラウンドで終了していることを確認するための待機方法がないのでしょうか。あなたは下のメソッドを試すことができます、それは私のために働いた。私はそれもあなたのために動作することを願っています!

public void untilAngularFinishHttpCalls() { 
     final String javaScriptToLoadAngular = 
       "var injector = window.angular.element('body').injector();" + 
       "var $http = injector.get('$http');" + 
       "return ($http.pendingRequests.length === 0)"; 

     ExpectedCondition<Boolean> pendingHttpCallsCondition = new ExpectedCondition<Boolean>() { 
      public Boolean apply(WebDriver driver) { 
       return ((JavascriptExecutor) driver).executeScript(javaScriptToLoadAngular).equals(true); 
      } 
     }; 
     WebDriverWait wait = new WebDriverWait(driver, 20); // timeout = 20 secs 
     wait.until(pendingHttpCallsCondition); 
    } 
+1

ありがとうございます。あなたのコードを試しましたが、例外があります: 'org.openqa.selenium.WebDriverException:不明なエラー:[jqLit​​e:nosel] jqLit​​eではセレクタを介して要素を検索していません!この行を指すhttp://docs.angularjs.org/api/angular.element http:// errors.angularjs.org/1.5.8/jqLit​​e/nosel'を参照してください。 'return((JavascriptExecutor)driver) .executeScript(javaScriptToLoadAngular).equals(true); 'あなたは何について考えていますか? –

+0

ライブラリを追加しましたか? –

+0

いいえ私はライブラリを一切使用していません。 –

0

申し訳ありませんが、私はまだコメントを投稿できません。ここに回答があります。

Priyanshu Shekharの答えに関するコメントの誤りから、jqLit​​e(Angularの基本的なjqueryバージョン)は、そのコードがしようとしていることを実行するには不十分です。

ページに完全なjqueryバージョンを含めると、その問題を解決する必要があります。

関連する問題