我正在使用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也许它可以用来解决这个问题?我还不明白如何在启动chromedriver时让watir(webdriver)设置它。这个标志是在http://codereview.chromium.org/7582005/
引入的答案 0 :(得分: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
答案 1 :(得分:2)
您可以停止Google使用AutoIT加载页面以发送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}")
工作,这样就不需要浏览器成为活动窗口。虽然它在单独运行时起作用,但由于某种原因,我无法在上面的脚本中使用它(即密钥被发送但浏览器没有按预期反应)。
答案 2 :(得分: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年,所以如果有人发现任何更好的东西,请纠正我。
答案 3 :(得分:0)
我也遇到了超时问题。我对在线研究的理解是,在Selenium WebDriver遇到超时后,它会出现形状不良和行为不端(多线程问题)。我遵循了这里的建议:
https://github.com/watir/watir-webdriver/issues/137
我实施了主动查杀(而不是browser.close),并在任何异常救援后重新启动Watir::Browser
。