2013-03-01 43 views
10

My hai kịch bản -Kết hợp chờ đợi ngầm và chờ đợi rõ ràng cùng kết quả trong thời gian chờ đợi bất ngờ

1) Trước tiên

@driver.manage.timeouts.implicit_wait = 30 
@wait = Selenium::WebDriver::Wait.new(:timeout => 45) # Time greater than implicit 
@wait.until {@driver.find_element(:tag_name => "body").text.include?("hey")} 

Mà cho tài xế 45 giây để tìm kiếm văn bản (dự kiến)

2) thứ hai

@driver.manage.timeouts.implicit_wait = 30 
@wait = Selenium::WebDriver::Wait.new(:timeout => 5) # Time less than implicit 
@wait.until {@driver.find_element(:tag_name => "body").text.include?("hey")} 

này bây giờ mang đến cho người lái xe 30 giây để tìm kiếm văn bản (không được mong đợi)

Có cách nào để làm cho selen chỉ đợi cho thời gian chờ explicit và không dành cho số lớn hơn trong hai không?

Lưu ý - Không khai báo thời gian chờ ngầm định không phải là một tùy chọn, vì tôi không thể để selen bị treo mỗi khi người lái xe không thể tìm thấy thứ gì đó.

Sử dụng phiên bản Selenium 30, cửa sổ, ff

+0

'Cài đặt mặc định là 0' theo tài liệu chờ ngầm, vì vậy vấn đề chính xác ở đây là gì? – phoet

+0

Tại sao không chỉ đặt chờ đợi ngầm đến 5? – BlackHatSamurai

+0

Việc chờ đợi ngầm giúp tôi giữ một sự chờ đợi mặc định trên mỗi phần tử, vì vậy không muốn giữ nó ở mức thấp trong 5 giây. Tôi muốn sử dụng thời gian chờ đợi ngắn hơn (nói "wait_to_fail") để kiểm tra các yếu tố * không * hiện diện. – Amey

Trả lời

39

Đừng trộn lẫn ngầm và rõ ràng. Một phần của vấn đề là chờ đợi ngầm thường xuyên (nhưng có thể không phải lúc nào cũng được!) Được triển khai ở phía "từ xa" của hệ thống WebDriver. Điều đó có nghĩa là chúng được "nướng" vào IEDriverServer.exe, chromedriver.exe, phần mở rộng WebDriver Firefox được cài đặt vào hồ sơ Firefox ẩn danh và máy chủ WebDriver Java từ xa (selenium-server-standalone.jar). Sự chờ đợi rõ ràng được thực hiện độc quyền trong các ràng buộc ngôn ngữ "cục bộ". Mọi thứ trở nên phức tạp hơn nhiều khi sử dụng RemoteWebDriver, bởi vì bạn có thể sử dụng cả hai mặt cục bộ và từ xa của hệ thống nhiều lần.

Đây là cách làm việc: mã cục bộ -> Máy chủ từ xa Java -> liên kết ngôn ngữ Java cục bộ trên máy chủ từ xa -> thành phần "từ xa" như tiện ích mở rộng của Firefox, chromedriver.exe hoặc IEDriverServer.exe. Nó thậm chí còn phức tạp hơn trong trường hợp lưới, vì có thể có các bước nhảy khác ở giữa.

Do đó, khi bạn cố gắng kết hợp các lần chờ ngầm và rõ ràng, bạn đã đi lạc vào "hành vi không xác định". Bạn có thể tìm ra các quy tắc của hành vi đó là gì, nhưng chúng sẽ có thể thay đổi khi các chi tiết thực hiện của các trình điều khiển thay đổi. Vì vậy, không làm điều đó.

Bạn không nên gặp phải "treo" khi không thể tìm thấy phần tử nếu bạn không sử dụng các lần chờ ngầm. Người lái xe nên ném một ngoại lệ NoSuchElement ngay lập tức.

+0

Cảm ơn bạn đã phản hồi. Vì vậy, vấn đề thực sự là với thực tế là kịch bản của tôi bị treo so với thất bại ngay lập tức. Đây có phải là vấn đề rubyium webdriver ruby ​​không? – Amey

+0

Bạn có nghĩa là để nói rằng khi chờ đợi ngầm không được thiết lập (hoặc thiết lập để không), mã WebDriver của bạn treo vô thời hạn? Đã xảy ra sự cố với chính xác các triệu chứng đó khi sử dụng Firefox, nhưng nó đã được sửa trong 2.30.0. Nếu bạn đang thiết lập ngầm chờ đợi cho bất cứ điều gì khác hơn là số không, sau đó có, tất nhiên WebDriver sẽ "treo" cho đến khi thời gian chờ nếu phần tử không tồn tại. Điều gì sẽ xảy ra khi bạn sử dụng các trình duyệt khác? Điều gì về việc cập nhật lên 2,31? – JimEvans

+0

Tôi đã đăng một [câu hỏi liên quan] (http://stackoverflow.com/questions/20268396/mixing-implicit-and-explicit-waits) (Tôi đang bối rối về điều này) – KnewB

-3

Cách tốt nhất là đặt ngầm địnhWait() ở đầu mỗi thử nghiệm và sử dụng WebDriverWait() để chờ phần tử hoặc phần tử AJAX tải.

Tuy nhiên, ngầm địnhWait() và WebDriverWait() không hoạt động tốt cùng nhau trong cùng một thử nghiệm. Bạn sẽ phải vô hiệu hóa hàm implicitlyWait() trước khi gọi WebDriverWait vì hàm implicitlyWait() cũng đặt thời gian chờ là "driver.findElement()".

Bất cứ khi nào bạn đang sử dụng WebDriverWait() với implicitlyWait() đã thiết lập một số giá trị ban đầu, hãy làm theo các bước -

  1. nullifying implicitlyWait()
  2. thực hiện WebDriverWait(), và trở về yếu tố
  3. reset implicitlyWait() một lần nữa

Ví dụ Java mã -

driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); //nullify implicitlyWait() 

WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds); 
element = wait.until(ExpectedConditions.visibilityOfElementLocated(by)); 

driver.manage().timeouts().implicitlyWait(DEFAULT_WAIT_4_PAGE, TimeUnit.SECONDS); 
+0

Bạn nên thêm mã nguồn, vì mã được sao chép chứ không phải mã của bạn. – SysDragon

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