可以在以后的Ruby进程中重用watir浏览器对象吗?

问题描述 投票:3回答:5

所以我们经常说一个脚本运行,该脚本打开浏览器并执行网络操作:

require 'watir-webdriver'

$browser = Watir::Browser.new(:firefox, :profile => "botmode")
 => #<Watir::Browser:0x7fc97b06f558 url="about:blank" title="about:blank"> 

它可能以browser.close结束,或者可能更早崩溃,并留下了需要大量内存的Firefox进程,直到它们积累并减慢服务器的爬行速度时才引起注意。

我的问题是双重的:

  • 一种好的做法是,即使在脚本失败的任何情况下导致立即退出错误的情况下,也总是会清理子进程(我已经准备了很多简短的Begin-Resue-End块用于其他无关的小测试)
  • [更重要的是,我可以简单地记住这个Watir :: Browser:0x7fc97b06f558对象地址或PID,然后在一个全新的Ruby进程中将它重新分配给另一个$ browser变量,例如irb吗?即稍后可以在同一台计算机上使用watir-webdriver将webdriver上的孤立浏览器重新附加到另一个程序中吗?然后我可以从irb进入并重新连接到崩溃的Ruby脚本留下的浏览器,检查它所在的网站,检查出了什么问题,哪些元素与预期不同,等等。

后者的另一种非常有利的用法是避免每天可能有数百个浏览器启动和关闭的开销……最好是使它作为一个守护程序保持生命。第一次运行将尝试使用我专门准备的botmode配置文件重用以前的浏览器对象,否则创建一个。然后,我将故意不在脚本结尾处调用$ browser.close。如果没有其他事情,我无论如何都要杀死Xvfb:99显示器,无论如何,FF还是在一天结束时在里面运行(如果FF仍​​在运行,FF只能选择死掉)。是的,我知道Selenium独立jar,但也尝试避免Java服务占用空间。

抱歉,这是一个更基本的Ruby问题。我只是不确定如何表达它的意思,并不断获得不相关的搜索结果。

ruby serialization object watir watir-webdriver
5个回答
2
投票
不退出? -对于ctrl + C,可以超过TRAP

browser_live? -您可以检查firefox浏览器是否与进程列表一起运行

这很棘手,但可能对您有用

1
投票
例如,Cucumber在功能级别具有此功能,其基本思想是“背景”,它是通过在功能文件中定义在每个方案之前运行的通用步骤来干燥方案的一种方法。 (例如,导航到并登录到您的站点)这可能包括对一系列步骤的调用,这些步骤将看起来是否存在浏览器对象,如果不存在则创建一个。但是,您需要将其放入每个变得非常干燥的功能文件中。

幸运的是,黄瓜也允许通过使用Hooks在一个地方进行此操作。您可以定义在特定情况下在每个场景“之前”和“之后”运行的,在步骤之前运行的挂钩,以及在任何场景之前运行一次的代码,以及定义为在“ at_exit”运行的代码,您可以在其中关闭浏览器在所有方案都运行之后。

[如果我使用的是黄瓜,我会想到env.rb中的一些代码的想法,该代码将在创建浏览器时首先运行,并辅之以at_exit代码以关闭浏览器。然后,可能还会在before挂钩中进行编码,该代码可以检查浏览器是否仍然存在,并在需要时重新创建浏览器,还可以在after挂钩中注销操作。保留诸如针对个别场景登录的内容,或者,如果功能中的所有场景都使用同一类型的用户登录,则保留background块。


1
投票
然后从测试脚本使用此浏览器:

require 'drb' browser = DRbObject.new_with_uri 'druby://127.0.0.1:9395' browser.goto 'stackoverflow.com'


0
投票
parent在我的情况下,bash shell调用rubyprogram.rb。在Bash中作为

$ 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


0
投票
从YAML反序列化仍然很麻烦。虽然我没有进行首次尝试后的测试,但它给了我一些reg exp parse错误的信息……不确定那是什么。

(有关how to serialize an object using TCPServer inside?的更多信息,

同时,即使尝试使用也内置于Ruby但以二进制格式存储的Marshal进行序列化,也会导致听起来非常合理的错误,即无法转储TCPServer对象(显然包含在我的Watir:Browser中$ browser指向)

总而言之,我对这些结果并不感到惊讶,但是仍然有信心找到一种方法,直到Watir得出更原生的东西(例如PersistentWebdriver或jssh时代的样子,那时您可以简单地附加到已运行且带有正确扩展名的浏览器)

直到那时,如果序列化+对工作对象的反序列化变得太棘手,我将求助于Ruby的一部分,以保持对象的持久性,并避免频繁且昂贵的设置/拆卸。我确实对某些已建立的(单元测试)框架有所了解,但似乎还不能很好地适应我的整体软件结构-毕竟我不是Web测试。

© www.soinside.com 2019 - 2024. All rights reserved.