所以我们经常说一个脚本运行,该脚本打开浏览器并执行网络操作:
require 'watir-webdriver'
$browser = Watir::Browser.new(:firefox, :profile => "botmode")
=> #<Watir::Browser:0x7fc97b06f558 url="about:blank" title="about:blank">
它可能以browser.close结束,或者可能更早崩溃,并留下了需要大量内存的Firefox进程,直到它们积累并减慢服务器的爬行速度时才引起注意。
我的问题是双重的:
后者的另一种非常有利的用法是避免每天可能有数百个浏览器启动和关闭的开销……最好是使它作为一个守护程序保持生命。第一次运行将尝试使用我专门准备的botmode配置文件重用以前的浏览器对象,否则创建一个。然后,我将故意不在脚本结尾处调用$ browser.close。如果没有其他事情,我无论如何都要杀死Xvfb:99显示器,无论如何,FF还是在一天结束时在里面运行(如果FF仍在运行,FF只能选择死掉)。是的,我知道Selenium独立jar,但也尝试避免Java服务占用空间。
抱歉,这是一个更基本的Ruby问题。我只是不确定如何表达它的意思,并不断获得不相关的搜索结果。
browser_live? -您可以检查firefox浏览器是否与进程列表一起运行
这很棘手,但可能对您有用
幸运的是,黄瓜也允许通过使用Hooks在一个地方进行此操作。您可以定义在特定情况下在每个场景“之前”和“之后”运行的,在步骤之前运行的挂钩,以及在任何场景之前运行一次的代码,以及定义为在“ at_exit”运行的代码,您可以在其中关闭浏览器在所有方案都运行之后。
[如果我使用的是黄瓜,我会想到env.rb
中的一些代码的想法,该代码将在创建浏览器时首先运行,并辅之以at_exit代码以关闭浏览器。然后,可能还会在before
挂钩中进行编码,该代码可以检查浏览器是否仍然存在,并在需要时重新创建浏览器,还可以在after
挂钩中注销操作。保留诸如针对个别场景登录的内容,或者,如果功能中的所有场景都使用同一类型的用户登录,则保留background
块。
require 'drb'
browser = DRbObject.new_with_uri 'druby://127.0.0.1:9395'
browser.goto 'stackoverflow.com'
$ PPID可用,用于您必须高于
$$的情况。
因此真正清除了不必要的重量级过程,例如红宝石崩溃后:#!/bin/bash
# This is the script that wraps on top of Ruby scripts
./ruby_program_using_watirwebdriver_browser.rb myparams & # spawn ruby in background but keep going below:
sleep 11 # give Ruby a chance to launch its web browser
pstree -panu $$ # prints out a process tree starting under Bash, the parent of Ruby. Firefox may not show!
wait # now wait for Ruby to exit or crash
pkill -s $PPID firefox-bin # should only kill firefox-bin's caused above, not elsewhere on the system
# Another way without pkill, will also print out what's getting killed if anything:
awk '$7=="firefox-bin" && $3=="'$PPID'" {print $1}' <(ps x -o pid,pgid,sess,ppid,tty,time,comm) | xargs -rt kill
可选而且由于我仅使用专用的Xvfb Xwindows服务器来在DISPLAY:99上进行网络驱动,所以我也可以依靠xkill:timeout 1s xwininfo -display :99 -root -all |awk '/("Navigator" "Firefox")/ {print $1}' |xargs -rt xkill -display :99 -id
# the timeout is in case xkill decides to wait for user action, when window id was missing
(有关how to serialize an object using TCPServer inside?的更多信息,
同时,即使尝试使用也内置于Ruby但以二进制格式存储的Marshal进行序列化,也会导致听起来非常合理的错误,即无法转储TCPServer对象(显然包含在我的Watir:Browser中$ browser指向)
总而言之,我对这些结果并不感到惊讶,但是仍然有信心找到一种方法,直到Watir得出更原生的东西(例如PersistentWebdriver或jssh时代的样子,那时您可以简单地附加到已运行且带有正确扩展名的浏览器)
直到那时,如果序列化+对工作对象的反序列化变得太棘手,我将求助于Ruby的一部分,以保持对象的持久性,并避免频繁且昂贵的设置/拆卸。我确实对某些已建立的(单元测试)框架有所了解,但似乎还不能很好地适应我的整体软件结构-毕竟我不是Web测试。