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
的元素,然后它会遍历每个元素,比较文本以查看哪些匹配(并检查可见性),但它必须比较所有元素确保选择器没有歧义。
一种加快速度的方法是使用 first
和 minimum
选项
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)]
所以这是一个关于 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
的元素,然后它会遍历每个元素,比较文本以查看哪些匹配(并检查可见性),但它必须比较所有元素确保选择器没有歧义。
一种加快速度的方法是使用 first
和 minimum
选项
page.first('.Select-option', text: 'the text', minimum: 1).click
它可以跳过一些文本和可见性检查,因为它不必担心不明确的元素。另一种解决方案是完全跳过 text
选项,并按照
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)]