smart_monkey 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5f43f6aa20e6eedb6e5c28de2b98bfdc86e608a9
4
- data.tar.gz: c32bb2694836f6d8116d320526e88eff3ea5c2d7
3
+ metadata.gz: 847d8e2008d02e4d0dea00c85c4bf3c7bb106792
4
+ data.tar.gz: 4646d1a3da95b94cc90ae2601f9706a93ed83732
5
5
  SHA512:
6
- metadata.gz: cff1fbd4a22560d4c8b6eb6c1df2b170be4b8cddc52b2f5a9d68c9e06dbb8b34a80daf950284f639d5b4d2aef31d66c439d0315adbf4286316b4465bb98c3d9e
7
- data.tar.gz: 9f53613758f53e3cc5cabf072917f4d08238bff2fcec5140c4bcb303c7878796a77f979cceac941070ba332bba4d18ac2cbab532a0763790ee457b6c551c5006
6
+ metadata.gz: 0bda662b08477fee72e67f081d16404a01651e02424e6b99931ba3f41172bb8d2e5210b79955f654a40569fb60eb274a419939795841a0d21ff05224f4c7c97e
7
+ data.tar.gz: 241f3eeec81ba69252e271b0e8e79d1e842239b61ad21ef78767b9e0e64f98eb3e73326c3eaadd125a60901632953d5fe7d0849723646c097a3853ae752ad9c7
data/README.md CHANGED
@@ -17,35 +17,66 @@ iOS Monkey Test Tool.
17
17
  [tp]:https://github.com/vigossjjj/CrashMonkey4IOS/tree/master/lib/ui-auto-monkey/tuneup
18
18
  [troubleshooting]:https://github.com/vigossjjj/CrashMonkey4IOS/tree/master/Troubleshooting.md
19
19
 
20
- ###环境及依赖安装:
21
- ###### 系统要求
20
+ ###系统及环境要求:
22
21
  1. 安装Ruby运行环境,建议不要使用OS X自带版本,可自行使用RVM安装最新版的Ruby。建议使用淘宝镜像安装,速度比较快,`$ sed -i -e 's/ftp\.ruby-lang\.org\/pub\/ruby/ruby\.taobao\.org\/mirrors\/ruby/g' ~/.rvm/config/db`
23
22
  2. 确保gem可用,也建议使用淘宝镜像 `gem sources --remove https://rubygems.org/;gem sources -a http://ruby.taobao.org/;gem sources -l`
24
23
  3. 安装**Homebrew** `ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`
25
24
  4. 建议Xcode 6.x +
26
25
 
27
- ###### 依赖安装
26
+ ###必要依赖安装:
28
27
  1. `brew install -HEAD ideviceinstaller`
29
28
  2. `brew install libimobiledevice`
30
29
  3. `brew install imagemagick`
31
- 4. `gem install smart_monkey`
32
30
 
33
31
  ###使用说明:
34
- 1. 执行前需要先配置[custom.js][custom]相关参数
35
- 2. 执行命令`smart_monkey -a ${App_BunnelID} -w ${iPhone_UDID}`
32
+ ###### 安装Release版
33
+ `gem install smart_monkey`, 执行入口: 终端下直接使用`smart_monkey`
34
+ ###### 安装开发版
35
+ 直接clone本项目, 执行入口: `/CrashMonkey4IOS/bin/smart_monkey`
36
+
37
+ ###### 执行命令
38
+ `smart_monkey -a ${App_BunnelID} -w ${iPhone_UDID}`
36
39
 
37
40
  ###参数说明:
