Capybara/Selenium: 加快下拉选择速度?

Capybara/Selenium: Speeding up Dropdown Selecting?

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

我有一些 react-select 下拉菜单,里面有很多数据。出于某种原因,react-selects 需要非常非常长的时间来选择其中的选项。代码非常简单,我是从这里抓取的:https://github.com/JedWatson/react-select/issues/832

但基本上可以归结为:

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

事实是,这工作正常。但这需要很长时间(一分钟以上的下拉菜单)。现在...在 Capybaras 防御中,这些下拉菜单有很多 select 的选项,所以我认为从最上面的项目 selecting 是最快的,但这似乎没有影响它。

Capybara/Selenium 是否将 "options" 保存在某处或某处不同的排序列表中?因为我假设 select 从下拉列表中的顶部选项访问会更快,但它似乎不是?

一般情况下,当使用text选项时,find首先使用当前选择器类型的定位器查找所有匹配的元素。在您的情况下,您的选择器类型默认为:css,定位器为 .Select-option。所以 Capybara 会找到所有带有 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)]