lib/appium_lib/ios/element/generic.rb in appium_lib-0.24.1 vs lib/appium_lib/ios/element/generic.rb in appium_lib-1.0.0
- old
+ new
@@ -1,165 +1,32 @@
-# encoding: utf-8
-module Appium::Ios
-=begin
- name, names, text, text should match substring and case insensitive.
+module Appium
+ module Ios
- iOS .name() is the accessibility attribute. If not defined, then .label() is used instead.
- This differs from Android where name (the content description) is empty when not set.
+ # Find the first element containing value
+ # @param value [String] the value to search for
+ # @return [Element]
+ def find value
+ xpath_visible_contains '*', value
+ end
- name defaults to label when undefined. value is never a default so that must be
- included in a new search.
-
- Find - search everything.
-
- The search order is:
- 1. name
- 2. label (implied by name)
- 3. value
-
- Android name = iOS name & label
- Android text = iOS value
-=end
-
- # @private
- # returnElems requires a wrapped $(element).
- # set to empty array when length is zero to prevent hang.
- #
- # UIAElementNil when not matched
- #
- # 1. secureTextFields
- # 2. textFields
- # 3. buttons
- # 4. elements
- #
- # search takes the window to search.
- # start searching webview first.
- # window 0 is the main window.
- # window 1 is the 1st webview (if it exists)
- # must break instead of return because it's not a function.
- #
- # single element length is undefined when found and 0 when not found.
- # @param predicate [String] the predicate
- # @return [String] the completed JavaScript program
- def first_ele_js predicate
- (<<-JS).strip # remove trailing newline
- au.mainApp().getFirstWithPredicateWeighted("#{predicate}");
- JS
- end
-
- # @private
- # @param predicate [String] the predicate
- # @return [String] the completed JavaScript program
- def all_ele_js predicate
- (<<-JS).strip # remove trailing newline
- au.mainApp().getAllWithPredicate("#{predicate}");
- JS
- end
-
- # Return the first element matching text.
- # @param text [String] the text to search for
- # @return [Element] the first matching element
- def find text
- text = escape_single_quote text
- ele = nil
- # prefer value search. this may error with:
- # Can't use in/contains operator with collection 1
- js = first_ele_js "value contains[c] '#{text}'"
- ele = ignore { execute_script js }
-
- # now search name and label if the value search didn't match.
- unless ele
- js = first_ele_js "name contains[c] '#{text}' || label contains[c] '#{text}'"
- ele = ignore { execute_script js }
+ # Find all elements containing value
+ # @param value [String] the value to search for
+ # @return [Array<Element>]
+ def finds value
+ xpaths_visible_contains '*', value
end
- # manually raise error if no element was found
- raise Selenium::WebDriver::Error::NoSuchElementError, 'An element could not be located on the page using the given search parameters.' unless ele
-
- ele
- end
-
- # Return all elements matching text.
- # @param text [String] the text to search for
- # @return [Array<Element>] all matching elements
- def finds text
- text = escape_single_quote text
- eles = []
- # value contains may error
- js = all_ele_js "value contains[c] '#{text}'"
- eles = ignore { execute_script js }
-
- js = all_ele_js "name contains[c] '#{text}' || label contains[c] '#{text}'"
- eles += ignore { execute_script js }
- eles
- end
-
- # Return the first element matching text.
- # @param text [String] the text to search for
- # @return [Element] the first matching element
- def text text
- text = escape_single_quote text
- js = first_ele_js "value contains[c] '#{text}'"
- execute_script js
- end
-
- # Return all elements matching text.
- # @param text [String] the text to search for
- # @return [Array<Element>] all matching elements
- def texts text
- text = escape_single_quote text
- # XPath //* is not implemented on iOS
- # https://github.com/appium/appium/issues/430
- js = all_ele_js "value contains[c] '#{text}'"
- execute_script js
- end
-
- # Return the first element matching name.
- # on Android name is content description
- # on iOS name is the accessibility label or the text.
- #
- # ```ruby
- # # find element with name or label containing example and access the name attribute.
- # name('example').name
- #
- # # find element with name or label containing example and access the label attribute.
- # name('example').label
- # ```
- #
- # @param name [String] the name to search for
- # @return [Element] the first matching element
- def name name
- name = escape_single_quote name
- mobile :findElementNameContains, name: name
- end
-
- def name_exact name
- name = escape_single_quote name
- js = all_ele_js "name == '#{name}'"
- result = execute_script js
-
- return result if result.kind_of? Selenium::WebDriver::Element
-
- if result.length > 0
- result.first
- else
- Appium::Common.raise_no_element_error
+ # Find the first element exactly matching value
+ # @param value [String] the value to search for
+ # @return [Element]
+ def find_exact value
+ xpath_visible_exact '*', value
end
- end
- # Return all elements matching name.
- # on Android name is content description
- # on iOS name is the accessibility label or the text.
- # @param name [String] the name to search for
- # @return [Array<Element>] all matching elements
- def names name
- name = escape_single_quote name
- # :name is not consistent across iOS and Android so use custom JavaScript
- # https://github.com/appium/appium/issues/379
- js = all_ele_js "name contains[c] '#{name}' || label contains[c] '#{name}'"
- execute_script js
- end
-
- def escape_single_quote text_to_escape
- text_to_escape.gsub("'", '\\' * 4 + "'")
- end
-end # module Appium::Ios
+ # Find all elements exactly matching value
+ # @param value [String] the value to search for
+ # @return [Array<Element>]
+ def finds_exact value
+ xpaths_visible_exact '*', value
+ end
+ end # module Ios
+end # module Appium
\ No newline at end of file