41
+
42
+ * **`-a`**: 指向被测程序的**BundleID**(不可缺省)。e.g.`-a com.mytest.app`
43
+ * **`-w`**: 指向测试设备的**UDID**,可以通过`$instruments -s devices`进行设备id的查看,若缺省则默认指向第一台设备(模拟器或真机)。e.g.`-w 26701a3a5bc17038ca0465186407b912375b35a7`
44
+ * **`-n`**: monkey测试的执行次数,默认为1次。e.g.`-n 3`
45
+ * **`-d`**: 测试报告地址,默认为当前目录下的**smart_monkey_result**文件夹下。e.g.`-d ~/my-monkey-test-result`
46
+ * **`-t`**: 执行时间,单位为秒。e.g.`-t 60`
47
+ * **`-s`**: 指向被测app的**.dSYM**文件,若出现crash,解析crash为明文。e.g.`-s testapp.dSYM`
48
+ * **`-c`**: 自定义的配置集路径,**参数必须为目录**,目录下必须包含`custom.js`,若使用handler,目录下需存在名为**handler**的文件夹,用于存放相关文件。e.g.`-c /my/path/custom_cfg`
49
+
50
+ **如果使用custom_cfg必须遵守如下目录结构**:
51
+
52
+ ```
53
+ custom_cfg
54
+ ├── custom.js
55
+ └── handler
56
+ ├── buttonHandler.js
57
+ └── wbScrollViewButtonHandler.js
58
+ ```
59
+ * **`--event-number`**: 定义Monkey测试的总事件数,默认为50。e.g.`--event-number 100`
60
+ * **`--compress-result`**: 对测试过程中截取的图片进行压缩,以节省空间开销。e.g.`--compress-result 50%`
61
+ * **`--detail-count`**: 定义报告详情中记录的事件总数,默认为50,即在报告当中展示最近的50次随机事件,且进行操作示意绘制。e.g.`--detail-count 100`
62
+ * **`--show-config`**: 打印当前的配置信息,即**custom.js**。e.g.`--show-config`
63
+ * **`--drop-useless-img`**: 删除除展示在报告当中的其余截图,以节省空间开销,如,一轮Monkey测试共产出截图100张,参数`--detail-count`设置为20,那么使用`--drop-useless-img`会删除其余80张截图。e.g.`--drop-useless-img`
64
+ * **`--list-app`**: 打印当前连接的真机及模拟器中所安装的app。e.g.`--list-app`
65
+ * **`--list-devices`**: 打印当前所有可用设备。e.g.`--list-devices`
66
+ * **`--reset-ios-sim`**: 重启模拟器。e.g.`--reset-ios-sim`
67
+ * **`--version`**: 打印smart_monkey的版本号。e.g.`--version`
68
+
38
69
  ```
39
- $ smart_monkey -h
70
+ ⇒ CrashMonkey4IOS/bin/smart_monkey -h
40
71
  Usage: smart_monkey [options]
41
72
  -a app_name Bundle ID of the desired target on device(Required)
42
- -w device Target device udid or device describe will match" (Required)
73
+ -w device Target Device UDID(Required)
43
74
  -n run_count How many times monkeys run(default: 1)
44
75
  -d result_dir Where to output result(default: ./smart_monkey_result)
45
76
  -t time_limit_sec Time limit of running
46
77
  -s dsym_file Use .dSYM file to symbolicating crash logs
47
- -c custom_path Configuration custom.js Path
48
- -e extend_javascript_path Extend Uiautomation Javascript for such Login scripts
78
+ -c custom_cfg_path Indicate confige lib directory path, not a file path.
79
+ --event-number event_number The monkey event number(default: 50)
49
80
  --compress-result compress_rate
50
81
  compress the screenshot images to save disk space!(example: 50%)
51
82
  --detail-count detail_event_count
@@ -54,7 +85,7 @@ Usage: smart_monkey [options]
54
85
  --drop-useless-img Delete the un-displayed images of detial page.
55
86
  --list-app Show List of Installed Apps in iPhone/iPhone Simulator
56
87
  --list-devices Show List of Devices
57
- --reset-iPhone-Simulator Reset iPhone Simulator
88
+ --reset-ios-sim Reset iPhone Simulator
58
89
  --version print smart monkey version
59
90
  ```
60
91
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.1
1
+ 0.4.2
data/bin/smart_monkey CHANGED
@@ -12,20 +12,20 @@ require 'smart_monkey'
12
12
  opts = {}
13
13
  ARGV.options do |o|
14
14
  o.on('-a app_name', 'Bundle ID of the desired target on device(Required)') {|b| opts[:app_path] = b}
