2017-05-15 3 views
-1

JavaでSeleniumを使用すると、古い要素参照に関するエラーが頻繁に発生します。私がテストしているアプリケーションはAngularJS 2.0を使用しています。ときどき明示的な待機が問題を解決することがありますが、ほとんどの場合、そうしないことがあります。テストでこのようなエラーを無視することはできますか?私はこれをどうやって実装するのですか?SeleniumとJavaで古い要素参照を無視する

+1

[お問い合わせ]と[どのくらいの研究努力が必要ですか?](https://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow)をお読みください。 -users)試したコードとエラーメッセージなどの実行結果を提供してください。ページや関連するHTMLへのリンクも提供してください。 – JeffC

+0

ご意見ありがとうございますが、残念ながら私の質問はコードの一部を扱っていませんでした。そしてこのトピックを研究することでわかるように、それは非常に漠然としていて、文書化されていません。 AngularJSのページでJavaを使った古い要素の調査から、あなたはたくさんの答えを得ることができましたが、残念ながらそれらのほとんどはかなり悪いです。再び私の質問は、コードに関連するものではなく、トピックへのアプローチでした。 –

+0

もちろんコードです。あなたはアプリケーションを自動化するコードを書こうとしています。古い要素の例外などを避けるために、明示的な待ち時間について言及していますが、あなたが試したコードやコメント(エラーメッセージを含む) – JeffC

答えて

0

アヴラム、

アプリケーションは角JSを使用しているとしてそれは、我々はいくつかのケースでは古くなった要素の参照例外が発生します理由ですので、アプリケーションは毎回ロードします。 Angular JSを使用しているアプリケーションを自動化する際にも同じ問題が発生しました。分度器は、意図的に待機する必要がないように、分度器が準備された待機時間を持つので、この種のアプリケーションには分度器ツールが最適です。この問題を克服する唯一の方法は、スレッドが毎回その例外を見つける場所でスリープ状態にすることです。流暢な待機コードでStale要素参照クラスを無視し続ける

new FluentWait<WebDriver>(driver) 
        .withTimeout(Time, TimeUnit.SECONDS) 
        .pollingEvery(
          Time, 
          TimeUnit.SECONDS) 
        .ignoring(NoSuchElementException.class) 
        .ignoring(StaleElementReferenceException.class) 
        .until(new ExpectedCondition<WebElement>() { 
        public WebElement apply(WebDriver driver) { 
         return driver.findElement(locator); 
1

Angular porting JAVAを使用すると、ケースに合わせやすくなります。ページ状態とAJAX準備完了イベントを無視することは安定した解決策ではありません。 JavascriptExecutor interfraceを使用して独自のウェイトを実装することもできます。カスタムJSをコードに挿入してブラウザを操作することができます。このようにそれを使用します。

long start = System.currentTimeMillis(); 
    ((JavascriptExecutor) driver).executeScript(
     "// your JS code here"); 

私はPythonでそれをしなければならなかったときthose slidesを使用しましたが、JSコードは同じまま。私たちはこのソリューションに満足しています。

1

自動化シングルページアプリケーション(SPA)は新しい課題であり、Selenium WebDriverと関連するフレームワークのさらなる改善を推進します。このようなシナリオで

は、私がSerenityBDDからメソッドwaitForAngularRequestsToFinish()を借りる:

それは基本的に JavascriptExecutorが通知または処理されている保留中の角度の要求が存在しない場合にのみ、返す非同期のスクリプトを実行して使用している何
 
    public void waitForAngularRequestsToFinish() { 
     if ((boolean) getJavascriptExecutorFacade().executeScript("return (typeof angular !== 'undefined')? true : false;")) { 
       getJavascriptExecutorFacade().executeAsyncScript("var callback = arguments[arguments.length - 1];" + "angular.element(document.body).injector().get('$browser').notifyWhenNoOutstandingRequests(callback);"); 
     } 
    } 

関連する問題