2017-10-10 1 views
1

ローディングポップアップが表示されるまで待つ必要があるカスタムウェイトメソッドを実装したいと思います。Customwait - チェック要素がSelenium webdriverで表示/非表示になっています(要素はDOMにありますが、表示されません)

このロードポップアップには、独自のid = "wait"があります。私はそれをチェックする(StackOverflowのから)このカスタムexpectedConditionsを使用します。

public static ExpectedCondition<Boolean> absenceOfElementLocated(
      final WebElement element) { 
     return new ExpectedCondition<Boolean>() { 
      @Override 
      public Boolean apply(WebDriver driver) { 
       try { 
        element.isDisplayed(); 
        return false; 
       } catch (NoSuchElementException e) { 
        return true; 
       } catch (StaleElementReferenceException e) { 
        return true; 
       } 
      } 

      @Override 
      public String toString() { 
       return "element to not being present: " + element.getText(); 
      } 
     }; 
    } 

ロードがまだ目に見えると私はなぜ知らないときに私のスクリプトのパス。

ありがとうございます!

+0

WebDriverWaitを使用して、予想される条件が真になるまで実行を一時停止することができます。 例: WebDriverWait wait =新しいWebDriverWait(ドライバ、30000); wait.until(ExpectedConditions.visibilityOfElementLocated(By.id( "yourPopUpId"))); –

+0

ありがとう、私はそれを試みたが動作しません。ドライバがポップアップの変更を認識できません。 – brobee

+0

JavascriptExecutorを試して操作を実行してください – iamsankalp89

答えて

0

使用ExpectedConditions#invisibilityOfElementLocated(By locator)

また、否定を使用することができます - >ExpectedConditions#not(ExpectedCondition condition)

基本的な例:このページへの
移動:Primefaces - dropdownクリックした場合は、このページのSubmitボタンは、あり

このボタンを押すとSelectedというメッセージが画面に表示され、数秒後にこのメッセージが消えてしまいます。

だから我々は、以下のイベントのために我々のコードで待機します:

  • ボタンが表示され、clickeableである(それはclickeableなくなるまで、それをクリックすることはできません)
  • メッセージが表示され、
  • 見えますメッセージが表示されていない消え

WebDriver driver = new ChromeDriver(); 

try { 
    driver.get("https://www.primefaces.org/showcase/ui/ajax/dropdown.xhtml"); 

    final By buttonSubmit = By.xpath("//button[ *[ text() = 'Submit' ]]"); 
    final By message = By.xpath("//span[ text() = 'Selected' ]"); 

    WebDriverWait wait = new WebDriverWait(driver, 50); 

    long time = System.currentTimeMillis(); 

    wait.until(ExpectedConditions.elementToBeClickable(buttonSubmit)).click(); 
    System.out.println(String.format("Button clicked after %d miliseconds", System.currentTimeMillis() - time)); 

    wait.until(ExpectedConditions.visibilityOfElementLocated(message)); 
    System.out.println(String.format("The message appeared after %d miliseconds", System.currentTimeMillis() - time)); 

    // wait.until(ExpectedConditions.invisibilityOfElementLocated(message)); 
    wait.until(ExpectedConditions.not(ExpectedConditions.visibilityOfElementLocated(message))); 
    System.out.println(String.format("The message dissapeared after %d miliseconds", System.currentTimeMillis() - time)); 

} finally { 
    driver.quit(); 
} 

、結果は次のとおりです。

Starting ChromeDriver 2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f) on port 15827 
..... 
..... 
..... 
Button clicked after 153 miliseconds 
The message appeared after 791 miliseconds 
The message dissapeared after 6924 miliseconds 
+0

あなたのコードをありがとう。私はすべての予期した条件を試しましたが、前に述べたように、ドライバはポップアップ状態の違いを認識できません。私はイドを使いました。代わりにxpathを使うべきだと思いますか?私はそれが何かを変更すべきではないことを知っている、私はちょうど推測している... – brobee

0

それはあなたのコードは、コードの複数がなく機能していない理由を伝えるのは難しいです。 ExpectedConditionsにはすでに可視性と不可視性が含まれているため、カスタム待ち時間にいくつかの論理エラーがありますが、カスタム待ち時間は必要ありません。これは、ポップアップが動的にロードされたコンテンツのためだけのコンテナである場合があります

new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(By.id("wait"))); 

を消えるために、ポップアップを待つ

new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.id("wait"))); 

を使用し表示されるようにポップアップを待つ

使用この。このような場合は、ポップアップのフレームが表示されるのを待つかもしれませんが、フレームの内容がまだ読み込まれていないので、それらとやり取りしようとするとエラーが発生します。そのような場合は、コンテナ内の要素が表示されるまで待つ必要があります。

ダイアログが閉じているときと同じです。私は、ダイアログコンテナが閉じられるのを待っていたけれど、灰色のオーバーレイはまだクリックをブロックしていました。そのような場合、オーバーレイが見えなくなるのを待たなければなりませんでした。

ExpectedConditionsという利用可能な方法に慣れて、既に存在するものをデバッグ/テストする必要がないカスタムウェイトを書く必要がありません。

+0

こんにちはジェフ、あなたの返信のおかげで。主な問題は、言及されたすべてのメソッドが動作しないため、私はカスタム待ちメソッドを試しました。 ExpectedConditionsはかなり単純ですが、この場合はありません。私は、主な問題を(唯一の前提)、この待っている要素は常にDOMにあると思う、私は毎回、すべてのページのソースでそれを見つけることができます、可視性が変化しているとwebdriverは違いを認識できません。私はこれらの方法を他のサイトで試してみましたが、魅力的なように動作しますが、この場合は使用できません。この問題を解決するにはいくつかのトリックが必要です。いくつかのJavascriptで? – brobee

+0

要素は常にDOM内にある可能性がありますが、この方法が機能しないわけではありません。セレンは、現在と目に見える/目に見えないものの違いを伝えることができます。私が見ることができるようにサイトまたはサンプルサイトを共有してください。 – JeffC

+0

私は残念ながらそれを共有することはできませんが、私はいくつかの例を確認します。 – brobee

関連する問題