15
- o.on('-w device', 'Target Device UDID(Required)') {|b| opts[:device] = b}
15
+ o.on('-w device', 'Target Device UDID') {|b| opts[:device] = b}
16
16
  o.on('-n run_count', 'How many times monkeys run(default: 1)') {|b| opts[:run_count] = b.to_i}
17
17
  o.on('-d result_dir', 'Where to output result(default: ./smart_monkey_result)') {|b| opts[:result_base_dir] = File.expand_path(b)}
18
18
  o.on('-t time_limit_sec', 'Time limit of running') {|b| opts[:time_limit_sec] = b.to_i}
19
19
  o.on('-s dsym_file', 'Use .dSYM file to symbolicating crash logs') {|b| opts[:dsym_file_path] = File.expand_path(b)}
20
- o.on('-c custom_path', 'Configuration custom.js Path') {|b| opts[:custom_path] = File.expand_path(b)}
21
- o.on('-e extend_javascript_path', 'Extend Uiautomation Javascript for such Login scripts') {|b| opts[:extend_javascript_path] = File.expand_path(b)}
20
+ o.on('-c custom_cfg_path', 'Indicate confige lib directory path, not a file path.') {|b| opts[:custom_cfg_path] = File.expand_path(b)}
21
+ o.on('--event-number event_number', 'The monkey event number(default: 50)'){|b| opts[:event_number] = b}
22
22
  o.on('--compress-result compress_rate', 'compress the screenshot images to save disk space!(example: 50%)'){|b| opts[:compress_rate] = b}
23
23
  o.on('--detail-count detail_event_count', 'How many events to show in detail result page(default 50)'){|b| opts[:detail_event_count] = b.to_i}
24
24
  o.on('--show-config', 'Show Current Configuration custom.js') {|_| opts[:show_config] = true}
25
25
  o.on('--drop-useless-img', 'Delete the un-displayed images of detial page.') {|_| opts[:drop_useless_img] = true}
26
26
  o.on('--list-app', 'Show List of Installed Apps in iPhone/iPhone Simulator') {|_| opts[:list_app] = true}
27
27
  o.on('--list-devices', 'Show List of Devices') {|_| opts[:list_devices] = true}
28
- o.on('--reset-iPhone-Simulator', 'Reset iPhone Simulator'){|_| opts[:reset_iphone_simulator] = true}
28
+ o.on('--reset-ios-sim', 'Reset iPhone Simulator'){|_| opts[:reset_iphone_simulator] = true}
29
29
  o.on('--version', 'print smart monkey version'){|_| opts[:version] = true}
30
30
  o.parse!
31
31
  end
@@ -39,6 +39,13 @@ if opts[:version]
39
39
  exit(1)
40
40
  end
41
41
 
42
+ if opts[:custom_cfg_path]
43
+ if !File.directory? opts[:custom_cfg_path]
44
+ puts ARGV.options.help
45
+ exit(1)
46
+ end
47
+ end
48
+
42
49
  unless opts[:app_path] || opts[:show_config] || opts[:list_app] || opts[:reset_iphone_simulator] || opts[:list_devices]
43
50
  puts ARGV.options.help
44
51
  exit(1)
@@ -28,18 +28,18 @@ module UIAutoMonkey
28
28
  Open3.popen3(*cmds) do |stdin, stdout, stderr, thread|
29
29
  @tmpline = ""
30
30
  stdin.close
