0

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

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

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

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

编辑:

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

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

但是因为我在使用红宝石,所以它给了我错误:

SyntaxError: (irb):1: unknown regexp option - f (irb):1: syntax error, unexpected tINTEGER, expecting keyword_do or '{' or '(' taskkill /im Firefox.exe /f /t >nul 2>&1

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

4

3 回答 3

2

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

system("taskkill /im Firefox.exe /f /t >nul 2>&1")
于 2012-03-03T23:18:20.097 回答
0

你可以这样做:

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")
于 2014-05-22T03:19:30.187 回答
0

原始帖子中的示例代码与@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
于 2015-12-18T06:28:57.273 回答