Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使无头浏览器停止加载页面_Ruby_Webdriver_Watir_Watir Webdriver_Selenium Chromedriver - Fatal编程技术网

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

Ruby 使无头浏览器停止加载页面,ruby,webdriver,watir,watir-webdriver,selenium-chromedriver,Ruby,Webdriver,Watir,Watir Webdriver,Selenium Chromedriver,我正在使用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 =

我正在使用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,它可能对解决这个问题有用吗?我还不知道如何让watir(webdriver)在启动chromedriver时设置这个。这个标志是在这里介绍的

有两种不同的方法可以做你想做的事情,但我会做以下几点:

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

您可以使用AutoIT发送转义键来停止Google加载页面。这与您最初尝试的操作类似,但直接使用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年的事,所以如果有人发现任何更好的方法,请纠正我

我也有超时的问题。我从在线研究中了解到,SeleniumWebDriver遇到超时后,状态会变差并出现错误(多线程问题)。我遵循了以下建议:


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

问题是任何“next_命令”(如@browser.goto”或@browser.close)都会引发另一个超时错误。第一次引发超时后,浏览器似乎被“冻结”。@Molfar我已经尝试过多次,无法重现您的错误。我已经添加了一个代码示例来向您展示我正在尝试的内容,它按照预期工作。我想知道为什么脚本到达第二个救援区。与您的代码不同的是,只有第一个站点应该达到超时。我不确定本地服务器上的sleep(999)语句是否会改变任何内容,但我无法准确复制该部分。您是否尝试过在两个已知的外部网站上运行它,并将超时设置为“1”?另外,您使用的是什么版本的watir webdriver和selenium webdriver?ruby 1.9.3p125(2012-02-16)[i386-mingw32]watir webdriver(0.5.3)selenium webdriver(2.20.0)我已经运行了您的代码,但它没有显示实际问题。下面是一个现实世界的例子。预期结果与实际结果不同。ruby 1.9.3p125(2012-02-16修订版34643)[x86_64-darwin11.3.0]selenium webdriver(2.20.0)watir webdriver(0.5.4)在我的脑海中,对这件事只有一种解释。Watir是单线程的。我不想在多线程中使用它。我只是想知道为什么在一个命令和它的超时之后不可能执行下一个命令。当我说单线程时,我的意思是当发送一个comand到webdriver去做某件事情时,你需要一个同步调用,并且在得到webdriver的响应之前不能做任何事情。因此,在将同步调用更改为异步调用之前,无法完成此场景中要执行的操作。看起来有几个人也遇到过此问题-请参阅,但尚未解决。Firefox(驱动程序?)也有相同的问题,并产生相同的结果。Linux机器上的所有操作都处于无头模式(生产)。它不能解决问题,因为你的@browser.close无法工作。在我的电脑上它可以。我使用的是Linux debian 3.2.0-4-amd64#1 SMP debian 3.2.57-3+deb7u1 x86_64 GNU/Linux,Firefox 17.0.10,watir 5,watir webdriver 0.6.4ruby 1.9.3p484(2013-11-22修订版43786)[x86_64-Linux]