8

我正在使用 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/

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

更新

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

4

4 回答 4

4

有几种不同的方法可以做你想做的事,但我会这样做:

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

更新概念证明。该脚本总是继续执行第 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
于 2012-03-26T17:27:00.863 回答
2

您可以使用 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-03-27T15:55:06.890 回答
0

我一直在与这个问题作斗争,我知道这篇文章是从 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 年,所以如果有人发现任何更好的方法,请纠正我。

于 2014-07-14T17:08:25.077 回答
0

我也遇到过超时问题。我从在线研究的理解是,Selenium WebDriver 遇到超时后,它会变得糟糕并且行为不端(多线程问题)。我遵循了这里的建议:

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

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

于 2015-02-04T16:26:04.663 回答