【问题标题】:Rspec Capybara find field not functioningRspec Capybara 发现字段不起作用
【发布时间】:2013-12-30 18:13:31
【问题描述】:

我正在使用 capybara 和 rspec 运行 Rails 4(操作系统是 Ubuntu 13.10)。我遇到了一个问题——当我运行 rspec 时,我的规范工作,包括那些使用 capybara 的 fill_in 方法的工作。但是在一个规范中,我需要使用 capybara 的 find_field 方法,它根本不起作用。它给了我以下错误:

Failure/Error: page.find_field('From:').set(Date.today - 1.month)
 Capybara::ElementNotFound:
   Unable to find field "From:"

现在,我在 page.find_field... 行之前插入了“puts page.html”行,它打印的 html 包括以下行:

<div class="date-range-picker">
<span class="from-date"><label for="from_date">From:</label> <input id="from_date"    name="from_date" type="date" value="2013-12-23" /></span>
 <span class="to-date"><label for="to_date">To:</label> <input id="to_date"  name="to_date" type="date" value="2013-12-30" /></span>
 </div>

所以元素在那里,但没有被 find_field 方法拾取。有什么想法吗?

【问题讨论】:

  • 如果各种选择器都帮不上忙,问题可能不存在。请粘贴该示例的完整代码。

标签: ruby-on-rails rspec capybara


【解决方案1】:

好的,经过Capybara 的源文件,我发现了问题。使用Capybara-webkit 时,#find_field 方法似乎无法正常工作。该方法仅在具有 js: true 参数的示例上失败,因此这应该是第一个线索。无论如何,这似乎是capybaracapybara-webkit之间的一些方法命名冲突,但我没有仔细分析,所以我不能确定。

我将find_field('from_date') 更改为find('#from_date'),现在一切正常。它在更改为:rack_test 驱动程序时也有效,但因为我需要 webkit,所以我也会坚持。这个问题是否记录在任何地方??

【讨论】:

    【解决方案2】:

    至于水豚documentation

    “在页面上查找表单字段。可以通过其名称、id 或标签文本找到该字段。”

    所以请改用此代码:

    page.find_field('form_date').set(Date.today - 1.month)
    

    所以你是通过它的 id 选择字段。

    【讨论】:

    • 试过了。结果相同。上面的代码是通过标签文本查找的,根据您的报价应该可以工作。
    【解决方案3】:

    我将您的 HTML 片段放置在 HTML 页面中,并且能够成功地在其上执行 find_field('From:'),这表明问题出在包含的 HTML 中。我的“想法”是剥离页面,直到 find_field 成功隔离违规内容。

    【讨论】:

    • 定位器到底是什么?如果您指的是元素的名称或 ID(在本例中为“from_date”),我已经尝试过了,它给了我相同的结果。
    • 我传递给方法的字符串是标签文本,根据 Capybara 的文档应该可以工作。
    • 你是对的,只要它是封闭
      字段的一部分,如文档中所述。
    【解决方案4】:

    我在另一个网站上发现了这个,它对我有点用:

    将此添加到“support/select_from_chosen.rb”:

    module SelectFromChosen
      # select_from_chosen('Option', from: 'id_of_field')
      def select_from_chosen(item_text, options)
        field = find_field(options[:from], :visible => false)
        find("##{field[:id]}_chosen").click
        find("##{field[:id]}_chosen ul.chosen-results li", :text => item_text).click
      end
    end
    
    RSpec.configure do |config|
      config.include SelectFromChosen, type: :feature
    end
    

    我能做到:

    select_from_chosen('Blue', from: 'car_colors')
    find('#submit-button').click
    expect(page).to have_content 'Blue'
    select_from_chosen('Red', from: 'car_colors')
    find('#submit-button').click
    expect(page).to have_content 'Red'
    

    我实际上试图做的是验证所选结果中的选项对某些用户可用,而对其他用户不可用,因此我最终使用:

    find('#car_colors_chosen').click
    expect(page).to have_content 'Blue'
    expect(page).not_to have_content 'Gold'
    

    只是想添加这个以防它帮助别人,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      相关资源
      最近更新 更多