【问题标题】:Check the specific attribute of a html tag exists in Capybara with polling通过轮询检查 Capybara 中是否存在 html 标签的特定属性
【发布时间】:2017-10-05 18:17:42
【问题描述】:

我有这个简单的 HTML。按钮的那些属性(例如“AAAAA”)将根据外部事件进行传输。实时更新由 AJAX 池执行。

<div class="parent">
<div class="group"><button title="AAAAA"/></div>
<div class="group"><button title="BBBBB"/></div>
<div class="group"><button title="CCCCC"/></div>
</div>
<div class="parent">
...
</div>

假设“AAAAA”将在 XXX 事件之后转换为“DDDDD”。测试脚本就像...

scenario 'test' do
    # Before change
    page.within(first('.parent')) do
        page.within(all('.group')[0]) do
            expect(page.find('button')[:title]).to include('AAAAA')
        end
        page.within(all('.group')[1]) do
            expect(page.find('button')[:title]).to include('BBBBB')
        end
        page.within(all('.group')[2]) do
            expect(page.find('button')[:title]).to include('CCCCC')
        end
    end

    XXX

    # After change (AJAX polling)
    page.within(first('.parent')) do
        page.within(all('.group')[0]) do
            expect(page.find('button')[:title]).to include('DDDDD')
        end
    end 
end

但是,这不起作用。因为expect(page.find('button')[:title]).to include('DDDDD') 不会等到 AJAX 轮询执行。如果我将sleep(20) 放在XXX 之后,则此测试有效,但是,我猜这不是Capybara 的方式。

我想知道正确处理这种情况的聪明方法。

感谢您的帮助。

【问题讨论】:

    标签: javascript html ruby-on-rails ajax capybara


    【解决方案1】:

    您需要使用 Capybara 提供的匹配器,它具有内置的等待/重试行为,而不是 RSpec 提供的include

    expect(page).to have_css("button[title='DDDDDD']")
    

    如果你想让它测试标题中的子字符串,而不是相等,你可以使用*=而不是=等。

    你还应该尽可能选择像 find('.group:nth-of-type(1)') 这样独特的 css 选择器而不是 all('.group')[0](这两个表达式的含义略有不同,所以有时它可能是不可能的)因为从 all/first 返回的元素是非可重载

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 2014-01-17
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多