首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用水原来选择select2下拉字段

如何使用水原来选择select2下拉字段
EN

Stack Overflow用户
提问于 2016-12-21 07:39:57
回答 4查看 3.7K关注 0票数 5

有在线帮助使用select2与水豚(见下面的链接),但没有帮助,特别是就我已经看到的select2下拉字段。我尝试过各种方法,包括尝试在以下情况下填充字段:js => false (使用类似于find(:xpath, "//input[@id='product_manufacturer_id']").set "Test product manufacturer"的东西),或者在其他select2字段上使用的解决方案的变体(参见下面提供的链接)。到目前为止,没有什么对我有用。

关于我的配置的注释:

  • 使用select2版本3
  • 使用水豚WebKit
  • 这个特定的字段也使用简单的表单,并且是一个关联(f.association.)。特别是,ProductManufacturer实例与产品处于has_many关系中。
  • select2下拉字段应该由与查询文本匹配的ProductManufacturer实例(即您在搜索字段中键入的文本)动态填充。

如果看到我是如何实现工厂的话,这是很有帮助的:

这是我的工厂档案:

代码语言:javascript
运行
复制
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

然后,在测试开始之前,我运行:

代码语言:javascript
运行
复制
@product_manufacturer = create(:product_manufacturer)

我的最新尝试:我的助手方法(它正在为我的其他select2字段工作):

代码语言:javascript
运行
复制
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

然后我如何实现它:

代码语言:javascript
运行
复制
select2_choose( "#s2id_autogen7", 
  :query => @product_manufacturer.name[0...-2], 
  :choose => @product_manufacturer.name)

它输出以下错误消息:

代码语言:javascript
运行
复制
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跌落(但不是在水豚):

如何使用Capybara在下拉菜单中选择选项

无法在Select2中选择项

-在水豚选择select2选项(但不是跌落):

如何用水豚DSL测试Select2元素? (注:我成功地使用了这里的答案来选择非下拉select2字段)

-使用selenium选择select2下拉菜单

下拉框的Selenium Select2命令

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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“,可以这样做

代码语言:javascript
运行
复制
first('.select2-container', minimum: 1).click
find('li.select2-results__option[role="treeitem"]', text: 'California').click

如果您想通过键入搜索词而不是单击结果来完成这一操作,则如下所示

代码语言:javascript
运行
复制
first('.select2-container', minimum: 1).click
find('.select2-dropdown input.select2-search__field').send_keys("California", :enter)

如果您正在测试一个web应用程序,那么使用execute_scripttrigger是个坏主意,因为它绕过了大多数用户实际可以做的检查,如果您只是在自动化一个页面,它们就会很好。

票数 16
EN

Stack Overflow用户

发布于 2016-12-22 04:05:08

事实证明,我的问题很简单,我需要在加载带有表单的页面之前运行工厂,以便select2可以选择它们。

换句话说,我试图这样做:

代码语言:javascript
运行
复制
click_link "New Product"
create(:product_manufacturer)

当我应该这么做的时候

代码语言:javascript
运行
复制
create(:product_manufacturer)
click_link "New Product"
票数 0
EN

Stack Overflow用户

发布于 2018-10-25 08:32:34

你也可以看看水豚-精选-2宝石,它为凯巴拉提供了select2助手。它适用于select2版本3。同时它还支持版本4(以防升级)。

代码语言:javascript
运行
复制
select2 'Test product manufacturer', from: 'Product manufacturer'

如果需要搜索选项(或进行Ajax调用),可以执行以下操作:

代码语言:javascript
运行
复制
select2 'Test product manufacturer', from: 'Product manufacturer', search: true
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41257506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档