Capybara Select2帮助w / Firefox

问题描述 投票:0回答:2

出于某种原因,我遇到了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与最新的水豚版本有问题。

ruby-on-rails selenium-webdriver capybara
2个回答
1
投票

不知道你使用的是什么,你能够将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隐藏)并从中选择正确的条目。


0
投票

我测试了托马斯的答案,但它对我不起作用。当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')

我希望它会对任何人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.