Rspec Capybara Selenium测试失败但在Rack :: Test中没有相同的测试

时间:2014-07-07 14:47:52

标签: ajax selenium rspec capybara

我在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显然是这样做的。

2 个答案:

答案 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中是不可接受的