Module: Calabash::Cucumber::UIA

Includes:
Logging
Included in:
Core, IOS7Operations
Defined in:
lib/calabash-cucumber/uia.rb

Overview

Low-level module for interacting directly with UIA See also https://developer.apple.com/library/ios/documentation/ToolsLanguages/Reference/UIAElementClassReference/UIAElement/UIAElement.html Typically used to interact with System or remote views.

Instance Method Summary collapse

Methods included from Logging

#calabash_info, #calabash_warn

Instance Method Details

#uia(command, options = {}) ⇒ Object

Executes raw JavaScript in the UIAutomation environment (using ‘eval`).

Parameters:

  • command (String)

    the JavaScript snippet to execute

Returns:

  • (Object)

    the result returned by the UIA process

Raises:

  • (ArgumentError)


19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/calabash-cucumber/uia.rb', line 19

def uia(command, options={})
  # UIA only makes sense if there is a run loop
  launcher = Calabash::Cucumber::Launcher.launcher_if_used
  run_loop = launcher && launcher.active? && launcher.run_loop
  raise ArgumentError, 'the current launcher must be active and be attached to a run_loop' unless run_loop
  raise ArgumentError, 'please supply :command' unless command

  case run_loop[:uia_strategy]
    when :preferences
      res = http({:method => :post, :path => 'uia'}, {:command => command}.merge(options))

      begin
        res = JSON.parse(res)
      rescue TypeError, JSON::ParserError => _
        raise "Could not parse response '#{res}'; the app has probably crashed"
      end

      if res['outcome'] != 'SUCCESS'
        raise "uia action failed because: #{res['reason']}\n#{res['details']}"
      end
      res['results'].first
    when :host
      RunLoop.send_command(run_loop, command)
    else
      candidates = [:preferences, :host]
      raise ArgumentError, "expected '#{run_loop[:uia_strategy]}' to be one of #{candidates}"
  end
end

#uia_call(args_arr, *opts) ⇒ Object

Advanced method used to invoke UIAutomation JavaScript methods on objects found via Calabash queries

Examples:

uia_call [:button, {marked:'New Post'}], :isVisible

Advanced example that chains calls and uses arguments

uia_call [:view, marked:'New Post'], {withName:"New Post"}, :toString, {charAt:0}

Parameters:

  • args_arr (Array)

    array describing the query, e.g., ‘[:button, marked:’foo’]‘

  • opts (Array)

    optional arguments specifying a chained sequence of method calls (see example)

See Also:



122
123
124
# File 'lib/calabash-cucumber/uia.rb', line 122

def uia_call(args_arr, *opts)
  uia_call_method(:queryEl, args_arr, *opts)
end

#uia_call_windows(args_arr, *opts) ⇒ Object

Similar to ‘uia_call` but searches all windows

See Also:



128
129
130
# File 'lib/calabash-cucumber/uia.rb', line 128

def uia_call_windows(args_arr, *opts)
  uia_call_method(:queryElWindows, args_arr, *opts)
end

#uia_names(*queryparts) ⇒ Array<String>

Invoke a Calabash query inside the UIAutomation Calabash engine - includes all UIAWindows. Note that this traverses the UIA (accessibility) hierarchy.

Examples:

uia equivalent of ‘identifier “button”`

uia_names :button
# returns
[
  "Browse",
  "UINavigationBarBackIndicatorDefault.png",
  "16h",
  "reader postaction comment blue",
  "16h",
  "52",
  "17h",
  "10",
  "Reader",
  "Notifications",
  "Me",
  "New Post"
]

Parameters:

  • queryparts (Array)

    array of segments in the query, e.g., ‘:button, marked:’Hello’‘

Returns:

  • (Array<String>)

    “names” (accessibilityIdentifier) of UIAElements matching the query.



108
109
110
111
# File 'lib/calabash-cucumber/uia.rb', line 108

def uia_names(*queryparts)
  #TODO escape '\n etc in query
  uia_handle_command(:names, queryparts)
end

#uia_query(*queryparts) ⇒ Array<Hash>

Invoke a Calabash query inside the UIAutomation Calabash engine Note that this traverses the UIA (accessibility) hierarchy.

Examples:

uia query equivalent of “button marked:‘Hello’”

uia_query :button, marked:'Hello'

Parameters:

  • queryparts (Array)

    array of segments in the query, e.g., ‘:button, marked:’Hello’‘

Returns:

  • (Array<Hash>)

    UIAElements matching the query in serialized form.



65
66
67
68
# File 'lib/calabash-cucumber/uia.rb', line 65

def uia_query(*queryparts)
  #TODO escape '\n etc in query
  uia_handle_command(:query, queryparts)
end

#uia_query_windows(*queryparts) ⇒ Array<Hash>

Invoke a Calabash query inside the UIAutomation Calabash engine - includes all UIAWindows. Note that this traverses the UIA (accessibility) hierarchy.

Examples:

uia query equivalent of “button marked:‘Hello’”

uia_query_windows :button

Parameters:

  • queryparts (Array)

    array of segments in the query, e.g., ‘:button, marked:’Hello’‘

Returns:

  • (Array<Hash>)

    UIAElements matching the query in serialized form.



82
83
84
85
# File 'lib/calabash-cucumber/uia.rb', line 82

def uia_query_windows(*queryparts)
  #TODO escape '\n etc in query
  uia_handle_command(:queryWindows, queryparts)
end