【问题标题】:Ruby: Kill Chrome ProcessRuby:杀死 Chrome 进程
【发布时间】:2012-03-03 20:46:49
【问题描述】:

我正在使用 WATIR 来控制浏览器,但是有些页面永远不会完全加载所有内容。在 60 秒超时后,WATIR 给了我错误,我可以继续编写命令,但是如果我尝试在 make 函数中使用 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

所有这些方法都给我零。 最后一个 - NoMethodError: undefined method `pid' for nil:NilClass

根据我的研究,我认为我需要获得 PID。 然后我可以关闭进程。

有什么建议吗?我用的是窗户! 到目前为止,Ruby 中似乎没有按名称杀死进程的方法。

编辑:

我发现了 Windows 命令行的工作原理:

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

但由于我使用的是 ruby​​,所以它给了我错误:

SyntaxError: (irb):1: 未知的正则表达式选项 - f (irb):1: 语法错误, 意外的 tINTEGER,期待关键字_do 或 '{' 或 '(' taskkill /im Firefox.exe /f /t >nul 2>&1

如何从 ruby​​ 执行 cmd 命令?

【问题讨论】:

  • Chrome 卡住了,因为在锁定中无法手动关闭?如果您对开发团队有任何影响,请让他们解决问题。

标签: ruby watir watir-webdriver kill-process


【解决方案1】:

我不确定系统是否可以在 Windows 上运行,但请尝试一下。

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

【讨论】:

    【解决方案2】:

    你可以这样做:

    a) 获取Chrome进程的PID:

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

    将 browser_pid 传递给系统 kill:

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

    【讨论】:

      【解决方案3】:

      原帖中的示例代码结合@daremkd 答案为我们提供了FirefoxChrome 的内部变量。把它们放在一起,这就是我将用作 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多