出于非商业目的,我正在尝试构建一个刮板。我以前使用过 PhantomJS,它通常就像一个魅力。但是,我偶然发现了以下问题:
我想做的事:
- 访问http://de.soccerway.com/national/germany/bundesliga/2010-2011/regular-season/r11840/
- 单击“每个 Spieltag”按钮
- 然后从包含比赛日的下拉菜单中选择一个选项
- 等待 Ajax 调用完成,然后获取我需要的信息
不幸的是,我可以选择我想要选择的选项,但之后没有任何反应。我创建了一个迷你脚本来演示这种行为:
require 'capybara/poltergeist'
require 'capybara/dsl'
include Capybara::DSL
Capybara.register_driver :poltergeist do |app|
Capybara::Poltergeist::Driver.new(app, :js_errors => false)
end
Capybara.default_driver = :poltergeist
Capybara.javascript_driver = :poltergeist
Capybara.default_wait_time = 20
Capybara.ignore_hidden_elements = true
Capybara.current_session.driver.resize(1200, 1000)
visit('http://de.soccerway.com/national/germany/bundesliga/2010-2011/regular-season/r11840/')
# click on button 'per Spieltag'
find(:xpath, ".//a[text() = 'per Spieltag']").click
# drop down menu with matchdays
matchday_selector = find(:xpath, ".//select[@name='page']")
# save screenshot 'before'
save_screenshot('before.png', full: true)
# for demonstration purposes, select option with value '5'
matchday_selector.find(:xpath, ".//option[@value='5']").select_option
# wait some time for ajax call to be complete and save screenshot 'after'
sleep 5
save_screenshot('after.png', full: true)
如果对比之前和之后的截图,你会看到下拉菜单的数量发生了变化,但表格的内容没有变化。此外,下拉菜单没有显示在正确的位置,而是显示在屏幕截图的左上角。
如果我使用 Selenium 作为我的默认驱动程序,那么它可以工作,但我宁愿使用 PhantomJS,因为根据我的经验,它要快得多。
如何让 PhantomJS 触发 Ajax 调用?
我使用 PhantomJS 1.9.1、Capybara 2.1.0 和 Poltergeist 1.3.0