31
- # app_hang_monitor_thread = Thread.start{
32
- # sleep 30
33
- # while true
34
- # current_line = @tmpline
35
- # sleep 30
36
- # after_sleep_line = @tmpline
37
- # if current_line == after_sleep_line
38
- # puts "WARN: Application go to background! Auto-Re-Launch app!"
39
- # relaunch_app(device, app)
40
- # end
41
- # end
42
- # }
31
+ app_hang_monitor_thread = Thread.start{
32
+ sleep 30
33
+ while true
34
+ current_line = @tmpline
35
+ sleep 30
36
+ after_sleep_line = @tmpline
37
+ if current_line == after_sleep_line
38
+ puts "WARN: no response in log, trigger re-launch action."
39
+ relaunch_app(device, app)
40
+ end
41
+ end
42
+ }
43
43
  instruments_stderr_thread = Thread.start{
44
44
  stderr.each do |line|
45
45
  puts line
@@ -48,11 +48,11 @@ module UIAutoMonkey
48
48
  stdout.each do |line|
49
49
  @tmpline = line.strip
50
50
  puts @tmpline
51
- # if @tmpline =~ /MonkeyTest finish/
52
- # app_hang_monitor_thread.kill
53
- # end
51
+ if @tmpline =~ /MonkeyTest finish/ || @tmpline =~ /Script was stopped by the user/
52
+ app_hang_monitor_thread.kill
53
+ end
54
54
  end
55
- # app_hang_monitor_thread.kill
55
+ app_hang_monitor_thread.kill
56
56
  instruments_stderr_thread.kill
57
57
  end
58
58
  end
@@ -186,8 +186,9 @@ module UIAutoMonkey
186
186
  end
187
187
 
188
188
  def reset_iphone_simulator
189
- FileUtils.rm_rf("#{Dir.home}/Library/Application\ Support/iPhone\ Simulator/")
190
- puts 'reset iPhone Simulator successful'
189
+ `killall -9 "iOS Simulator"`
190
+ # FileUtils.rm_rf("#{Dir.home}/Library/Application\ Support/iPhone\ Simulator/")
191
+ # puts 'reset iPhone Simulator successful'
191
192
  end
192
193
 
193
194
  def total_test_count
@@ -324,10 +325,15 @@ module UIAutoMonkey
324
325
  "3"=>"270",
325
326
  "4"=>"90",
326
327
  }
327
- orientationNum = File.read(File.join(result_base_dir,"orientation")).strip
328
- value = rotated_map[orientationNum]
329
- unless value.nil?
330
- `mogrify -rotate #{value} "#{path}/*.png"`
328
+ orientation_file = File.join(result_base_dir,"orientation")
329
+ if File.exists?(orientation_file)
330
+ orientationNum = File.read(orientation_file).strip
331
+ value = rotated_map[orientationNum]
332
+ unless value.nil?
333
+ `mogrify -rotate #{value} "#{path}/*.png"`
334
+ end
335
+ else
336
+ exit(1)
331
337
  end
332
338
  end
333
339
 
@@ -368,6 +374,10 @@ module UIAutoMonkey
368
374
  File.expand_path('../../ios_device_log/deviceconsole', __FILE__)
369
375
  end
370
376
 
377
+ def ui_auto_monkey_lib_original_path
378
+ File.expand_path('../../ui-auto-monkey', __FILE__)
379
+ end
380
+
371
381
  def ui_auto_monkey_original_path
372
382
  File.expand_path('../../ui-auto-monkey/UIAutoMonkey.js', __FILE__)
373
383
  end
@@ -476,6 +486,20 @@ module UIAutoMonkey
476
486
  `xsltproc --output "#{result_dir}/uiautomation.html" #{uiautomation_xsl_path} "#{result_dir}/Automation Results.plist"`
477
487
  end
478
488
 
489
+ def replace_event_num_for_time_limit(custom_file)
490
+ File.open(custom_file) do |fr|
491
+ buffer = fr.read.gsub(/monkey.config.numberOfEvents.*;/, "monkey.config.numberOfEvents = 99999999;")
492
+ File.open(custom_file, "w") { |fw| fw.write(buffer) }
493
+ end
494
+ end
495
+
496
+ def replace_event_num_for_user_define(custom_file, event_number)
497
+ File.open(custom_file) do |fr|
498
+ buffer = fr.read.gsub(/monkey.config.numberOfEvents.*;/, "monkey.config.numberOfEvents = #{event_number};")
499
+ File.open(custom_file, "w") { |fw| fw.write(buffer) }
500
+ end
501
+ end
502
+
479
503
  def generate_ui_auto_monkey
480
504
  # extend_javascript_flag, extend_javascript_path = show_extend_javascript
