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

このすべてのメソッドは私にNILを与えます。最後のもの-NoMethodError:nil:NilClassの未定義のメソッド `pid'

私の研究から、私はPIDを取得する必要があると思います。その後、プロセスを閉じることができます。

任意のヒント?私は窓を使っています!これまでのところ、Rubyで名前でプロセスを強制終了するためのメソッドは作成されていないようです。

編集:

私はWindowsのコマンドラインから何が機能するかを見つけました:

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

しかし、私はルビーを使用しているので、エラーが発生します。

SyntaxError:(irb):1:不明な正規表現オプション-f(irb):1:構文エラー、予期しないtINTEGER、keyword_doまたは'{'または'(' taskkill / im Firefox.exe / f / t> nul 2>&1が必要です

ルビーから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をsystemkillに渡します。

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 に答える