我正在使用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命令?
答案 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