2

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

require 'watir-webdriver'

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

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

4

2 回答 2

1

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

我已经探索了将这个对象导出为 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.

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

awk '/pid:/ {print $2;}' browserObj.yaml |xargs -rt kill
于 2012-04-28T21:17:46.350 回答
0

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

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

于 2012-04-28T00:52:48.007 回答