calabash-android 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -14,7 +14,7 @@ def build
14
14
  ant_executable,
15
15
  "clean",
16
16
  "package",
17
- "-Dandroid.api.level=16",
17
+ "-Dandroid.api.level=17",
18
18
  "-Dversion=#{Calabash::Android::VERSION}",
19
19
  ]
20
20
  Dir.chdir(@test_server_dir) do
@@ -1,2 +1,3 @@
1
1
  require 'calabash-android/operations'
2
- require 'calabash-android/version'
2
+ require 'calabash-android/version'
3
+ require 'calabash-android/abase'
@@ -0,0 +1,89 @@
1
+ class Calabash::ABase
2
+ include Calabash::Android::Operations
3
+
4
+
5
+ attr_accessor :world, :transition_duration
6
+
7
+ def initialize(world, transition_duration=0.5)
8
+ self.world = world
9
+ self.transition_duration = transition_duration
10
+ end
11
+
12
+ def trait
13
+ raise "You should define a trait method or a title method" unless respond_to?(:title)
14
+ "* marked:'#{self.title}'"
15
+ end
16
+
17
+ def current_page?
18
+ element_exists(trait)
19
+ end
20
+
21
+ def page(clz, *args)
22
+ clz.new(world, *args)
23
+ end
24
+
25
+ def await(wait_opts={})
26
+ wait_for_elements_exist([trait], wait_opts)
27
+ self
28
+ end
29
+
30
+ ##
31
+ # Performs a transition from receiver page to another by performing a +:tap+ gesture
32
+ # or a user specified +:action+.
33
+ # Caller must supply a hash of options +transition_options+ to describe the transition.
34
+ # Transition options may have the following keys
35
+ #
36
+ # +:tap+: A uiquery used to perform a tap gesture to begin transition
37
+ # +:action+: A proc to use begin transition (either :tap or :action must be supplied)
38
+ # +:page+: A page object or page object class to transition to (target page). If a class is provided this
39
+ # is instantiated using the +page+ method of self. If no +:page+ is supplied, +self+ is used.
40
+ # +:await+: If specified and truthy will await the +:page+ after performing gesture (usually to wait
41
+ # for animation to finish)
42
+ # +:tap_options+: If +:tap+ is provided used to pass as options to touch
43
+ # +:wait_options+: When awaiting target page, pass these options to the +await+ method
44
+ #
45
+ # Returns the transition target page
46
+ #
47
+ # Note it is assumed that the target page is a Calabash::ABase (or acts accordingly)
48
+ def transition(transition_options={})
49
+ uiquery = transition_options[:tap]
50
+ action = transition_options[:action]
51
+ page_arg = transition_options[:page]
52
+ should_await = transition_options.has_key?(:await) ? transition_options[:await] : true
53
+
54
+ if action.nil? && uiquery.nil?
55
+ raise "Called transition without providing a gesture (:tap or :action) #{transition_options}"
56
+ end
57
+
58
+ if uiquery
59
+ tap_options = transition_options[:tap_options] || {}
60
+ touch(uiquery, tap_options)
61
+ else
62
+ action.call()
63
+ end
64
+
65
+ page_obj = page_arg.is_a?(Class) ? page(page_arg) : page_arg
66
+ page_obj ||= self
67
+
68
+ if should_await
69
+ unless page_obj == self
70
+ wait_opts = transition_options[:wait_options] || {}
71
+ page_obj.await(wait_opts)
72
+ end
73
+ end
74
+
75
+ page_obj
76
+ end
77
+
78
+ def await_screenshot(wait_opts={}, screenshot_opts={})
79
+ await(wait_opts)
80
+ screenshot_embed(screenshot_opts)
81
+ end
82
+
83
+
84
+ protected
85
+ def method_missing(name, *args, &block)
86
+ world.send(name, *args, &block)
87
+ end
88
+
89
+ end
@@ -19,6 +19,10 @@ module Operations
19
19
  include Calabash::Android::WaitHelpers
20
20
  include Calabash::Android::TouchHelpers
21
21
 
22
+ def current_activity
23
+ `#{default_device.adb_command} shell dumpsys window windows`.each_line.grep(/mFocusedApp.+[\.\/]([^.\/\}]+)\}/){$1}.first
24
+ end
25
+
22
26
  def log(message)
23
27
  $stdout.puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S")} - #{message}" if (ARGV.include? "-v" or ARGV.include? "--verbose")
24
28
  end
@@ -142,6 +146,14 @@ module Operations
142
146
 
143
147
  ###
144
148
 
149
+ ### simple page object helper
150
+
151
+ def page(clz, *args)
152
+ clz.new(self, *args)
153
+ end
154
+
155
+ ###
156
+
145
157
  ### app life cycle
146
158
  def connect_to_test_server
147
159
  puts "Explicit calls to connect_to_test_server should be removed."
@@ -277,8 +289,7 @@ module Operations
277
289
  f.write res
278
290
  end
279
291
  else
280
- device_args = "-s #{@serial}" if @serial
281
- screenshot_cmd = "java -jar #{File.join(File.dirname(__FILE__), 'lib', 'screenShotTaker.jar')} #{path} #{device_args}"
292
+ screenshot_cmd = "java -jar #{File.join(File.dirname(__FILE__), 'lib', 'screenshotTaker.jar')} #{serial} #{path}"
282
293
  log screenshot_cmd
283
294
  raise "Could not take screenshot" unless system(screenshot_cmd)
284
295
  end
