Hacer que el navegador sin cabeza deje de cargar la página

Estoy usando la gem Ruby de Watir-webdriver. Inicia el navegador (Chrome) y comienza a cargar una página. La página se está cargando demasiado lentamente, y watir-webdriver genera un error de tiempo de espera. ¿Cómo puedo hacer que el navegador deje de cargar la página?

require 'watir-webdriver' client = Selenium::WebDriver::Remote::Http::Default.new client.timeout = 10 @browser = Watir::Browser.new :chrome, :http_client => client sites = [ "http://google.com/", "http://yahoo.com/", "http://www.nst.com.my/", # => This is the SLOW site "http://drupal.org/", "http://www.msn.com/", "http://stackoverflow.com/" ] sites.each do |url| begin @browser.goto(url) puts "Success #{url}" rescue puts "Timeout #{url}" end end ########## Execution result ########## # Success http://google.com/ # Success http://yahoo.com/ # Timeout http://www.nst.com.my/ # Timeout http://drupal.org/ # Timeout http://www.msn.com/ # Timeout http://stackoverflow.com/ ########## Expected result ########## # Success http://google.com/ # Success http://yahoo.com/ # Timeout http://www.nst.com.my/ # Success http://drupal.org/ # Success http://www.msn.com/ # Success http://stackoverflow.com/ 

Parece que el navegador no responde a ningún otro comando antes de que termine de cargar la página. ¿Cómo puedo forzar al navegador a desechar la página que está cargando y ejecutar el siguiente comando?

ACTUALIZADO

He encontrado un indicador de capacidad interesante loadAsync http://src.chromium.org/svn/trunk/src/chrome/test/webdriver/webdriver_capabilities_parser.cc ¿ Quizás pueda ser útil para resolver este problema? Todavía no entiendo cómo hacer watir (webdriver) para configurar esto al iniciar el chromedriver. Esta bandera se introdujo aquí http://codereview.chromium.org/7582005/

Hay un par de formas diferentes de hacer lo que quieres, pero esto es lo que yo haría:

 require 'watir-webdriver' client = Selenium::WebDriver::Remote::Http::Default.new client.timeout = 60 @browser = Watir::Browser.new :firefox, :http_client => client begin @browser.goto mySite rescue => e puts "Browser timed out: #{e}" end next_command 

Si tiene muchos sitios que está intentando cargar para confirmar el tiempo de espera o no, colóquelos en una matriz:

 mySites = [ mySite1, mySite2, mySite3 ] mySites.each do |site| begin @browser.goto site rescue "Puts #{site} failed to load within the time allotted." end end 

ACTUALIZACIÓN para prueba de concepto. Esta secuencia de comandos siempre avanza al paso 2. El rescate no es ni siquiera necesario para el segundo goto, pero se usa para obtener resultados más claros. ¿En qué se diferencia tu guión de esto?

 require 'watir-webdriver' client = Selenium::WebDriver::Remote::Http::Default.new client.timeout = 1 #VERY low timeout to make most sites fail @browser = Watir::Browser.new :firefox, :http_client => client def testing begin @browser.goto "http://www.cnn.com" rescue => e puts "Browser timed out on the first example" end begin @browser.goto "http://www.foxnews.com" rescue => e puts "Browser timed out on the second example" end end 

Puede detener Google cargando la página utilizando AutoIT para enviar la tecla Escape. Esto es similar a lo que intentaste hacer originalmente, pero usar AutoIT directamente en lugar de a través del objeto Watir :: Browser roto.

 require 'watir-webdriver' require 'win32ole' client = Selenium::WebDriver::Remote::Http::Default.new client.timeout = 5 @browser = Watir::Browser.new :chrome, :http_client => client begin @browser.goto "http://www.nst.com.my/" rescue autoit = WIN32OLE.new("AutoItX3.Control") autoit.AutoItSetOption("WinTitleMatchMode", 2) autoit.WinActivate("Google") autoit.Send("{ESC}") end @browser.goto "http://www.google.ca" 

Nota: Intenté que autoit.ControlSend("Google", "", "", "{ESC}") funcione para que no sea necesario que el navegador sea la ventana activa. Si bien funcionó cuando se ejecutó solo, por alguna razón nunca pude hacerlo funcionar en el script anterior (es decir, la clave se envió pero el navegador no reaccionó como se esperaba).

He estado luchando con este problema por un tiempo, sé que esta publicación es de 2012, pero todavía no he encontrado nada que resuelva este problema … Así que hice un trabajo.

 require 'watir-webdriver' client = Selenium::WebDriver::Remote::Http::Default.new client.timeout = 5 @browser = Watir::Browser.new :firefox, :http_client => client @browser.goto "twitter.com" #after the page loads, log in def test begin temp = [] temp = @browser.cookies.to_a @browser.goto "twitter.com:81" rescue => e puts "Browser timed out" @browser.close @browser = Watir::Browser.start "twitter.com" temp.each do |me| @browser.cookies.add(me[:name], me[:value]) end @browser.refresh end end 

El código adicional que guarda y restaura sus cookies le permitirá permanecer conectado en los sitios que está usando. Esto apesta, pero es el único trabajo que puedo imaginar. Nuevamente, esto fue en 2012, así que si alguien encuentra algo que funcione mejor, corríjame.

También he tenido el problema de los tiempos de espera. Según entiendo la investigación en línea, después de que Selenium WebDriver encuentra un tiempo de espera, se pone en mal estado y se comporta mal (problema de subprocesos múltiples). He seguido los consejos que se encuentran aquí:

https://github.com/watir/watir-webdriver/issues/137

Implementé el asesinato activo (en lugar de browser.close) y reiniciando Watir::Browser después de cualquier excepción de rescate.