有在线帮助使用select2与水豚(见下面的链接),但没有帮助,特别是就我已经看到的select2下拉字段。我尝试过各种方法,包括尝试在以下情况下填充字段:js => false (使用类似于find(:xpath, "//input[@id='product_manufacturer_id']").set "Test product manufacturer"
的东西),或者在其他select2字段上使用的解决方案的变体(参见下面提供的链接)。到目前为止,没有什么对我有用。
关于我的配置的注释:
f.association
.)。特别是,ProductManufacturer
实例与产品处于has_many
关系中。ProductManufacturer
实例(即您在搜索字段中键入的文本)动态填充。如果看到我是如何实现工厂的话,这是很有帮助的:
这是我的工厂档案:
factory :product do
name "Test product"
url { Faker::Name.name.parameterize }
access_level 1
product_manufacturer
end
factory :product_manufacturer do
name "Test product manufacturer"
factory :product_manufacturer_with_product do
transient do
products_count 1
end
after(:create) do |product, evaluator|
create_list(:product,
evaluator.products_count,
product: product)
end
end
end
然后,在测试开始之前,我运行:
@product_manufacturer = create(:product_manufacturer)
我的最新尝试:我的助手方法(它正在为我的其他select2字段工作):
def select2_choose(id, options)
page.execute_script "$('#{id}').trigger('keydown').val('{options[:query]}').trigger('keyup');"
find(".select2-result-label", :text => options[:choose]).click
end
然后我如何实现它:
select2_choose( "#s2id_autogen7",
:query => @product_manufacturer.name[0...-2],
:choose => @product_manufacturer.name)
它输出以下错误消息:
Failure/Error: create_product
Capybara::ElementNotFound:
Unable to find css ".select2-result-label" with text "Test product manufacturer"
(这基本上意味着它已经找到并点击了下拉框,并在查询文本中添加了“测试产品制造”。但是select2并没有从数据库中找到找到它的选项。)
注意,我已经成功地使用factory_girl生成了我的ProductManufacturer实例对象@product_manufacturer
,并且调用诸如puts @product_manufacturer
之类的东西是成功的,返回实例对象:ProductManufacturer:0x007f0145f9cb38>
。
下面是测试失败前的截图:
其他相关但未完全解决此问题的问题:
-选择select2跌落(但不是在水豚):
-在水豚选择select2选项(但不是跌落):
如何用水豚DSL测试Select2元素? (注:我成功地使用了这里的答案来选择非下拉select2字段)
-使用selenium选择select2下拉菜单
发布于 2016-12-21 19:10:41
Capybara的字段操作(fill_in、set等)只适用于基本的html表单字段,而不是JS驱动的小部件,因为它们通常隐藏基本字段。在Capybara中使用任何JS驱动的小部件的关键是执行用户必须执行的操作,在本例中是单击可视元素以触发下拉列表,然后单击要选择的元素。
例如,要从示例页http://select2.github.io/examples.html的第一个http://select2.github.io/examples.html下拉列表中选择"California“,可以这样做
first('.select2-container', minimum: 1).click
find('li.select2-results__option[role="treeitem"]', text: 'California').click
如果您想通过键入搜索词而不是单击结果来完成这一操作,则如下所示
first('.select2-container', minimum: 1).click
find('.select2-dropdown input.select2-search__field').send_keys("California", :enter)
如果您正在测试一个web应用程序,那么使用execute_script
和trigger
是个坏主意,因为它绕过了大多数用户实际可以做的检查,如果您只是在自动化一个页面,它们就会很好。
发布于 2016-12-22 04:05:08
事实证明,我的问题很简单,我需要在加载带有表单的页面之前运行工厂,以便select2可以选择它们。
换句话说,我试图这样做:
click_link "New Product"
create(:product_manufacturer)
当我应该这么做的时候
create(:product_manufacturer)
click_link "New Product"
发布于 2018-10-25 08:32:34
你也可以看看水豚-精选-2宝石,它为凯巴拉提供了select2
助手。它适用于select2版本3。同时它还支持版本4(以防升级)。
select2 'Test product manufacturer', from: 'Product manufacturer'
如果需要搜索选项(或进行Ajax调用),可以执行以下操作:
select2 'Test product manufacturer', from: 'Product manufacturer', search: true
https://stackoverflow.com/questions/41257506
复制相似问题