【问题标题】:How to interact with Bootstrap Popover using Capybara Rails?如何使用 Capybara Rails 与 Bootstrap Popover 交互?
【发布时间】:2016-04-09 00:13:03
【问题描述】:

我正在尝试测试按下按钮是否会将新记录插入数据库(Rails 5b3)

该按钮位于引导弹出窗口中,它运行的功能运行良好。但是,当我尝试对其进行测试时,我似乎无法定位该元素。

默认情况下,弹出框的内容不在 DOM 上,它是在单击按钮时插入和删除的。这是 Bootstrap v4 中的默认行为

这是我的测试宝石集:

  gem "rails-controller-testing", :git => "https://github.com/rails/rails-controller-testing"
  gem 'launchy'
  gem 'poltergeist'
  gem 'rspec', '~> 3.5.0.beta1'
  gem 'rspec-core', '~> 3.5.0.beta1'
  gem 'rspec-rails', '~> 3.5.0.beta1'
  gem 'guard-rspec', '~> 4.6', require: false
  gem 'capybara'
  gem 'factory_girl_rails'

这是我试图定位的弹出框插入的相关 HTML:

<button data-js-method="createblock" class='btn btn-secondary btn-block'>Heading</button>

这是我的测试:

scenario 'Popover#Heading' do
  before_count = HeadingBlock.count
  # This clicks the button to activate the popover
  find('.btn-add-block').click

  # The line below is what I'm trying to target
  # click_button('Heading') yields 'Unable to find button "Heading"'
  find('button [data-js-method="createblock"]').click
  after_count = HeadingBlock.count

  expect(after_count - before_count).to eq(1)
end

最后报错:

Capybara::ElementNotFound:
       Unable to find css "button [data-js-method=\"createblock\"]"

【问题讨论】:

    标签: ruby-on-rails twitter-bootstrap testing capybara ruby-on-rails-5


    【解决方案1】:

    在 CSS 选择器中,空格表示查找后代,但您正在寻找匹配按钮元素的属性。所以应该是

    find('button[data-js-method="createblock"]').click #no space between button and [data-....
    

    我不确定为什么 click_button('Heading') 对您不起作用,因为您没有说明尝试时遇到的错误。

    接下来是单击按钮可能需要一些时间来处理的问题,因此立即获得计数可能会很不稳定。您应该使用expect(page).to have_selector('whatever selector', count: before_count+1),以便水豚等待/重试行为可以为您工作——我不知道该选择器应该是什么,因为我不知道HeadingBlock 的定义是什么。

    【讨论】:

    • 使用您的 CSS 选择器会产生相同的结果。使用 click_button('Heading') 会导致“无法找到按钮“Heading””。我不明白你帖子的后半部分。 HeadingBlock 是一个模型,我正在检查按下按钮是否在数据库中创建了一个新条目。您介意详细说明吗?
    • 如果选择器也给出“无法找到”,那么您的按钮在页面上不可见。你确定你不需要做一些其他的动作来使按钮可见,还是比你设置 Capybara.default_max_wait_time 的时间更长?您可以通过click_button('Heading', wait: 20) 进行测试,以确保它正常工作。您的下一个问题是 #click 是异步的,因此在调用后立即检查数据库不会给应用程序时间来创建新记录。在测试检查屏幕上出现的更改时,你会好得多...
    • 对数据库中的项目进行计数。因此,一旦您创建了新标题(如果它出现在页面上),请使用 have_selector 进行检查,而不是计算数据库项目 - 这样 Capybara 可以等待更改出现 - 否则您需要在点击和数据库计数调用之间休眠动作可以结束。如果您坚持进行数据库计数,您可以查看来自github.com/abotalov/waiting_rspec_matchersbecome_eq 匹配器,它将重试数据库计数一段时间,直到它匹配 - 类似于expect {HeadingBlock.count}.to become_eq(before_count+1)
    • 这就是我想要做的。我的测试中的第一次单击模拟单击“+”按钮,而我遇到问题的是单击“标题”按钮。 gfycat.com/FreshIdenticalBlackandtancoonhound 非常感谢您提供的其他信息!当我得到这个排序时,我会考虑实现它。
    • 从视频中,假设“标题”实际上是一个按钮元素(而不是一个看起来像按钮的 a 元素)——看起来 click_button('Heading') 应该可以工作。由于您已将 poltergeist 列为 gem,您是否将 Capybara.default_driver 设置为 :poltergeist (您的场景中没有js: true,所以我假设您在启用 JS 的情况下运行所有​​测试??)
    猜你喜欢
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2012-12-03
    • 2022-11-14
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多