如何使用 Capybara Rails 与 Bootstrap Popover 交互?
How to interact with Bootstrap Popover using Capybara Rails?
我正在尝试测试按下按钮是否会向数据库中插入一条新记录 (Rails 5b3)
该按钮位于 bootstrap 弹出窗口中,它运行的功能运行良好。但是,当我尝试对其进行测试时,我似乎无法定位该元素。
默认情况下,弹出窗口的内容不在 DOM 上,它是通过单击按钮插入和删除的。这是 Bootstrap v4
中的默认行为
这是我的测试 gem 设置:
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\"]"
在 CSS 选择器中,space 表示查找后代,但您要匹配按钮元素的属性。所以应该是
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)
以便水豚 waiting/retry 行为可以为您工作——我不知道该选择器应该是什么,因为我不知道 HeadingBlock
被定义为.
我正在尝试测试按下按钮是否会向数据库中插入一条新记录 (Rails 5b3)
该按钮位于 bootstrap 弹出窗口中,它运行的功能运行良好。但是,当我尝试对其进行测试时,我似乎无法定位该元素。
默认情况下,弹出窗口的内容不在 DOM 上,它是通过单击按钮插入和删除的。这是 Bootstrap v4
中的默认行为这是我的测试 gem 设置:
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\"]"
在 CSS 选择器中,space 表示查找后代,但您要匹配按钮元素的属性。所以应该是
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)
以便水豚 waiting/retry 行为可以为您工作——我不知道该选择器应该是什么,因为我不知道 HeadingBlock
被定义为.