@@ -288,21 +299,35 @@ module Operations
288
299
  end
289
300
 
290
301
  def adb_command
302
+ "#{adb} -s #{serial}"
303
+ end
304
+
305
+ def adb
291
306
  if is_windows?
292
- %Q("#{ENV["ANDROID_HOME"]}\\platform-tools\\adb.exe" #{device_args})
307
+ %Q("#{ENV["ANDROID_HOME"]}\\platform-tools\\adb.exe")
293
308
  else
294
- %Q("#{ENV["ANDROID_HOME"]}/platform-tools/adb" #{device_args})
309
+ %Q("#{ENV["ANDROID_HOME"]}/platform-tools/adb")
295
310
  end
296
311
  end
297
312
 
298
- def device_args
299
- if @serial
300
- "-s #{@serial}"
301
- else
302
- ""
303
- end
313
+ def serial
314
+ @serial || default_serial
304
315
  end
305
316
 
317
+ def default_serial
318
+ devices = connected_devices
319
+ log "connected_devices: #{devices}"
320
+ raise "No connected devices" if devices.empty?
321
+ raise "More than one device connected. Specify device serial using ADB_DEVICE_ARG" if devices.length > 1
322
+ devices.first
323
+ end
324
+
325
+ def connected_devices
326
+ lines = `#{adb} devices`.split("\n")
327
+ lines.shift
328
+ lines.collect { |l| l.split("\t").first}
329
+ end
330
+
306
331
  def wake_up
307
332
  wake_up_cmd = "#{adb_command} shell am start -a android.intent.action.MAIN -n #{package_name(@test_server_path)}/sh.calaba.instrumentationbackend.WakeUp"
308
333
  log "Waking up device using:"
@@ -413,6 +438,11 @@ module Operations
413
438
  def shutdown_test_server
414
439
  begin
415
440
  http("/kill")
441
+ Timeout::timeout(3) do
442
+ sleep 0.3 while app_running?
443
+ end
444
+ rescue Timeout::Error
445
+ log ("Could not kill app. Waited to 3 seconds.")
416
446
  rescue EOFError
417
447
  log ("Could not kill app. App is most likely not running anymore.")
418
448
  end
@@ -1,4 +1,4 @@
1
- Then /^I compare the current screen with the reference image "([^\"]*) manually"$/ do |name|
1
+ Then /^I compare the current screen with the reference image "([^\"]*)" manually$/ do |name|
2
2
  # TODO: once test artifacts directory is configurable, the image location
3
3
  # will need to be either a fully qualified path somewhere (webserver?) or
4
4
  # be relative to the output HTML file
@@ -1,5 +1,5 @@
1
1
  module Calabash
2
2
  module Android
3
- VERSION = "0.4.3"
3
+ VERSION = "0.4.4"
4
4
  end
5
5
  end
@@ -42,7 +42,8 @@ public class Actions {
42
42
  addAction(element);
43
43
  }
44
44
  }
45
- } catch (Exception e) {
45
+ dexFile.close();
46
+ } catch (Exception e) {
46
47
  throw new RuntimeException(e);
47
48
  }
48
49
  }
@@ -16,7 +16,7 @@ public class WaitForScreen implements Action {
16
16
  if (InstrumentationBackend.solo.waitForActivity(args[0], DEFAULT_TIMEOUT)) {
17
17
  return Result.successResult();
18
18
  } else {
19
- String currentActivity = InstrumentationBackend.solo.getCurrentActivity().getLocalClassName();
19
+ String currentActivity = InstrumentationBackend.solo.getCurrentActivity().getClass().getSimpleName();
20
20
  Result result = new Result(false, "Screen " + args[0] + " not found. Current activity is " + currentActivity);
21
21
  result.addBonusInformation(currentActivity);
22
22
  return result;
@@ -35,7 +35,7 @@ public class WaitForScreen implements Action {
35
35
  if (InstrumentationBackend.solo.waitForActivity(args[0], timeout)) {
36
36
  return Result.successResult();
37
37
  } else {
38
- String currentActivity = InstrumentationBackend.solo.getCurrentActivity().getLocalClassName();
38
+ String currentActivity = InstrumentationBackend.solo.getCurrentActivity().getClass().getSimpleName();
39
39
  Result result = new Result(false, "Screen " + args[0] + " not found. Current activity is " + currentActivity);
40
40
  result.addBonusInformation(currentActivity);
41
41
  return result;
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: calabash-android
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.4.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-28 00:00:00.000000000 Z
12
+ date: 2013-05-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cucumber
@@ -138,6 +138,7 @@ files:
138
138
  - features-skeleton/support/hooks.rb
139
139
  - irbrc
140
140
  - lib/calabash-android.rb
141
+ - lib/calabash-android/abase.rb
141
142
  - lib/calabash-android/calabash_steps.rb
142
143
  - lib/calabash-android/canned_steps.md
143
144
  - lib/calabash-android/color_helper.rb
@@ -145,7 +146,7 @@ files:
145
146
  - lib/calabash-android/helpers.rb
146
147
  - lib/calabash-android/lib/AXMLPrinter2.jar
147
148
  - lib/calabash-android/lib/manifest_extractor.jar
148
- - lib/calabash-android/lib/screenShotTaker.jar
149
+ - lib/calabash-android/lib/screenshotTaker.jar
149
150
  - lib/calabash-android/lib/unsign.jar
150
151
  - lib/calabash-android/management/adb.rb
151
152
  - lib/calabash-android/management/app_installation.rb