我在Rspec / Capybara中使用Selenium(没有事务夹具)设置了大量测试来测试Ajax功能。一般来说,我发现Selenium不可靠而且不像here那样具有确定性,尽管我仍然不完全知道原因。
但是,现在我刚刚开始为日历页面编写一组新的测试,该日历页面也使用Ajax。到目前为止我只写了两个测试:
describe "view calendar page" do
before { visit show_calendar_path }
it { should have_content today.strftime('%B %Y') }
it { should have_selector "td##{today.to_date}" }
end
其中:
let(:today) { Date.today }
这两个测试完全独立于任何Ajax功能(这两个测试都是针对页面加载时的内容)。第二个测试只是测试今天日期的日历单元格是否存在。当我不使用:js => true
因此不使用Selenium时,此测试通过。但是,只要插入:js => true
,测试就会失败,并显示以下错误:
1) view calendar and create events should have selector "td#2014-07-07"
Failure/Error: it { should have_selector "td##{today.to_date}" }
Selenium::WebDriver::Error::InvalidSelectorError:
The given selector td#2014-07-07 is either invalid or does not result in a WebElement. The following error occurred:
InvalidSelectorError: An invalid or illegal selector was specified
# [remote server] file:///var/folders/60/bynswzcx6p3bx0bdr61xbtf00000gn/T/webdriver-profile20140707-57439-11dc64c/extensions/fxdriver@googlecode.com/components/driver_component.js:9444:in `FirefoxDriver.annotateInvalidSelectorError_'
# [remote server] file:///var/folders/60/bynswzcx6p3bx0bdr61xbtf00000gn/T/webdriver-profile20140707-57439-11dc64c/extensions/fxdriver@googlecode.com/components/driver_component.js:9502:in `FirefoxDriver.prototype.findElementsInternal_'
# [remote server] file:///var/folders/60/bynswzcx6p3bx0bdr61xbtf00000gn/T/webdriver-profile20140707-57439-11dc64c/extensions/fxdriver@googlecode.com/components/driver_component.js:9506:in `FirefoxDriver.prototype.findElements'
# [remote server] file:///var/folders/60/bynswzcx6p3bx0bdr61xbtf00000gn/T/webdriver-profile20140707-57439-11dc64c/extensions/fxdriver@googlecode.com/components/command_processor.js:11455:in `DelayedCommand.prototype.executeInternal_/h'
# [remote server] file:///var/folders/60/bynswzcx6p3bx0bdr61xbtf00000gn/T/webdriver-profile20140707-57439-11dc64c/extensions/fxdriver@googlecode.com/components/command_processor.js:11460:in `DelayedCommand.prototype.executeInternal_'
# [remote server] file:///var/folders/60/bynswzcx6p3bx0bdr61xbtf00000gn/T/webdriver-profile20140707-57439-11dc64c/extensions/fxdriver@googlecode.com/components/command_processor.js:11402:in `DelayedCommand.prototype.execute/<'
# ./spec/requests/calendar_pages_spec.rb:32:in `block (2 levels) in <top (required)>'
使用save_and_open_page
时,此代码显示在页面上:
<td id="2014-07-07" class="day today">
任何想法为什么我的显然简单直接的测试不会通过Selenium?
更新
@ user2709090在下面解决了它。显然,CSS不允许ID以数字作为有效ID开头。 Rack::Test
并不关心这一点,但Selenium显然是这样做的。
答案 0 :(得分:0)
检查你的Capybara.default_selector的值 - 如果它的:xpath会给你看到的结果,因为td#2014-07-07不是有效的xpath选择器。
答案 1 :(得分:0)
bugzilla.mozilla.org/show_bug.cgi?id=718326 - 因为#2014-07-07是一个css选择器而且css不允许以数字开头的ID选择器出现错误是正确的 - racktest就是这样的宽松而不是完整的浏览器 - 注意所有数字ID在html5中实际上是有效的,它在CSS中是不可接受的