使用select2和Capybara运行黄瓜测试选择一个选项

时间:2019-03-13 17:16:16

标签: ruby-on-rails cucumber capybara jquery-select2 jquery-select2-4

我有一个select2 v4,它通过AJAX加载选项。 我正在运行一个Cucumber测试,需要选择列表的2个选项,但似乎无法打开和加载列表(通常在我键入2或字符时填充该列表)。

我尝试过:

如建议的here

@session.execute_script("$('#publish_to').select2('open')")

@session.first(".input.publish_to .select2-container").click

@session.first("#publish_to").find(".select2-choice").click

这不会给我带来错误,但是我没有选择的选项,因此我假设单击实际上没有作用。我尝试选择的选项:

# This one cannot find the css:
@session.find(".select2-results__options", text: client.email).click

# This one gives me a Timeout error 
@session.evaluate_script "$('#publish_to').val(#{client.id}).trigger('change')"

# This one gives me a Timeout error 
@session.evaluate_script "$('.select2-search__field').trigger('keydown').val('#{client.email}').trigger('keyup')";
sleep 10
@session.find('.select2-search__option', text: client.email).click

使用trigger的任何操作都会给我造成超时错误,因此我尝试等待jQuery.active,但即使等待2分钟也没有得到true的帮助:

counter = 0
 timeout_in_sec = 120
 while counter < timeout_in_sec && @session.evaluate_script('jQuery.active').zero?
   sleep 1.second
   counter+=1
 end

我尝试使用gem capybara-select2运行:     @ session.select2 client.email,css:“#publish_to”,搜索:true 但我收到#undefined method World(CapybaraSelect2)and I have env.rb`

的错误in my select2'

我将Cucumber v3.1.2与红宝石gem 'cucumber-rails'一起使用

1 个答案:

答案 0 :(得分:0)

poltergeist驱动程序大致等效于7年的Safari版本,这意味着它不支持很多当前的JS / CSS。这意味着您的问题可能仅仅是select2与Poltergeist不再兼容(没有很多polyfilling)。更新到使用真实的浏览器(稳定的-通过硒的镀铬等)或直接脱离Chrome浏览器的驱动程序(高度Beta版)之一(最好是使用Poltergeist进行升级)(Apparition是其中之一)他们)。这些将使您可以使用可见的浏览器(可用于调试)或无头运行。

以下代码通过硒使用Chrome,并与select2演示站点进行交互以选择通过Ajax加载的条目。

require "selenium/webdriver"
require "capybara/dsl"

sess = Capybara::Session.new(:selenium_chrome)
sess.visit("https://select2.org/data-sources/ajax")

sess.first('.select2-container', minimum: 1).click
sess.find('.select2-dropdown input.select2-search__field').send_keys("capy")

sleep 5 # just to watch the browser search

sess.find('.select2-results__option', text: 'teamcapybara/capybara').click

sess.assert_selector(:css, '.select2-selection__rendered', text: 'teamcapybara/capybara')

sleep 5 # just to see the effect