2012-05-03 26 views
10

Sau sự kiện nhấp, tôi cần đợi thuộc tính phần tử thay đổi trước khi tiếp tục (nhấp vào sự kiện khiến các yếu tố nhất định di chuyển ra khỏi tiêu điểm và một số yếu tố khác lấy nét qua JS)Thực hành tốt nhất để chờ đợi một sự thay đổi với Selenium Webdriver?

Sau khi dành thời gian tìm kiếm đáng tin cậy thay thế cho "waitForAttribute" (lệnh selenium 1) trong webdriver ... Tôi có thể lấy mã bên dưới để làm việc. Nhưng tôi không chắc liệu đây có phải là triển khai tốt nhất hay không ....

Bất kỳ giải pháp nào khác tốt hơn ??

wait = new WebDriverWait(wedriver1, TimeSpan.FromSeconds(5)); 
..... 
button.Click(); 
wait.Until(webdriver1 => webdriver2.webelement.GetAttribute("style").Contains("display: block")); 

Ngoài ra, bất kỳ ai cũng có thể chia sẻ liên kết đến cách tôi có thể xử lý các thay đổi sự kiện AJAX bằng trình quản trị web.

+0

http://assertselenium.com/2013/01/29/webdriver-wait-commands/ có một danh sách tốt đẹp của phương pháp chờ đợi càng tốt và cách chúng liên quan – Pat

+0

@Pat: các trang web assertselenium.com dường như đã biến mất. –

+0

Các phiên bản lưu trữ của trang đó: http://web.archive.org/web/*/http://assertselenium.com/2013/01/29/webdriver-wait-commands/ – Pat

Trả lời

5

Đó là vấn đề định kỳ của Selenium. Tôi không chắc về triển khai "tốt nhất" hiện có. Tôi tin rằng nó phụ thuộc phần lớn vào tình hình.

Về các thay đổi do AJAX điều khiển, tôi thường sử dụng waitForElementPresent hoặc waitForElementNotPresent tùy thuộc vào những thay đổi mà cuộc gọi AJAX sẽ thực hiện trên trang.

+2

Điều này sẽ hiệu quả, nhưng chỉ dành cho các tình huống nơi một phần tử xuất hiện/biến mất. Có nhiều tình huống mà một phần tử vẫn còn nhìn thấy được nhưng thay đổi một thuộc tính, mà tôi nghĩ rằng OP đang yêu cầu, những phương thức này không bao hàm. –

0

Bạn có thể sử dụng Thread.sleep giống như mọi người đã triển khai here.. Bạn có thể sử dụng các triển khai của chúng để liên quan đến vấn đề của bạn.

public void waitFor(Webdriver driver,,WebElement welElem, String attributeValue){ 
    int timeout=0; 
    while(true){ 
     if(driver.webElem.getAttribute(attribute)!=null){ 
     break; 
     } 
     if(timeout>=10){ 
     break; 
     } 
     Thread.sleep(100); 
     timeout++; 
    } 

} 

Tôi nghĩ bạn có thể triển khai một cái gì đó như thế này. Tôi đã không kiểm tra nó nhưng bạn có được ý tưởng.

+2

Tôi tin rằng toàn bộ vòng lặp trong khi đó là những gì "wait.Until" tôi đăng ở trên đang làm. Vì vậy, tôi không thấy điểm viết này rõ ràng trong khi vòng lặp. Tôi cho rằng việc triển khai của tôi đang hoạt động tốt hơn rất nhiều trong các bước – Adi

+1

'while (timeout <10)' và xóa câu lệnh 'if'. Chỉ cần một lưu ý cho mã của bạn. –

4

Bạn có thể sử dụng ngầm WebDriver chờ đợi:

driver.manage() timeout() implicitlyWait (10, TimeUnit.SECONDS);..

Chờ đợi tiềm ẩn là yêu cầu WebDriver thăm dò ý kiến ​​DOM trong một khoảng thời gian nhất định khi tìm một yếu tố hoặc thành phần nếu chúng không có sẵn ngay lập tức.

Thêm tại đây: http://seleniumhq.org/docs/04_webdriver_advanced.html#implicit-waits

+0

Xin lỗi, tôi không nghĩ bạn hiểu câu hỏi của tôi. Các phần tử của tôi thay đổi thuộc tính về sự kiện nhấp chuột (do JS điều khiển). Tôi không thấy cách chờ đợi tiềm ẩn hữu ích ở đây. Từ sự hiểu biết của tôi, sự chờ đợi tiềm ẩn có liên quan hơn trong trường hợp các phần tử được hiển thị sau một sự kiện. – Adi

2

Tôi cảm thấy rằng việc sử dụng WebDriverWait khá hữu ích. Một thay đổi bạn có thể thực hiện trong mã của mình là sử dụng -

webelement.isDisplayed(); 

thay vì nhận thuộc tính kiểu.

4

Tôi đề xuất sử dụng org.openqa.selenium.support.ui.ExpectedConditions.attributeToBe(WebElement element, String attribute, String value).

ví dụ:

WebDriverWait wait = new WebDriverWait(driver, 5); // time out after 5 seconds 
someElement.click(); 
wait.until(ExpectedConditions.attributeToBe(someElement, "sort-attribute", "ascending")); 

(docs)

Các vấn đề liên quan