出于某种原因,我遇到了Select2和Firefox w / Geckodriver的问题。
Select2字段我以前只能说page.select 'Text', from: 'Label'
然而不再有用我只是得到一个Element <option> could not be scrolled into view
(尽管滚动到视图中)。现在我正在做类似的事情:
select2Fields = page.all('.select2-selection')
select2Fields[0].click
page.find('.select2-search__field').set('Text To Set')
within('.select2-results') do
page.find('li', text: 'Text To Click').click
end
它很难看,并且不适合我的Page Object Model方法,因为我必须知道它是哪个select2字段。当用标签找到它时似乎没有。
有任何想法吗?这是非常令人沮丧的,因为它与Chrome合作,但最新的chromedriver与最新的水豚版本有问题。
不知道你使用的是什么,你能够将select
与select2小部件一起使用,它永远不应该有用,而且事实上它确实是一个bug。原因是实际的<select>
元素(这是Capybaras select
方法使用的)在页面上是不可见的,而select2
用JS驱动的小部件替换它。您需要完成用户将要执行的操作,单击以显示窗口小部件,然后单击代表正确条目的<li>
元素。这可以全部转移到辅助方法中,也可以转移到一些自定义选择器,这些选择器归结为类似的东西
Capybara.add_selector(:select2) do
xpath do |locator, **options|
xpath = XPath.descendant(:select)
xpath = locate_field(xpath, locator, options)
xpath = xpath.next_sibling(:span)[XPath.attr(:class).contains_word('select2')][XPath.attr(:class).contains_word('select2-container')]
xpath
end
end
Capybara.add_selector(:select2_option) do
xpath do |locator|
# Use anywhere to escape from the current scope since select2 appends
# the choices to the end of the document
xpath = XPath.anywhere(:ul)[XPath.attr(:class).contains_word('select2-results__options')][XPath.attr(:id)]
xpath = xpath.descendant(:li)[XPath.attr(:role) == 'treeitem']
xpath = xpath[XPath.string.n.is(locator.to_s)] unless locator.nil?
xpath
end
end
def select_from_select2(value, from: nil, **options)
select2 = if from
find(:select2, from, options.merge(visible: false))
else
select = find(:option, value, options).ancestor(:css, 'select', visible: false)
select.find(:xpath, XPath.next_sibling(:span)[XPath.attr(:class).contains_word('select2')][XPath.attr(:class).contains_word('select2-container')])
end
select2.click
find(:select2_option, value).click
end
这应该让你调用select_from_select2
就像调用select
一样,它会找到与给定的<select>
元素相关联的select2小部件(由select2隐藏)并从中选择正确的条目。
我测试了托马斯的答案,但它对我不起作用。当Capybara单击所需选项时,select2框将自行关闭并设置0选项。 Finnaly,当我选中我想要的选项并触发change.select2事件时,我做了一个小步骤。我知道我真的不测试select2盒子。
def self.select2 (page, datos)
page.execute_script("$('##{datos[:from]}').select2('open')")
if page.find(".select2-results li", text: datos[:texto]).click
page.execute_script("$('##{datos[:from]} option[value=\"#{datos[:valor]}\"]').prop('selected', true)")
page.execute_script("$('##{datos[:from]}').trigger('change.select2')")
end
page.find(:css, '#' + datos[:from]).value
end
当我保留我的模块Helper而不在测试中包含它时,我需要在方法的名称中包含self并将capybara'test中的'page'作为参数。变量'datos'是带选择器的哈希值,选项的文本及其值。
当capybara点击它时,当select2框关闭时,我将walkaround包装在if子句中,以确保select2框的某些部分正常工作。
最后,我返回select的当前值来测试它(实际上,它不需要,因为我将该值设置为'selected')
我希望它会对任何人有所帮助。