From d12b375d491570ac88be5047b180ee18bc6ffc03 Mon Sep 17 00:00:00 2001 From: Thomas Walpole Date: Fri, 28 Dec 2018 10:49:55 -0800 Subject: [PATCH] improve label selector performance --- lib/capybara/selector.rb | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/capybara/selector.rb b/lib/capybara/selector.rb index 1747759c..1f61d55a 100644 --- a/lib/capybara/selector.rb +++ b/lib/capybara/selector.rb @@ -411,12 +411,14 @@ Capybara.add_selector(:label, locator_type: [String, Symbol]) do locator_matchers |= XPath.attr(test_id) == locator if test_id xpath = xpath[locator_matchers] end - if options.key?(:for) && !options[:for].is_a?(Capybara::Node::Element) - with_attr = XPath.attr(:for) == options[:for].to_s - labelable_elements = %i[button input keygen meter output progress select textarea] - wrapped = !XPath.attr(:for) & - XPath.descendant(*labelable_elements)[XPath.attr(:id) == options[:for].to_s] - xpath = xpath[with_attr | wrapped] + if options.key?(:for) + if (for_option = options[:for].is_a?(Capybara::Node::Element) ? options[:for][:id] : options[:for]) + with_attr = XPath.attr(:for) == for_option.to_s + labelable_elements = %i[button input keygen meter output progress select textarea] + wrapped = !XPath.attr(:for) & + XPath.descendant(*labelable_elements)[XPath.attr(:id) == for_option.to_s] + xpath = xpath[with_attr | wrapped] + end end xpath end