diff --git a/lib/appium_lib/android/element/button.rb b/lib/appium_lib/android/element/button.rb index a25b95ba..da4f2f87 100644 --- a/lib/appium_lib/android/element/button.rb +++ b/lib/appium_lib/android/element/button.rb @@ -7,20 +7,47 @@ module Android private # @private - def _button_visible_selectors + def _button_visible_selectors_xpath "//#{Button}|#{ImageButton}" end + def _button_visible_selectors(opts = {}) + button_index = opts.fetch :button_index, false + image_button_index = opts.fetch :image_button_index, false + + if button_index && image_button_index + "new UiSelector().className(#{Button}).instance(#{button_index});" \ + "new UiSelector().className(#{ImageButton}).instance(#{image_button_index});" + else + "new UiSelector().className(#{Button});" \ + "new UiSelector().className(#{ImageButton});" + end + end + # @private + # For automationName is uiautomator2 + def _button_exact_string_xpath(value) + string_visible_exact_xpath(Button, value) + + string_visible_exact_xpath(ImageButton, value).sub(/\A\/\//, '|') + end + def _button_exact_string(value) - string_visible_exact(Button, value) + - string_visible_exact(ImageButton, value).sub(/\A\/\//, '|') + button = string_visible_exact Button, value + image_button = string_visible_exact ImageButton, value + button + image_button end # @private + # For automationName is uiautomator2 + def _button_contains_string_xpath(value) + string_visible_contains_xpath(Button, value) + + string_visible_contains_xpath(ImageButton, value).sub(/\A\/\//, '|') + end + def _button_contains_string(value) - string_visible_contains(Button, value) + - string_visible_contains(ImageButton, value).sub(/\A\/\//, '|') + button = string_visible_contains Button, value + image_button = string_visible_contains ImageButton, value + button + image_button end public @@ -36,12 +63,21 @@ def button(value) index = value raise "#{index} is not a valid index. Must be >= 1" if index <= 0 - result = find_elements(:xpath, _button_visible_selectors)[value - 1] - raise Selenium::WebDriver::Error::NoSuchElementError unless result + if automation_name_is_uiautomator2? + result = find_elements(:xpath, _button_visible_selectors_xpath)[value - 1] + raise Selenium::WebDriver::Error::NoSuchElementError unless result + else + result = find_element :uiautomator, _button_visible_selectors(index: index) + end + return result end - find_element :xpath, _button_contains_string(value) + if automation_name_is_uiautomator2? + find_element :xpath, _button_contains_string_xpath(value) + else + find_element :uiautomator, _button_contains_string(value) + end end # Find all buttons containing value. @@ -49,36 +85,66 @@ def button(value) # @param value [String] the value to search for # @return [Array