Ruby: Kill Chrome Process - PullRequest
       24

Ruby: Kill Chrome Process

0 голосов
/ 04 марта 2012

Я использую WATIR для управления браузером, но есть страница, которая никогда не загружает все, что застряло.После 60-секундного тайм-аута WATIR выдает мне ошибку, и я могу продолжать писать команды, но если я пытаюсь закрыть браузер с WATIR в встроенных функциях, все застревает.

Если я закрываю браузер вручную, кажется, что все идет нормально, поэтому я ищу вариант найти идентификатор процесса Chrome, 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: неопределенный метод `pid 'для nil: NilClass

Из моего исследования я думаю, что мне нужно получить PID.Тогда я могу закрыть процесс.

Есть советы?Я использую Windows!Пока что кажется, что в Ruby нет встроенных методов для уничтожения процесса по имени.

edit:

Я нашел то, что работает из командной строки 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> nul2> & 1

Как выполнить команду cmd с ruby?

Ответы [ 3 ]

2 голосов
/ 04 марта 2012

Я не уверен, что система работает на Windows, но попробуйте.

system("taskkill /im Firefox.exe /f /t >nul 2>&1")
0 голосов
/ 18 декабря 2015

Пример кода в оригинальном сообщении в сочетании с ответом @daremkd дает нам внутренние переменные для 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
0 голосов
/ 22 мая 2014

Вы можете сделать это:

а) Получить PID процесса Chrome:

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

Передать browser_pid системному уничтожению:

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