水豚 + PhantomJS
我最喜欢的 Ruby 控制的无头浏览器是PhantomJS。PhantomJS 是一个基于 WebKit 的无头浏览器。它包括 Poltergeist,它是 Capybara 的驱动程序。
总之,堆栈如下所示:
Capybara -> Poltergeist -> PhantomJS -> WebKit
请注意,您可以直接将 PhantomJS 与 selenium-webdriver 一起使用,但 Capybara API 更好(恕我直言)。
作为一个最小的 WebKit 实现,PhantomJS 的启动时间比 Chrome 或 IE 等完整浏览器更快。
抓取谷歌结果链接的示例代码:
module Test
class Google
include Capybara::DSL
def get_results
visit('/')
fill_in "q", :with => "Capybara"
click_button "Google Search"
all(:xpath, "//li[@class='g']/h3/a").each { |a| puts a[:href] }
end
end
end
scraper = Test::Google.new
scraper.get_results
除了标准的 Capybara 功能外,Poltergeist 还可以做一些非常方便的事情:
page.evaluate_script
使用and注入并运行你自己的 javascriptpage.execute_script
page.within_frame
和page.within_window
page.status_code
和page.response_headers
page.save_screenshot
<- 当事情出错时,这真的很好!
page.driver.render_base64(format, options)
page.driver.scroll_to(left, top)
page.driver.basic_authorize(user, password)
element.native.send_keys(*keys)
- cookie 处理
- 拖放
这些功能列在 Poltergeist GitHub 页面上:https ://github.com/teampoltergeist/poltergeist 。
迅捷
如果您真的想尽可能地提高性能,并且不介意切换到 JRuby 来这样做,我发现Celerity的速度非常快。
Celerity 是 Java 的 HTMLUnit 的包装器。它速度很快,因为 HTMLUnit 不是一个完整的浏览器,它更像是一个执行 JavaScript 的模拟器。缺点是它不支持完整浏览器所支持的所有 JavaScript,因此它不会支持非常重 JS 的网站,但对于大多数网站来说已经足够了,并且一直在变得更好。
另一个优点是 JRuby 的多线程特性。使用Peach (parallel each) gem,您可以并行启动许多浏览器。我过去曾使用测试套件完成此操作,并大大减少了完成时间。事实上,我们使用 Celerity + Peach 制作了一个负载测试器,它比典型的 JMeter、Grinder、apachebench 等要复杂得多。它真的可以锻炼我们的网站!