481
505
  # orig = File.read(ui_custom_original_path)
@@ -487,15 +511,23 @@ module UIAutoMonkey
487
511
  # end
488
512
  envs_str="UniqueDeviceID=\"#{device}\";\nResultBaseDir=\"#{result_base_dir}\";\n"
489
513
  File.open(File.join(result_base_dir,"Env.js"), 'w') {|f| f.write(envs_str)}
490
- FileUtils.copy(config_custom_path, result_base_dir)
491
- FileUtils.copy(ui_auto_monkey_original_path, result_base_dir)
492
- FileUtils.cp_r(ui_hole_handler_original_path, result_base_dir)
493
- FileUtils.cp_r(ui_tuneup_original_path, result_base_dir)
494
- # FileUtils.copy("#{bootstrap_dir}/js/bootstrap.js", result_base_dir)
514
+ if @options[:custom_cfg_path]
515
+ FileUtils.cp_r(File.join(@options[:custom_cfg_path], "."), result_base_dir)
516
+ FileUtils.copy(ui_auto_monkey_original_path, result_base_dir)
517
+ FileUtils.cp_r(ui_tuneup_original_path, result_base_dir)
518
+ else
519
+ FileUtils.cp_r(File.join(ui_auto_monkey_lib_original_path, "."), result_base_dir)
520
+ end
521
+ replace_event_num_for_user_define(ui_custom_path, @options[:event_number]) if @options[:event_number]
522
+ replace_event_num_for_time_limit(ui_custom_path) unless time_limit_sec.nil?
495
523
  end
496
524
 
497
525
  def config_custom_path
498
- @options[:custom_path] || ui_custom_original_path
526
+ if @options[:custom_cfg_path]
527
+ File.join(@options[:custom_cfg_path], "custom.js")
528
+ else
529
+ ui_custom_original_path
530
+ end
499
531
  end
500
532
 
501
533
  def replace_text(orig, replace_str, marker_begin_line, marker_end_line)
@@ -540,7 +572,6 @@ module UIAutoMonkey
540
572
  hash[:uia_trace] = @uia_trace
541
573
  hash[:crashed] = @crashed
542
574
  hash[:no_run] = @no_run
543
-
544
575
  er = Erubis::Eruby.new(File.read(template_path('result.html.erb')))
545
576
  open("#{result_dir}/result.html", 'w') do |f|
546
577
  f.write(er.result(hash))
@@ -1,11 +1,9 @@
1
1
  #import "UIAutoMonkey.js"
2
- #import "handler/buttonHandler.js"
3
- #import "handler/wbScrollViewButtonHandler.js"
4
2
  #import "tuneup/tuneup.js"
5
3
 
6
4
  // Configure the monkey: use the default configuration but a bit tweaked
7
5
  monkey = new UIAutoMonkey();
8
- monkey.config.numberOfEvents = 50; // turn off to make clear that we want minutes
6
+ monkey.config.numberOfEvents = 50; // total number of monkey event
9
7
  monkey.config.delayBetweenEvents = 0.05;
