Ruby:杀死Chrome进程

时间:2012-03-03 20:46:49

标签: ruby watir watir-webdriver kill-process

我正在使用WATIR来控制浏览器,但是页面永远不会完全加载所有卡住的内容。 60秒后超时WATIR给我错误,我可以继续编写命令,但是如果我尝试用WATIR关闭浏览器,那么所有功能都会卡住。

如果我手动关闭浏览器,一切似乎都保持正常,所以我正在寻找选项来查找chrome进程ID,PID并使用ruby终止进程。

以下是我找到的代码示例:

IRB

require "watir-webdriver"

proxy = "78.159.102.86:49295"
browser = Watir::Browser.new :chrome, :switches => ['--proxy-server=' + proxy]

bridge = browser.instance_variable_get(:@bridge)
launcher = bridge.instance_variable_get(:@launcher)
binary = launcher.instance_variable_get(:@binary)
process = binary.instance_variable_get(:@process)
process.pid

所有这些方法都给了我NIL。 最后一个 - NoMethodError:nil的未定义方法`pid':NilClass

从我的研究中我认为我需要获得PID。 然后我可以关闭过程。

任何提示?我正在使用Windows! 到目前为止,似乎没有在Ruby中按名称杀死进程的方法。

编辑:

我发现Windows命令行有效:

taskkill /im Firefox.exe /f /t >nul 2>&1

但是因为我在红宝石上它给了我错误:

  

SyntaxError:(irb):1:未知的regexp选项 - f(irb):1:语法错误,   意外的tINTEGER,期待keyword_do或'{'或'('taskkill / im   Firefox.exe / f / t> nul 2>& 1

如何从ruby执行cmd命令?

3 个答案:

答案 0 :(得分:2)

我不确定系统是否适用于Windows,但试一试。

system("taskkill /im Firefox.exe /f /t >nul 2>&1")

答案 1 :(得分:0)

你可以这样做:

a)获取Chrome进程的PID:

browser_pid = @browser.driver.instance_variable_get(:@bridge).instance_variable_get(:@service).instance_variable_get(:@process).pid

将browser_pid传递给system kill:

system("taskkill pid #{browser_pid} /f /t >nul 2>&1")

答案 2 :(得分:0)

原始帖子中的示例代码与@daremkd answer结合使用,为我们提供了 Firefox Chrome 的内部变量。把它们放在一起,这就是我将用作watir-webdriver Watir :: Browser#pid:

require 'watir-webdriver'

module Watir
  class Browser
    def pid
      if driver.browser == :firefox
        [:@bridge, :@launcher, :@binary, :@process, :@pid]
      elsif driver.browser == :chrome
        [:@bridge, :@service, :@process, :@pid]
      else
        raise NotImplementedError.new "PID lookup undefined for Watir::Browser :#{driver.browser}"
      end.
        inject(browser.driver) { |pv, sym| pv.instance_variable_get sym }
    end
  end
end


这是用于关闭两个浏览器的上下文中使用的猴子补丁:

browser = Watir::Browser.new :firefox
pid = browser.pid
`taskkill /pid #{pid}` # browser.close

browser = Watir::Browser.new :chrome
pid = browser.pid
`taskkill /pid #{pid} /f /t`  # note the `/t` to kill the spawned tree