2017-10-10 95 views
1

我想實現自定義等待方法,應該等到加載彈出窗口可見。Customwait - 檢查元素是可見/消失與硒webdriver(元素是在DOM中,但不可見)

此加載彈出框有它自己的id =「wait」。我用這個自定義expectedConditions(從#1),以檢查它:就當裝載仍清晰可見,我不知道爲什麼

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暫停執行,直到預期條件成立。 ex: WebDriverWait wait = new WebDriverWait(driver,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

感謝您的代碼。我嘗試了所有預期的條件,但正如我之前提到的,驅動程序無法識別彈出狀態的差異。我用Id。你認爲,我應該用xpath來代替嗎?我知道它不應該修改任何東西,我只是猜測... – brobee

0

這很難說,爲什麼你的代碼是沒有更多的代碼工作。您的自定義等待中確實有一些邏輯錯誤,但您不需要自定義等待,因爲ExpectedConditions已經具有可見性和隱形覆蓋。

使用此等待彈出出現

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

使用此等待彈出消失

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

有些時候,一個彈出窗口只是爲動態加載內容的容器。在這些情況下,您可能會等待彈出窗口的框架出現,但框架的內容尚未完全加載,因此如果您嘗試與它們進行交互,將會出現錯誤。在這些情況下,您需要等待容器內的元素可見。

對話框關閉時也是如此。我曾經有過等待對話框容器關閉的經驗,但是灰色疊加層仍然阻止點擊等。在這些情況下,我必須等待疊加層變得不可見。

我建議你花一些時間熟悉ExpectedConditions的可用方法,並且不必爲自己已經存在的東西編寫自定義等待,也不需要進行調試/測試。

+0

你好傑夫,謝謝你的回覆。主要的問題,所有提到的方法不起作用,因此我嘗試了自定義的等待方法。 ExpectedConditions非常簡單,但在這種情況下不是。我猜,(只是假設)是主要問題,這個等待元素總是在dom中,每次,每一頁,我都可以在源代碼中找到它,只是可見性正在改變,webdriver無法識別差異。我嘗試了其他網站的這些方法,並且像魅力一樣工作,但在這種情況下,我無法使用它。需要一些技巧來解決這個問題。用一些Javascript? – brobee

+0

該元素可能始終位於DOM中,但這並不意味着此方法不起作用。硒可以區分現在和可見/不可見。請分享該網站或示例網站,以便我可以看到。 – JeffC

+0

我不能分享它,但我會檢查一些例子。 – brobee