10
8
  monkey.config.eventWeights = {
11
9
  tap: 100,
@@ -30,44 +28,12 @@ monkey.config.frame = {
30
28
  x: parseInt(UIATarget.localTarget().rect().origin.x),
31
29
  y: parseInt(UIATarget.localTarget().rect().origin.y)+20
32
30
  },
33
- size: {
31
+ size:
32
+ {
34
33
  width: parseInt(UIATarget.localTarget().rect().size.width),
35
34
  height: parseInt(UIATarget.localTarget().rect().size.height)-20
36
35
  }
37
36
  };// Ignore the UIAStatusBar area, avoid to drag out the notification page.
38
37
 
39
- //UI Holes handlers
40
- var handlers = [];
41
- handlers.push(new ButtonHandler("WBBack", 10, true));
42
- handlers.push(new WBScrollViewButtonHandler("weatherLeftBack", 5, false, 1));
43
- handlers.push(new ButtonHandler("取消", 3, true));
44
- handlers.push(new ButtonHandler("CloseX", 3, true));
45
- handlers.push(new ButtonHandler("确定", 3, false));
46
-
47
- monkey.config.conditionHandlers = handlers;
48
-
49
- //ANR settings
50
- var aFingerprintFunction = function() {
51
- var mainWindow = UIATarget.localTarget().frontMostApp().mainWindow();
52
- //if an error occurs log it and make it the fingerprint
53
- try {
54
- var aString = mainWindow.elementAccessorDump("tree", true);
55
- // var aString = mainWindow.logElementTree();
56
- // var aString = mainWindow.logElementJSON(["name"])
57
- if (monkey.config.anrSettings.debug) {
58
- UIALogger.logDebug("fingerprintFunction tree=" + aString);
59
- }
60
- }
61
- catch (e) {
62
- aString = "fingerprintFunction error:" + e;
63
- UIALogger.logWarning(aString);
64
- }
65
- return aString;
66
- };
67
- monkey.config.anrSettings.fingerprintFunction = false;//false | aFingerprintFunction
68
- monkey.config.anrSettings.eventsBeforeANRDeclared = 18; //throw exception if the fingerprint hasn't changed within this number of events
69
- monkey.config.anrSettings.eventsBetweenSnapshots = 8; //how often (in events) to take a snapshot using the fingerprintFunction
70
- monkey.config.anrSettings.debug = false; //log extra info on ANR state changes
71
-
72
38
  // Release the monkey!
73
39
  monkey.RELEASE_THE_MONKEY();
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_monkey
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - vigossjjj
@@ -144,8 +144,6 @@ files:
144
144
  - lib/smart_monkey/templates/result_view.js
145
145
  - lib/ui-auto-monkey/UIAutoMonkey.js
146
146
  - lib/ui-auto-monkey/custom.js
147
- - lib/ui-auto-monkey/handler/buttonHandler.js
148
- - lib/ui-auto-monkey/handler/wbScrollViewButtonHandler.js
149
147
  - lib/ui-auto-monkey/tuneup/LICENSE
150
148
  - lib/ui-auto-monkey/tuneup/assertions.js
151
149
  - lib/ui-auto-monkey/tuneup/image_asserter
@@ -1,111 +0,0 @@
1
- // Copyright (c) 2015 Yahoo inc. (http://www.yahoo-inc.com)
2
-
3
- // Permission is hereby granted, free of charge, to any person obtaining a copy
4
- // of this software and associated documentation files (the "Software"), to deal
5
- // in the Software without restriction, including without limitation the rights
6
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- // copies of the Software, and to permit persons to whom the Software is
8
- // furnished to do so, subject to the following conditions:
9
-
10
- // The above copyright notice and this permission notice shall be included in
11
- // all copies or substantial portions of the Software.
12
-
13
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- // THE SOFTWARE.
20
-
21
- "use strict";
22
- //Conforms to the ConditionHandler protocol in UIAutoMonkey
23
- //Usage
24
- // var handlers = [ ];
25
- // var handlerInterval = 20; //every how many events to process. Can vary by each handler, but often useful to group them
26
- // handlers.push(new ButtonHandler("Done", handlerInterval, false)); //every 20 events, press "Done" button if found as a top level button (no nav bar).
27
- // ...
28
- // config.conditionHandlers = handlers
29
- //
30
- function ButtonHandler(buttonName, checkEveryNumber, useNavBar, optionalIsTrueFunction) {
31
- this.buttonName = buttonName;
32
- this.checkEveryNumber = checkEveryNumber || 10;
33
- if (useNavBar == undefined) {
34
- useNavBar = true;
35
- };
36
- this.useNavBar = useNavBar;
37
- this.optionalIsTrueFunction = optionalIsTrueFunction || null;
38
- //stats
39
- this.statsIsTrueInvokedCount = 0;
40
- this.statsIsTrueReturnedTrue = 0;
41
- this.statsIsTrueReturnedFalse = 0;
42
- this.statsHandleInvokedCount = 0;
43
- this.statsHandleNotValidAndVisibleCount = 0;
44
- this.statsHandleErrorCount = 0;
45
- }
46
-
47
- // return true if we our button is visible
48
- ButtonHandler.prototype.isTrue = function(target, eventCount, mainWindow) {
49
- this.statsIsTrueInvokedCount++;
50
- var result;
51
- if (this.optionalIsTrueFunction == null) {
52
- var aButton = this.findButton(target);
53
- // result = aButton.isNotNil() && aButton.validAndVisible();
54
- result = aButton.isNotNil() && aButton.isValid() && aButton.isVisible();
55
- } else {
56
- result = this.optionalIsTrueFunction(target, eventCount, mainWindow);
57
- }
58
- if (result) {
59
- this.statsIsTrueReturnedTrue++;
60
- } else {
61
- this.statsIsTrueReturnedFalse++;
62
- };
63
- return result;
64
- };
65
-
66
- ButtonHandler.prototype.findButton = function(target) {
67
- return this.useNavBar ?
68
- target.frontMostApp().mainWindow().navigationBar().buttons()[this.buttonName] :
69
- target.frontMostApp().mainWindow().buttons()[this.buttonName];
70
- };
71
-
72
- //every checkEvery() number of events our isTrue() method will be queried.
73
- ButtonHandler.prototype.checkEvery = function() {
74
- return this.checkEveryNumber;
75
- };
76
-
77
- // if true then after we handle an event consider the particular Monkey event handled, and don't process the other condition handlers.
78
- ButtonHandler.prototype.isExclusive = function() {
79
- return true;
80
- };
81
-
82
- // Press our button
83
- ButtonHandler.prototype.handle = function(target, mainWindow) {
84
- this.statsHandleInvokedCount++;
85
- var button = this.findButton(target);
86
- if (button.isValid() && button.isVisible()) {
87
- try{
88
- button.tap();
89
- } catch(err) {
90
- this.statsHandleErrorCount++;
91
- UIALogger.logWarning(err);
92
- }
93
- } else {
94
- this.statsHandleNotValidAndVisibleCount++
95
- //UIALogger.logWarning(this.toString() + " button is not validAndVisible");
96
- };
97
- };
98
-
99
- ButtonHandler.prototype.toString = function() {
100
- return ["MonkeyTest::ButtonHandler(" + this.buttonName, this.checkEveryNumber, this.useNavBar, ")"].join();
101
- };
102
-
103
- ButtonHandler.prototype.logStats = function() {
104
- UIALogger.logDebug([this.toString(),
105
- "IsTrueInvokedCount", this.statsIsTrueInvokedCount,
106
- "IsTrueReturnedTrue", this.statsIsTrueReturnedTrue,
107
- "IsTrueReturnedFalse", this.statsIsTrueReturnedFalse,
108
- "HandleInvokedCount", this.statsHandleInvokedCount,
109
- "HandleNotValidAndVisibleCount", this.statsHandleNotValidAndVisibleCount,
110
- "HandleErrorCount", this.statsHandleErrorCount].join());
111
- };
@@ -1,114 +0,0 @@
1
- // Copyright (c) 2015 Yahoo inc. (http://www.yahoo-inc.com)
2
-
3
- // Permission is hereby granted, free of charge, to any person obtaining a copy
4
- // of this software and associated documentation files (the "Software"), to deal
5
- // in the Software without restriction, including without limitation the rights
6
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- // copies of the Software, and to permit persons to whom the Software is
8
- // furnished to do so, subject to the following conditions:
9
-
10
- // The above copyright notice and this permission notice shall be included in
11
- // all copies or substantial portions of the Software.
12
-
13
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- // THE SOFTWARE.
20
-
21
- "use strict";
22
- //Conforms to the ConditionHandler protocol in UIAutoMonkey
23
- //Usage
24
- // var handlers = [ ];
25
- // var handlerInterval = 20; //every how many events to process. Can vary by each handler, but often useful to group them
26
- // handlers.push(new ButtonHandler("Done", handlerInterval, false)); //every 20 events, press "Done" button if found as a top level button (no nav bar).
27
- // ...
28
- // config.conditionHandlers = handlers
29
- //
30
- function WBScrollViewButtonHandler(buttonName, checkEveryNumber, useNavBar, scrollViewIndex, optionalIsTrueFunction) {
31
- this.buttonName = buttonName;
32
- this.scrollViewIndex = scrollViewIndex;
33
- this.checkEveryNumber = checkEveryNumber || 10;
34
- if (useNavBar == undefined) {
35
- useNavBar = true;
36
- };
37
- this.useNavBar = useNavBar;
38
- this.optionalIsTrueFunction = optionalIsTrueFunction || null;
39
- //stats
40
- this.statsIsTrueInvokedCount = 0;
41
- this.statsIsTrueReturnedTrue = 0;
42
- this.statsIsTrueReturnedFalse = 0;
43
- this.statsHandleInvokedCount = 0;
44
- this.statsHandleNotValidAndVisibleCount = 0;
45
- this.statsHandleErrorCount = 0;
46
- }
47
-
48
- // return true if we our button is visible
49
- WBScrollViewButtonHandler.prototype.isTrue = function(target, eventCount, mainWindow) {
50
- this.statsIsTrueInvokedCount++;
51
- var result;
52
- if (this.optionalIsTrueFunction == null) {
53
- var aButton = this.findButton(target);
54
- // result = aButton.isNotNil() && aButton.validAndVisible();
55
- result = aButton.isNotNil() && aButton.isValid();
56
- } else {
57
- result = this.optionalIsTrueFunction(target, eventCount, mainWindow);
58
- }
59
- if (result) {
60
- this.statsIsTrueReturnedTrue++;
61
- } else {
62
- this.statsIsTrueReturnedFalse++;
63
- };
64
- return result;
65
- };
66
-
67
- WBScrollViewButtonHandler.prototype.findButton = function(target) {
68
- return this.useNavBar ?
69
- target.frontMostApp().mainWindow().navigationBar().buttons()[this.buttonName]:
70
- target.frontMostApp().mainWindow().scrollViews()[this.scrollViewIndex].buttons()[this.buttonName];
71
- };
72
-
73
- //every checkEvery() number of events our isTrue() method will be queried.
74
- WBScrollViewButtonHandler.prototype.checkEvery = function() {
75
- return this.checkEveryNumber;
76
- };
77
-
78
- // if true then after we handle an event consider the particular Monkey event handled, and don't process the other condition handlers.
79
- WBScrollViewButtonHandler.prototype.isExclusive = function() {
80
- return true;
81
- };
82
-
83
- // Press our button
84
- WBScrollViewButtonHandler.prototype.handle = function(target, mainWindow) {
85
- this.statsHandleInvokedCount++;
86
- var button = this.findButton(target);
87
- if (button.isValid()) {
88
- try{
89
- var x = button.rect().origin.x;
90
- var y = button.rect().origin.y;
91
- target.tap({x:x, y:y});
92
- } catch(err) {
93
- this.statsHandleErrorCount++;
94
- UIALogger.logWarning(err);
95
- }
96
- } else {
97
- this.statsHandleNotValidAndVisibleCount++
98
- //UIALogger.logWarning(this.toString() + " button is not validAndVisible");
99
- };
100
- };
101
-
102
- WBScrollViewButtonHandler.prototype.toString = function() {
103
- return ["MonkeyTest::WBScrollViewButtonHandler(" + this.buttonName, this.checkEveryNumber, this.useNavBar, this.scrollViewIndex, ")"].join();
104
- };
105
-
106
- WBScrollViewButtonHandler.prototype.logStats = function() {
107
- UIALogger.logDebug([this.toString(),
108
- "IsTrueInvokedCount", this.statsIsTrueInvokedCount,
109
- "IsTrueReturnedTrue", this.statsIsTrueReturnedTrue,
110
- "IsTrueReturnedFalse", this.statsIsTrueReturnedFalse,
111
- "HandleInvokedCount", this.statsHandleInvokedCount,
112
- "HandleNotValidAndVisibleCount", this.statsHandleNotValidAndVisibleCount,
113
- "HandleErrorCount", this.statsHandleErrorCount].join());
114
- };