使无头浏览器停止加载页面

我正在使用watir-webdriver ruby​​ gem。 它启动浏览器(Chrome)并开始加载页面。 页面加载太慢,watir-webdriver引发超时错误。 如何让浏览器停止加载页面?

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/ 

看起来浏览器在完成加载页面之前不响应任何其他命令。 如何强制浏览器丢弃正在加载的页面并执行下一个命令?

更新

我找到了一个有趣的function标志loadAsync http://src.chromium.org/svn/trunk/src/chrome/test/webdriver/webdriver_capabilities_parser.cc也许它对解决这个问题有用吗? 我还不明白如何在启动chromedriver时让watir(webdriver)设置它。 这个标志在这里介绍http://codereview.chromium.org/7582005/

有几种不同的方法可以做你想要的,但这就是我要做的事情:

 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 

如果您有很多站点正在尝试加载以确认超时,请将它们放在一个数组中:

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

更新概念certificate。 该脚本总是进行到第2步。第二个goto甚至不需要救援,但是用于更清晰的输出。 你的剧本与此有何不同?

 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 

您可以使用AutoIT停止Google加载页面以发送Escape键。 这与您最初尝试的操作类似,但直接使用AutoIT而不是通过损坏的Watir :: Browser对象。

 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" 

注意:我试图让autoit.ControlSend("Google", "", "", "{ESC}")工作,这样它就不需要浏览器成为活动窗口。 虽然它在单独运行时起作用,但由于某种原因我无法在上面的脚本中使用它(即密钥被发送但浏览器没有按预期反应)。

我已经和这个问题争了一段时间,我知道这篇文章是从2012年开始的,但我还是没有找到解决这个问题的东西。所以我做了一个解决方案。

 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 

保存和恢复Cookie的额外代码将允许您保持登录到您正在使用的网站。 这很糟糕,但它是我能想到的唯一工作。 这又回到了2012年,所以如果有人发现任何更好的东西,请纠正我。

我也遇到了超时问题。 我对在线研究的理解是,在Selenium WebDriver遇到超时后,它会出现形状不良和行为不端(multithreading问题)。 我按照这里的建议:

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

我实现了主动查杀(而不是browser.close)并在任何exception救援后重新启动Watir::Browser