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

Selecting an option with select2 and Capybara running Cucumber test

我有一个 select2 v4,它通过 AJAX 加载选项。 我是 运行 一个 Cucumber 测试,我需要 select 列表的 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

这不会给我一个错误,但我没有得到 select 的选项,所以我假设点击没有真正起作用。我尝试过的事情 select 选项:

# 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 但我从来没有得到 true 甚至等待 2 分钟:

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', 搜索:真 但我收到错误 undefined methodselect2' for #and I haveWorld(CapybaraSelect2)in myenv.rb`

我正在使用 Cucumber v3.1.2 和 ruby gem 'cucumber-rails'

poltergeist 驱动程序大致相当于 7 年前的 Safari 版本,这意味着它不支持很多当前 JS/CSS。这意味着您的问题可能只是 select2 不再与 Poltergeist 兼容(没有大量填充)。更新为使用真正的浏览器(稳定 - chrome 通过 selenium 等)或直接到 Chrome 驱动程序之一(高度测试版)已经从 Poltergeist( Apparition 就是其中之一)。这些将允许您 运行 使用可见的浏览器(对调试有用)或无头浏览器。

以下代码通过 selenium 使用 Chrome 并与 select2 演示站点交互以 select 通过 Ajax.[=12= 加载的条目]

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