2012-07-07 45 views
8

Tôi đang cố viết một bài kiểm tra đơn giản. Vấn đề của tôi là, tôi muốn đợi cho đến khi trang được tải hoàn toàn. Tại thời điểm này tôi đang chờ đợi cho đến khi một số yếu tố được presen, nhưng đó không phải là thực sự những gì tôi muốn. Là nó có thể làm cho một cái gì đó như thế này:selenium-webdriver và đợi trang tải

driver = Selenium::WebDriver.for :chrome 
driver.navigate.to url 
driver.wait_for_page_to_load "30000" 

Với Java không phải là vấn đề, nhưng làm thế nào để làm cho nó với ruby?

Trả lời

13

Đây là cách Selenium docs() đề nghị:

require 'rubygems' 
require 'selenium-webdriver' 

driver = Selenium::WebDriver.for :firefox 
driver.get "http://google.com" 

element = driver.find_element :name => "q" 
element.send_keys "Cheese!" 
element.submit 

puts "Page title is #{driver.title}" 

wait = Selenium::WebDriver::Wait.new(:timeout => 10) 
wait.until { driver.title.downcase.start_with? "cheese!" } 

puts "Page title is #{driver.title}" 
driver.quit 

Nếu đó không phải là một lựa chọn bạn có thể thử những gợi ý từ this SO post mặc dù nó sẽ đòi hỏi một số Javascript trên đầu trang của Ruby/Rails.

Có vẻ như wait.until đang được/đã bị loại bỏ. Quá trình đề nghị mới nó để tìm kiếm trang để có một yếu tố bạn biết sẽ có mặt ở đó:

expect(page).to have_selector '#main_div_id' 
+0

tôi đã sử dụng các ví dụ từ tài liệu Selenium bạn liên kết với và điều này đã làm việc cho tôi. Cảm ơn rất nhiều. – chucknor

5

Theo như tôi hiểu webdriver, bạn không cần phải chờ tải trang vì WebDriver có blocking API nhưng bạn có thể chắc chắn đặt thời gian chờ tải trang.

driver.manage.timeouts.page_load = 10 # seconds 
2

Điều đó không cần thiết với WebDriver nữa.

WebElement nhấp() và nhấp vào Tác vụ() cả "chờ tải trang" nếu cần tự động.

Bạn có thể sử dụng imclicit và rõ ràng (theo thứ tự này) chờ đợi thay thế (được mô tả tại seleniumhq) nếu bạn cần phải đợi một số nội dung ajax chẳng hạn.

2

Vì vậy, trong Ruby, bất cứ khi nào bạn sử dụng get để mở URL, tập lệnh ruby ​​chỉ CHỈ khi trang tải hoàn toàn.

Vì vậy, trong trường hợp của bạn, bạn sẽ chỉ cần làm: -

driver.get url 
+1

Tôi cũng nghĩ như vậy, nhưng trạng thái tài liệu Webdriver - "Phụ thuộc vào nhiều yếu tố, bao gồm cả sự kết hợp OS/Trình duyệt, WebDriver có thể hoặc không thể đợi trang tải. Trong một số trường hợp, WebDriver có thể trả lại quyền kiểm soát trước khi trang kết thúc, hoặc thậm chí bắt đầu, tải. Để đảm bảo tính chắc chắn, bạn cần phải đợi (các) phần tử tồn tại trong trang bằng cách sử dụng Phe rõ ràng và tiềm ẩn. " – Umang

+1

Từ kinh nghiệm của tôi, Webdriver chắc chắn không phải lúc nào cũng chờ mọi thứ để tải, đặc biệt là khi tải nội dung bằng AJAX. Chắc chắn sử dụng một chờ đợi. – bsg

+1

Tôi có thể xác nhận với dữ liệu được tải ajax mà chờ đợi là hoàn toàn bắt buộc. – Kylee

1

Đã có trường hợp một trong hai AJAX hoặc thay đổi CSS gây ra các bài kiểm tra của tôi thất bại ở lần. Tôi đã thêm các phương thức này vào thể hiện trình điều khiển tĩnh của mình để tôi có thể chờ kiểm tra các điều kiện nhất định nếu cần. (C#)

TimedWait trong WaitForCssChange Method về cơ bản chỉ là một Threading.Thread.Sleep Đây không phải là cách đẹp nhất tôi đoán, nhưng nó hoạt động tốt cho nhu cầu của tôi.

Đối với Ajax chờ đợi:

public static void WaitForAjax() 
    { 
     var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(25)); 
     wait.Until(d => (bool)(d as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0")); 
    } 

Đối với thay đổi CSS:

public static void WaitForCssChange(IWebElement element, string value) 
    { 
     int counter = 0; 
     while (true) 
     { 
      if(element.GetAttribute("style").Contains(value) || counter > 50) 
      { 
       break; 
      } 
      TimedWait(20); 
      counter++; 
     } 
    } 
Các vấn đề liên quan