Module: Appium::Core::Base::SearchContext

Included in:
Driver, Selenium::WebDriver::Element
Defined in:
lib/appium_lib_core/common/base/search_context.rb

Constant Summary collapse

FINDERS =

referenced: ::Selenium::WebDriver::SearchContext

::Selenium::WebDriver::SearchContext::FINDERS.merge(
  accessibility_id:     'accessibility id',
  image:                '-image',
  custom:               '-custom',
  # Android
  uiautomator:          '-android uiautomator', # Unavailable in Espresso
  viewtag:              '-android viewtag',     # Available in Espresso
  # iOS
  uiautomation:         '-ios uiautomation',
  predicate:            '-ios predicate string',
  class_chain:          '-ios class chain',
  # Windows
  windows_uiautomation: '-windows uiautomation',
  # Tizen
  tizen_uiautomation:   '-tizen uiautomation'
)

Instance Method Summary collapse

Instance Method Details

#find_element(how, what) ⇒ Element #find_element(opts) ⇒ Element

Find the first element matching the given arguments

Android can find with uiautomator like a [UISelector](developer.android.com/tools/help/uiautomator/UiSelector.html). iOS can find with a [UIAutomation command](developer.apple.com/library/ios/documentation/ToolsLanguages/Reference/UIAWindowClassReference/UIAWindow/UIAWindow.html#//apple_ref/doc/uid/TP40009930). iOS, only for XCUITest(WebDriverAgent), can find with a [class chain]( github.com/facebook/WebDriverAgent/wiki/Queries)

Find with image. Return an element if current view has a partial image. The logic depends on template matching by OpenCV. You can handle settings for the comparision following below.

Examples:

Find element with each keys


# with accessibility id. All platforms.
find_elements :accessibility_id, 'Animation'
find_elements :accessibility_id, 'Animation'

# with base64 encoded template image. All platforms.
find_elements :image, Base64.encode64(File.read(file_path))

# For Android
## With uiautomator
find_elements :uiautomator, 'new UiSelector().clickable(true)'
## With viewtag, but only for Espresso
## `setTag`/`getTag` in https://developer.android.com/reference/android/view/View
find_elements :viewtag, 'new UiSelector().clickable(true)'

# For iOS
## With :predicate
find_elements :predicate, "isWDVisible == 1"
find_elements :predicate, 'wdName == "Buttons"'
find_elements :predicate, 'wdValue == "SearchBar" AND isWDDivisible == 1'

## With Class Chain
### select the third child button of the first child window element
find_elements :class_chain, 'XCUIElementTypeWindow/XCUIElementTypeButton[3]'
### select all the children windows
find_elements :class_chain, 'XCUIElementTypeWindow'
### select the second last child of the second child window
find_elements :class_chain, 'XCUIElementTypeWindow[2]/XCUIElementTypeAny[-2]'
### matching predicate. <code>`</code> is the mark.
find_elements :class_chain, 'XCUIElementTypeWindow[`visible = 1][`name = "bla"`]'
### containing predicate. `$` is the mark.
### Require appium-xcuitest-driver 2.54.0+. PR: https://github.com/facebook/WebDriverAgent/pull/707/files
find_elements :class_chain, 'XCUIElementTypeWindow[$name = \"bla$$$bla\"$]'
e = find_element :class_chain, "**/XCUIElementTypeWindow[$name == 'Buttons'$]"
e.tag_name #=> "XCUIElementTypeWindow"
e = find_element :class_chain, "**/XCUIElementTypeStaticText[$name == 'Buttons'$]"
e.tag_name #=> "XCUIElementTypeStaticText"

# For Windows
find_elements :windows_uiautomation, '....'

# For Tizen
find_elements :tizen_uiautomation, '....'

Overloads:

  • #find_element(how, what) ⇒ Element

    Parameters:

    • how (Symbol, String)

      The method to find the element by

    • what (String)

      The locator to use

  • #find_element(opts) ⇒ Element

    Parameters:

    • opts (Hash)

      Find options

    Options Hash (opts):

    • :how (Symbol)

      Key named after the method to find the element by, containing the locator

Returns:

  • (Element)

Raises:

See Also:



92
93
94
95
96
97
98
99
100
# File 'lib/appium_lib_core/common/base/search_context.rb', line 92

def find_element(*args)
  how, what = extract_args(args)
  by = _set_by_from_finders(how)
  begin
    bridge.find_element_by by, what.to_s, ref
  rescue Selenium::WebDriver::Error::TimeOutError
    raise Selenium::WebDriver::Error::NoSuchElementError
  end
end

#find_elements(*args) ⇒ Object

Find all elements matching the given arguments

See Also:



107
108
109
110
111
112
113
114
115
# File 'lib/appium_lib_core/common/base/search_context.rb', line 107

def find_elements(*args)
  how, what = extract_args(args)
  by = _set_by_from_finders(how)
  begin
    bridge.find_elements_by by, what.to_s, ref
  rescue Selenium::WebDriver::Error::TimeOutError
    []
  end
end