2012-07-31 42 views
51

Tôi đang tìm một cái gì đó tương tự như waitForElementPresent để kiểm tra xem phần tử có được hiển thị trước khi tôi nhấp vào phần tử đó hay không. Tôi nghĩ điều này có thể được thực hiện bằng implicitWait, vì vậy tôi sử dụng như sau:WebDriver - đợi phần tử bằng cách sử dụng Java

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 

và sau đó nhấp vào bởi

driver.findElement(By.id(prop.getProperty(vName))).click(); 

Thật không may, đôi khi nó chờ đợi cho các phần tử và đôi khi không. Tôi đã tìm một lúc và tìm thấy giải pháp này:

for (int second = 0;; second++) { 
      Thread.sleep(sleepTime); 
      if (second >= 10) 
       fail("timeout : " + vName); 
      try { 
       if (driver.findElement(By.id(prop.getProperty(vName))) 
         .isDisplayed()) 
        break; 
      } catch (Exception e) { 
       writeToExcel("data.xls", e.toString(), 
         parameters.currentTestRow, 46); 
      } 
     } 
     driver.findElement(By.id(prop.getProperty(vName))).click(); 

Và nó chờ đợi, nhưng trước khi hết thời gian chờ đợi phải đợi 10 lần 5, 50 giây. Hơi nhiều. Vì vậy, tôi đặt hoàn toàn chờ đợi đến 1 giây và tất cả dường như tốt cho đến bây giờ. Bởi vì bây giờ một số điều chờ đợi 10s trước khi thời gian chờ nhưng một số những thứ khác hết thời gian sau 1s.

Làm thế nào để bạn bao gồm việc chờ phần tử hiện tại/hiển thị trong mã của bạn? Bất kỳ gợi ý nào đều đáng tin cậy.

Trả lời

100

Đây là cách tôi làm điều đó trong mã của mình.

WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>)); 

hoặc

wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>)); 

để được chính xác.

Xem thêm:

+1

Cảm ơn! Nếu tôi chỉ biết sớm hơn về lớp này, cuộc sống của tôi sẽ dễ dàng hơn :) – tom

+0

Làm cách nào để kết hợp mã của bạn vào định dạng này?\t '@FindBy (cách = How.ID, sử dụng =" nút đăng ký ") \t WebElement signUpButton;' Hơn nữa, tôi vẫn nhận được mã NPE với mã của bạn. Dường như nó đang cố gắng để có được elementToBeClickable. Làm thế nào chúng ta có thể sử dụng phương thức này khi phần tử không được nạp? – HelloWorldNoMore

-1

Tuyên bố chờ đợi ở trên là một ví dụ tuyệt vời về Thời gian chờ rõ ràng.

Như chờ đợi rõ ràng là chờ đợi thông minh được giới hạn trong một phần tử web cụ thể (như đã đề cập ở trên đường dẫn x).

Bằng cách sử dụng lệnh chờ rõ ràng, về cơ bản bạn đang nói với WebDriver ở mức tối đa là đợi các đơn vị X (bất kể bạn đã cung cấp thời gian chờ trong giây) trước khi từ bỏ.

+2

Thêm một số đoạn mã vào câu trả lời của bạn, vì những người dùng khác có thể sắp xếp các câu trả lời khác nhau và bối cảnh cho "Trên" có thể thay đổi đối với họ. –

3

Bạn có thể sử dụng chờ đợi Explicit hoặc thạo Chờ

Ví dụ về Chờ Explicit -

WebDriverWait wait = new WebDriverWait(WebDriverRefrence,20); 
WebElement aboutMe; 
aboutMe= wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("about_me")));  

Ví dụ về Chờ thạo -

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)        
.withTimeout(20, TimeUnit.SECONDS)   
.pollingEvery(5, TimeUnit.SECONDS)   
.ignoring(NoSuchElementException.class);  

    WebElement aboutMe= wait.until(new Function<WebDriver, WebElement>() {  
public WebElement apply(WebDriver driver) { 
return driver.findElement(By.id("about_me"));  
} 
}); 

Kiểm tra TUTORIAL này để biết thêm chi tiết.

1

Chúng tôi đang có rất nhiều điều kiện chủng tộc với elementToBeClickable. Xem https://github.com/angular/protractor/issues/2313. Nội dung nào đó dọc theo những dòng này hoạt động tốt ngay cả khi một lực lượng vũ phu nhỏ

Awaitility.await() 
     .atMost(timeout) 
     .ignoreException(NoSuchElementException.class) 
     .ignoreExceptionsMatching(
      Matchers.allOf(
       Matchers.instanceOf(WebDriverException.class), 
       Matchers.hasProperty(
        "message", 
        Matchers.containsString("is not clickable at point") 
       ) 
      ) 
     ).until(
      () -> { 
       this.driver.findElement(locator).click(); 
       return true; 
      }, 
      Matchers.is(true) 
     ); 
Các vấn đề liên quan