2017-01-11 6 views
-1

SeleniumでAngularJS Webサイトをテストする必要があります。角度指示のためセレンを使った角度のWebサイトをテストするのは難しいというブログを読んでいます。 私はSeleniumで試してみましたが、ケースを実行するのに成功しましたが、失敗し、 "要素を見つけることができません"、 "そのような要素がありません"、または "NULLポインタ例外"のように安定しません。 セレンで成功させる方法がありますか? 私はProtectorJSについても読んでいますが、セレンはテスト走行の優先順位にあります。AngularJSサイトで要素を検索する際にSeleniumがNullポインタ例外を表示する

ありがとうございます。

+0

[anglejsのアプリはセレンで自動化できますか?はい、なぜ我々は分度器を使用する必要がありますか?](http://stackoverflow.com/questions/27380994/can-angularjs-apps-be-automated-with-selenium-if-yes-why-should-we-use-protrac ) –

+0

あなたが書いていることは、世界中のセレンの自動化の専門家(私を含む)が直面している課題です。それはちょうどその方法です - あなたは一人ではありません。 –

答えて

0

私は同じ問題を抱えていました。暗黙のセレン待ち時間は角度がありませんでした。テスト期間を大幅に延ばすために明示的に待ってテストを混乱させたくありませんでした。

私はこれが見つかりました:それはセレンで使用することができ分度器由来webdriverをあるhttps://github.com/paul-hammant/ngWebDriver

を。

私は、アクションを実行する前に(クリック、塗りつぶし、チェックなど)、アングルを待つアクションクラスを作成しました。コードスニペットについては、my answer to this questionを参照してください。

+0

この解決策は私のために働いています。ありがとう@ in016hoe – promitheus

+0

@promitheus私の答えがあなたの問題を解決したことを聞いてよかった。緑色のチェックマークをクリックして答えを受け入れることができます。 – in016hoe

0

この問題は、取得しようとしているフィールドがまだ存在しないためです。

は残念ながらありません可能自動修正ですが、何を行うことができますが、この属性があるまで待機するコードの一部を追加することですが

WebDriverWait.until(findElement(By.xpath("//[@id='id']")); 

他のオプションは、あなたのコード内でwait(ms)機能を追加し、あれを呼べ。

両方の問題は、この理由で多くの行を書く必要があることです。

0

角度処理された要素を待つために、すべての角度要求が終了するまで待つことができます。

セレンが予想される条件のExpectedCondition

例で、このようなタスクを実行するためにExplicit Waitsを提供しています。その後

public static ExpectedCondition<Boolean> angularHasFinishedProcessing() { 
return new ExpectedCondition<Boolean>() { 
    @Override 
    public Boolean apply(WebDriver driver) { 
     return Boolean.valueOf(((JavascriptExecutor) driver).executeScript("return (window.angular !== undefined) && (angular.element(document).injector() !== undefined) && (angular.element(document).injector().get('$http').pendingRequests.length === 0)").toString()); 
    } 
}; 

}

、私達はちょうどに、すべてのAJAX要求を待つために、私たちのコードを使用することができます完了 ExpectedCondition

で実装されている Explicit Waitsに提供します
WebDriverWait wait = new WebDriverWait(driver, 15, 100); 
wait.until(AdditionalConditions. angularHasFinishedProcessing())); 

ここで行ったことは、JavascriptExecutorを使用し、保留中のリクエストを取得するためにjavascriptを実行しました。保留中の要求がない場合、この要素を使用できます。