2013-03-06 32 views
13

Làm cách nào tôi có thể sử dụng WebDriverWait để đợi cho đến khi thuộc tính thay đổi?WebDriverWait cho thuộc tính phần tử để thay đổi

Trong AUT của tôi, tôi phải chờ một nút được bật trước khi tiếp tục, thật không may do cách nhà phát triển mã hóa trang tôi không thể sử dụng phương thức isEnabled() của WebElement. Các nhà phát triển đang sử dụng một số CSS để chỉ làm cho nút trông giống như nó bị vô hiệu hóa để người dùng không thể nhấp vào nó và phương pháp isEnabled luôn luôn trả về true cho tôi. Vì vậy, những gì tôi phải làm là lấy thuộc tính "aria-disabled" và kiểm tra xem văn bản là "true" hay "false". Những gì tôi đã làm cho đến nay là một vòng lặp for với Thread.sleep, một cái gì đó như thế này:

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); 
} 

(bỏ qua các mã trên nếu không chính xác, chỉ cần giả mã của những gì tôi đang làm)

Tôi chắc chắn có một cách để đạt được một cái gì đó tương tự bằng cách sử dụng WebDriverWait đó là phương pháp ưa thích tôi chỉ không thể tìm ra cách. Đây là những gì tôi đang cố gắng để đạt được mặc dù những điều sau đây sẽ không làm việc:

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

Rõ ràng nó không hoạt động vì hàm được mong đợi một WebElement không Chuỗi nhưng đó là những gì tôi đang cố gắng để đánh giá. Bất kỳ ý tưởng?

Trả lời

25

Sau đây có thể giúp yêu cầu của bạn. Trong đoạn mã sau, chúng tôi ghi đè phương pháp áp dụng kết hợp với điều kiện mà chúng tôi đang tìm kiếm. Vì vậy, miễn là điều kiện là không đúng, trong trường hợp của chúng tôi, kích hoạt là không đúng, chúng tôi đi trong một vòng lặp tối đa 10 giây, bỏ phiếu mỗi 500 ms (đây là mặc định) cho đến khi phương thức áp dụng trả về 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

Nếu ai đó muốn sử dụng @Sri như một phương pháp trong một wrapper Selenium, đây là một cách để làm điều đó (nhờ 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

này đã làm việc cho tôi khi tự động chống lại một trang khởi động khá chậm chờ nút sắp xếp có hiệu lực.

new WebDriverWait(webDriver, 10) 
.until(ExpectedConditions.attributeContains(BUTTON_SORT_ASCENDING_PRICE, "class", "sortButtonActive")); 
  • "webDriver" - Ví dụ hiện tại của tôi WebDriver
  • "10" - thời gian chờ giây
  • "BUTTON_SORT_ASCENDING_PRICE" - Các Bằng cách định vị cho các phần tử
  • "class" - thuộc tính
  • "sortButtonActive" - giá trị của 'lớp' i đang chờ đợi

Selenium v3.01

0

Nó cũng có thể được thực hiện bằng một do-while loop đơn giản, System.currentTimeMillis(); phương pháp có thể được sử dụng để tránh vòng lặp vô hạn

long startTime = System.currentTimeMillis(); 
String disabled; 
do{ 
    disabled = element.getAttribute("attributeName").trim(); 
}while(disabled!="false" && System.currentTimeMillis()-startTime<10000); 
Các vấn đề liên quan