2012-07-07 11 views
8

Próbuję napisać prosty test. Mój problem polega na tym, że chcę poczekać, aż strona zostanie załadowana całkowicie. W tej chwili czekam, aż pojawią się jakieś elementy, ale tak naprawdę nie jest to, czego chcę. Czy jest możliwe, aby coś takiego:selen-webdriver i czekać na stronę, aby załadować

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

Z Java nie jest problemem, ale jak zrobić to z ruby?

Odpowiedz

13

ten sposób Selenium docs() sugerują:

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 

Jeśli to nie jest opcją można spróbować sugestię od this SO post choć wymagałoby to trochę Javascript na górze Ruby/Rails.

Wydaje się, że wait.until jest/zostało wycofane. Nowy sugeruje proces to szukać strony posiadają element znasz będzie tam:

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

użyłem przykład z Selenium Dokumentów ty powiązanych i ten pracował dla mnie. Wielkie dzięki. – chucknor

5

O ile mi zrozumieć webdriver, nie trzeba czekać na stronie ładunku ponieważ WebDriver ma blocking API ale można na pewno ustaw limit czasu ładowania strony.

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

To już nie jest potrzebne w WebDriver.

WebElement click() i Actions click() oba "wait for page load" w razie potrzeby automatycznie.

Możesz użyć imclicit i explicite (w tej kolejności) czekać zamiast (opisane w seleniumhq), jeśli musisz czekać na przykład na zawartość ajax.

2

Tak więc w Ruby, gdy używasz get do otwierania adresu URL, skrypt ruby ​​działa TYLKO po całkowitym załadowaniu strony.

Więc w twoim przypadku po prostu zrobić: -

driver.get url 
+1

Też tak pomyślałem, ale dokumentacja Webdrivera stwierdza: "Zależnie od kilku czynników, w tym od kombinacji OS/Browser, WebDriver może lub nie musi czekać na załadowanie strony." W pewnych okolicznościach WebDriver może zwrócić kontrolę przed zakończeniem strony, lub nawet rozpoczęło się ładowanie. Aby zapewnić niezawodność, musisz poczekać na element (y), aby istniały na stronie przy użyciu Jawnych i Niejawnych Czeków. " – Umang

+1

Z mojego doświadczenia wynika, że ​​Webdriver zdecydowanie nie zawsze czeka na załadowanie wszystkiego, szczególnie przy ładowaniu treści za pomocą AJAX. Zdecydowanie użyj czekania. – bsg

+1

Mogę potwierdzić z załadowanymi danymi ajax, że czekanie jest absolutnie wymagane. – Kylee

1

Odnotowano przypadki, w których albo AJAX CSS lub zmiany spowodowane moich testów na niepowodzenie w czasie. Dodałem te metody do mojej statycznej instancji sterownika, aby w razie potrzeby móc przetestować określone warunki. (C#)

TimedWait w metodzie WaitForCssChange jest w zasadzie tylko Threading.Thread.Sleep To nie jest najpiękniejszy sposób, jak sądzę, ale działa dobrze na moje potrzeby.

Dla Ajax wait:

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

za zmiany 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++; 
     } 
    } 
Powiązane problemy