更改Watir Webdriver在ruby中创建的浏览器的进程优先级

时间:2012-04-27 21:07:08

标签: ruby windows browser watir-webdriver

我在windows计算机上的ruby mine中有这个:

require 'watir-webdriver'

Before do
  @browser = Watir::Browser.new :ie
end

我需要更改@browser以更高的优先级运行,因为我得到的一些超时问题是在其他程序同时运行时引起的。我知道如何增加超时所允许的时间,但经过一些测试后我发现我必须将时间设置得比我认为可以接受的时间更长。

2 个答案:

答案 0 :(得分:1)

我发现你实际上可以从@browser对象的深处找到webdriven浏览器的PID(读取所有受保护和私有组件),然后使用负数renice来增加优先级,可能需要非root用户允许sudo

我已经将exporting this object探索到ASCII表格进行存储,这实际上有效,但将其导回则是另一个问题的主题。试试这个(每次我的代码启动一个新的Watir::Browser时,我只是为了好玩):

require "yaml" 
File.open("browserObj.yaml", 'w').write YAML::dump($browser)

然后当您查看此文件 browserObj.yaml 时,它会为您提供各种有趣的信息,例如:

    server_url: !ruby/object:URI::HTTP 
      fragment: 
      host: 127.0.0.1
      opaque: 
      parser: 
      password: 
      path: /hub/
      port: 7055
      query: 
      registry: 
      scheme: http
      user: 
    timeout: 
  launcher: !ruby/object:Selenium::WebDriver::Firefox::Launcher 
    binary: !ruby/object:Selenium::WebDriver::Firefox::Binary 
      process: !ruby/object:ChildProcess::Unix::ForkExecProcess 
        args: 
        - ./firefox.sh
        - -no-remote
        - -foreground
        detach: false
        duplex: false
        environment: {}

        exit_code: 
        io: 
        pid: 6114
        started: true

注意最后一行的PID,你的代码可以很容易地检测出来,并在此时做任何事情。

这比简单地用例如解析分层过程树更安全。 pstree -panu $PPID找到子浏览器进程。

在我自己的东西中,我实际上不打扰(例如,当我需要杀死正确的Firefox进程而不是其他人)因为我去了DISPLAY。所有我的桌面/交互式用户事件都发生在DISPLAY:0上,而我的Watir Webdriver事件发生在由Xvfb或Xephyr托管的DISPLAY:99上,我可以借助工具更有选择性kill / xkill例如xpropxwininfo

修改 为了完整性,这是我用来向watir-webdriver浏览器的pid发送kill命令的Unix / Cygwin命令,如果我需要:

awk '/pid:/ {print $2;}' browserObj.yaml |xargs -rt kill

答案 1 :(得分:0)

浏览文档和代码我没有看到任何现成的方法来查找驱动程序使用的IE的进程ID。您可以尝试使用系统工具来发现正在侦听Webdriver端口的进程(默认为5555)并确定该进程。在posix上,您可以尝试lsofnetstat使用特定端口查找进程,我不知道如何在Windows上帮助您。

当然,如果这是一个资源竞争问题,你为什么不给你的watir测试一个更好的控制环境,没有其他东西阻止它以你想要的速度运行。