【发布时间】:2012-01-27 18:16:04
【问题描述】:
因此,假设经常运行一个打开浏览器并执行 Web 操作的脚本:
require 'watir-webdriver'
$browser = Watir::Browser.new(:firefox, :profile => "botmode")
=> #<Watir::Browser:0x7fc97b06f558 url="about:blank" title="about:blank">
它可能会以 browser.close 优雅地结束,或者它可能会更快崩溃并留下需要大量内存的 Firefox 进程,直到它们累积并减慢服务器爬行速度时才会被注意到。
我的问题有两个:
- 有什么好的做法可以确保即使在任何地方的脚本失败导致立即错误退出的情况下,子进程也将始终得到清理(我已经有很多简短的 begin-rescue-end 块用于其他不相关的小测试)
- 更重要的是,我能否以某种方式简单地记住这个 Watir::Browser:0x7fc97b06f558 对象地址或 PID,并将其重新分配给全新 Ruby 进程中的另一个 $browser 变量,例如 irb? IE。可以稍后在同一台机器上使用 watir-webdriver 在另一个程序中重新附加 webdriver 上的孤立浏览器吗?然后我可以从 irb 进入并重新连接到崩溃的 Ruby 脚本留下的浏览器,检查它所在的网站,检查出了什么问题,哪些元素与预期不同,等等。
后者的另一个非常有利的用途是避免每天可能数百次浏览器启动和关闭的开销......最好让一个作为守护进程保持活力。第一次运行将尝试使用我特别准备的 botmode 配置文件重用以前的浏览器对象,否则创建一个。然后我会故意不在脚本末尾调用 $browser.close 。如果没有别的,我会运行一个 at 工作来杀死 Xvfb :99 显示 FF 无论如何都会在一天结束时运行(如果仍然在运行,让 FF 别无选择,只能和它一起死)。是的,我知道 Selenium 独立 jar,但也试图避免该 java 服务足迹。
如果这是一个基本的 Ruby 问题,我们深表歉意。我只是不知道如何表达它并不断获得不相关的搜索结果。
【问题讨论】:
-
代码与 FF 等实际浏览器交互是否很重要?如果速度是问题,那么也许考虑使用无头选项而不是 FF?或者像 Chrome 或 Opera 这样启动速度更快的浏览器?如果我们对您想要完成的工作有更多了解,我们或许能够提供更好的建议和/或解决方案
-
赞成速度和特别是。限制内存消耗,是的,我曾希望完全避免使用浏览器,但过去尝试启用 Htmlunit +Javascript 会导致灾难性故障或太多的编码差异......这是你的想法吗?如果不是强制 AJAX 支持,我会坚持使用 Mechanize 而不是 Watir,就像我为 TDAmeritrade.com 所做的那样,速度更快更轻
-
是的,我正在考虑这篇博客帖子watirmelon.com/2010/12/14/… 中描述的 HtmlUnit 路由但是如果你有 Ajax 或其他需要真正浏览器的问题,那么是的,你会想要使用 FF 或 Chrome等等。为此,我认为我在下面提供的答案可能适用
标签: ruby serialization object watir watir-webdriver