代码之家  ›  专栏  ›  技术社区  ›  msmith1114

Capybara Select2帮助w/Firefox

  •  0
  • msmith1114  · 技术社区  · 6 年前

    出于某种原因,我遇到了select2和firefox w/geckodriver的问题。

    选择两个我曾经能说的字段 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
    

    它很难看,不适合我的页面对象模型方法,因为我必须排序知道它是哪个select2字段。当发现它有标签的时候似乎不是这样。

    有什么想法吗?这是非常令人沮丧的,因为它与Chrome合作,但最新的ChromedRiver与最新的水豚版本有问题。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Thomas Walpole    6 年前

    不知道你用的是什么 select 有了select2小部件,它就不应该工作了,事实上它确实是一个bug。原因是 <select> 元素(这就是水豚 选择 方法在页上不可见,并且 select2 替换为js驱动的小部件。您需要做的正是用户所做的,即单击以显示小部件,然后单击 <li> 表示正确项的元素。这些都可以移到一个helper方法中,也可以移到一些自定义选择器中,这些选择器可以归结为如下内容

    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 就像你打电话给我一样 选择 它将找到与给定 <选择> 元素(通过select2隐藏)并从中选择正确的条目。

        2
  •  0
  •   Alejo    5 年前

    我已经测试过托马斯的答案,但这对我不起作用。当水豚在所需选项中单击时,select2框会自动关闭并设置0选项。最后,当我选中所需的选项并触发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
    

    由于我保留模块助手而不将其包含在测试中,因此需要在方法名中包含self,并将capybaratest中的“page”作为参数。 变量“datos”是一个带有选择器、选项文本及其值的哈希值。

    当capybara单击select2框时,select2框关闭,我将演练包装在if子句中,以确保select2框的某些部分工作正常。

    最后,我返回select的当前值来测试它(实际上,它不需要,因为我将该值设置为'selected'的选项)

    我希望这对任何人都有帮助。