2013-03-06 151 views
13

如何使用WebDriverWait等待屬性更改?WebDriverWait用於更改元素屬性

在我的AUT中,我必須等待按鈕才能繼續,因爲開發人員編寫頁面的方式不能使用WebElement的isEnabled()方法。開發人員正在使用一些CSS來使按鈕看起來像禁用,因此用戶無法點擊它,並且方法isEnabled總是爲我返回true。所以我必須做的是獲得「詠歎調禁用」的屬性,並檢查文本是「真」還是「假」。我到目前爲止一直在做的事情是一個與了Thread.sleep,這樣的循環:

for(int i=0; i<6; ++i){ 
    WebElement button = driver.findElement(By.xpath("xpath")); 
    String enabled = button.getText() 
    if(enabled.equals("true")){ break; } 
    Thread.sleep(10000); 
} 

(忽略上面的代碼如果不正確,只是假的我在做什麼碼)

我確定有一種方法可以使用WebDriverWait來實現類似的功能,這是我無法弄清楚的首選方法。這就是我想實現即使下面的不會起作用:

WebDriverWait wait = new WebDriverWait(driver, 60); 
wait.until(ExpectedConditions.visibilityOf(refresh.getText() == "true")); 

顯然,因爲函數需要一個WebElement不是字符串它不工作,但它就是我想要評估。有任何想法嗎?

回答

25

以下可能會幫助您的要求。 在下面的代碼中,我們覆蓋了包含我們正在尋找的條件的apply方法。所以,只要條件不成立,在我們的例子中,啓用是不正確的,我們循環最多10秒,輪詢每500毫秒(這是默認值),直到apply方法返回true。

WebDriverWait wait = new WebDriverWait(driver,10); 

wait.until(new ExpectedCondition<Boolean>() { 
    public Boolean apply(WebDriver driver) { 
     WebElement button = driver.findElement(By.xpath("xpath")); 
     String enabled = button.getAttribute("aria-disabled"); 
     if(enabled.equals("true")) 
      return true; 
     else 
      return false; 
    } 
}); 
1

如果有人想用@Sri如在硒包裝的方法,這裏是一個辦法做到這一點(感謝this answer BTW):

public void waitForAttributeChanged(By locator, String attr, String initialValue) { 
    WebDriverWait wait = new WebDriverWait(this.driver, 5); 

    wait.until(new ExpectedCondition<Boolean>() {   
     private By locator; 
     private String attr; 
     private String initialValue; 

     private ExpectedCondition<Boolean> init(By locator, String attr, String initialValue) { 
      this.locator = locator; 
      this.attr = attr; 
      this.initialValue = initialValue; 
      return this; 
     } 

     public Boolean apply(WebDriver driver) { 
      WebElement button = driver.findElement(this.locator); 
      String enabled = button.getAttribute(this.attr); 
      if(enabled.equals(this.initialValue)) 
       return false; 
      else 
       return true; 
     } 
    }.init(locator, attr, initialValue)); 
} 
0

對自動化時,這爲我工作一個非常慢的引導頁面等待排序按鈕生效。

new WebDriverWait(webDriver, 10) 
.until(ExpectedConditions.attributeContains(BUTTON_SORT_ASCENDING_PRICE, "class", "sortButtonActive")); 
  • 「的webdriver」 - 我目前的webdriver
  • 實例
  • 「10」 - 超時秒
  • 「BUTTON_SORT_ASCENDING_PRICE」 - 將通過定位器元素
  • 「class」 - 屬性
  • 「sortButtonActive」 - 的 '類' 的價值我在等待

硒V3.01

0

它也可以用一個簡單的do-while循環,System.currentTimeMillis的()來實現;方法可用於避免無限循環

long startTime = System.currentTimeMillis(); 
String disabled; 
do{ 
    disabled = element.getAttribute("attributeName").trim(); 
}while(disabled!="false" && System.currentTimeMillis()-startTime<10000);