Capybara / Selenium:加速下拉选择?

时间:2017-10-24 17:48:27

标签: selenium capybara

所以这是关于Selenium Webdriver(Chromedriver)和Capybara的一个性能问题。

我有一些反应选择下拉列表,其中有相当多的数据。由于某种原因,反应选择需要花费非常长的时间来挑选其中的选项。代码非常简单,我从这里抓取它:https://github.com/JedWatson/react-select/issues/832

但它基本上归结为:

page.find('.Select-control').click
page.find('.Select-option', text: 'the text').click

事情是,这很好。但这需要很长时间(下拉一分钟)。现在......在Capybaras防守中,这些下拉列表有很多可供选择的选项,所以我认为从最顶层的项目中选择将是最快的,但这似乎不会影响它。

Capybara / Selenium是否在某个地方或某个地方的不同排序列表中保留了“选项”?因为我假设从下拉列表中选择顶部选项会更快,但似乎不是吗?

1 个答案:

答案 0 :(得分:2)

通常,使用text选项时,find首先使用当前选择器类型的定位符找到匹配的所有元素。在您的情况下,您的选择器类型默认为:css,定位器为'.Select-option . So Capybara will find all elements with the class Select-option`然后它将遍历每个元素,比较文本以查看匹配(并检查)可见性),但它必须比较所有这些,以确保选择器不含糊。

提高速度的一种方法是将firstminimum选项一起使用

page.first('.Select-option', text: 'the text', minimum: 1).click

可以跳过一些文本和可见性检查,因为它不必担心模糊元素。另一个解决方案是完全跳过text选项并将其写入XPath中

page.find(:xpath, XPath.css('.Select-option')[XPath.string.n.is('the text')]).click # Haven't verified this is 100% correct but it should be close

如果您在应用中执行此操作,可能需要考虑为此

创建自定义选择器
Capybara.add_selector(:react_option) do
  xpath do |locator|
    XPath.css('.Select-option')[XPath.string.n.is(locator)]
  end
  # You can add other filters in here - see https://github.com/teamcapybara/capybara/blob/master/lib/capybara/selector.rb
end

然后允许你做

page.find(:react_option, 'the text').click

注意,如果你可以限制元素类型,它也会使查询更有效率,所以如果所有元素都是<li>个元素你可能想做类似的事情

XPath.css('li.Select-option')[XPath.string.n.is(locator)]