aaet 0.1.0
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 +7 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +145 -0
- data/LICENSE +201 -0
- data/README.md +177 -0
- data/Rakefile +6 -0
- data/aaet.gemspec +51 -0
- data/bin/aaet +143 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/generate_reports.rb +512 -0
- data/lib/aaet.rb +43 -0
- data/lib/aaet/android/android.rb +190 -0
- data/lib/aaet/android/parser.rb +76 -0
- data/lib/aaet/common/applitools.rb +41 -0
- data/lib/aaet/common/common_methods.rb +646 -0
- data/lib/aaet/common/locators.rb +180 -0
- data/lib/aaet/common/redis.rb +108 -0
- data/lib/aaet/ios/ios.rb +18 -0
- data/lib/aaet/ios/parser.rb +1 -0
- data/lib/version.rb +3 -0
- data/run.rb +294 -0
- data/setup/android_setup_methods.rb +161 -0
- data/setup/common_setup_methods.rb +209 -0
- data/setup/ios_setup_methods.rb +11 -0
- data/template_google_api_format.haml +48 -0
- metadata +354 -0
@@ -0,0 +1,161 @@
|
|
1
|
+
#https://developer.android.com/studio/run/emulator-commandline.html
|
2
|
+
#https://devmaze.wordpress.com/2011/12/12/starting-and-stopping-android-emulators/
|
3
|
+
#-tcpdump /path/dumpfile.cap
|
4
|
+
|
5
|
+
require 'apktools/apkxml'
|
6
|
+
require 'json'
|
7
|
+
|
8
|
+
class AndroidSetup
|
9
|
+
|
10
|
+
attr_accessor :cloud, :caps, :cloud_service
|
11
|
+
|
12
|
+
def initialize settings
|
13
|
+
self.cloud = settings[:options][:cloud]
|
14
|
+
self.caps = settings[:config][:caps][:caps]
|
15
|
+
self.cloud_service = settings[:config][:cloud][:service] || nil
|
16
|
+
end
|
17
|
+
|
18
|
+
###Emulator methods
|
19
|
+
def available_emulators
|
20
|
+
%x($ANDROID_HOME/tools/emulator -list-avds).split("\n")
|
21
|
+
end
|
22
|
+
|
23
|
+
def check_emulator avd
|
24
|
+
emulators = available_emulators
|
25
|
+
if avd.nil? or !emulators.include? avd
|
26
|
+
puts "\nINVALID OR NIL EMULATOR: #{avd}\nAvailable Emulators: #{emulators}\n".red
|
27
|
+
puts "Example: -e #{emulators.sample}\nAborting...".red
|
28
|
+
abort
|
29
|
+
else
|
30
|
+
true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def emulators_booted?
|
35
|
+
%x(adb -s #{uuid} shell getprop sys.boot_completed).strip == "1"
|
36
|
+
end
|
37
|
+
|
38
|
+
def start_avd
|
39
|
+
unless emulator_running?
|
40
|
+
if check_emulator avd
|
41
|
+
kill_emulator uuid
|
42
|
+
@pid = spawn("$ANDROID_HOME/tools/emulator -avd #{avd} -port #{port} &", :out=>"/dev/null")
|
43
|
+
#%x(adb -s #{uuid} wait-for-device)
|
44
|
+
start = Time.now
|
45
|
+
until emulators_booted?
|
46
|
+
sleep 1
|
47
|
+
if Time.now - start > 30
|
48
|
+
puts "\nEmulator #{uuid} failed to boot within 30 seconds. Aborting run....".red
|
49
|
+
puts "Check Emulator: #{uuid}\n".red
|
50
|
+
abort
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def kill_emulator emulator
|
58
|
+
system("adb -s #{emulator} emu kill >> /dev/null 2>&1")
|
59
|
+
end
|
60
|
+
|
61
|
+
def running_emulators
|
62
|
+
(`adb devices`).scan(/\n(.*)\t/).flatten.select { |d| d.include? "emulator" }
|
63
|
+
end
|
64
|
+
|
65
|
+
def emulator_running?
|
66
|
+
running_emulators.include? uuid
|
67
|
+
end
|
68
|
+
|
69
|
+
def kill_all_emulators
|
70
|
+
emulators = running_emulators
|
71
|
+
emulators.delete uuid
|
72
|
+
if emulators.any?
|
73
|
+
puts "\nKilling all emulators...\n"
|
74
|
+
emulators.each { |emulator| kill_emulator emulator }
|
75
|
+
sleep 5
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
###End Emulator methods
|
80
|
+
|
81
|
+
def devices
|
82
|
+
(`adb devices`).scan(/\n(.*)\t/).flatten
|
83
|
+
end
|
84
|
+
|
85
|
+
def devices_connected?
|
86
|
+
devices.any?
|
87
|
+
end
|
88
|
+
|
89
|
+
def check_for_devices
|
90
|
+
unless devices_connected?
|
91
|
+
puts "\nNo Devices Connected or Authorized!!!\nMake sure at least one device (emulator/simulator) is connected!\n".red
|
92
|
+
abort
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def check_uuid uuid
|
97
|
+
if devices_connected?
|
98
|
+
if devices.include? uuid
|
99
|
+
true
|
100
|
+
else
|
101
|
+
puts "\nINVALID OR NIL UUID: #{avd}\nAvailable Devices: #{devices}\n".red
|
102
|
+
puts "Example: -u #{devices.sample}\nAborting...".red
|
103
|
+
abort
|
104
|
+
end
|
105
|
+
else
|
106
|
+
false
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def get_device_data uuid
|
111
|
+
specs = {
|
112
|
+
os: "ro.build.version.release",
|
113
|
+
manufacturer: "ro.product.manufacturer",
|
114
|
+
model: "ro.product.model",
|
115
|
+
sdk: "ro.build.version.sdk"
|
116
|
+
}
|
117
|
+
hash = {}
|
118
|
+
specs.each do |key, spec|
|
119
|
+
value = `adb -s #{uuid} shell getprop "#{spec}"`.strip
|
120
|
+
hash.merge!({key=> "#{value}"})
|
121
|
+
end
|
122
|
+
hash.merge!({platform: "android", uuid: uuid, resolution: nil, process: Parallel.worker_number})
|
123
|
+
end
|
124
|
+
|
125
|
+
def app_size
|
126
|
+
(`wc -c <#{caps[:app]}`).strip
|
127
|
+
end
|
128
|
+
|
129
|
+
def get_app_data
|
130
|
+
data = ApkXml.new caps[:app]
|
131
|
+
data.parse_xml("AndroidManifest.xml", false, true)
|
132
|
+
manifest = data.xml_elements[0].attributes
|
133
|
+
package = manifest.find {|x| x.name == "package" }["value"].strip
|
134
|
+
version = manifest.find {|x| x.name == "versionName" }["value"].strip
|
135
|
+
{ package: package, version: version }
|
136
|
+
end
|
137
|
+
|
138
|
+
def app_and_device_data uuid
|
139
|
+
app_data = get_app_data
|
140
|
+
if cloud
|
141
|
+
device_data = {
|
142
|
+
uuid: "#{cloud_service}-#{uuid}",
|
143
|
+
deviceName: "#{caps[:deviceName].gsub(' ','_')}",
|
144
|
+
os: caps[:platformVersion],
|
145
|
+
manufacturer: "unknown",
|
146
|
+
model: "unknown",
|
147
|
+
sdk: "unknown",
|
148
|
+
resolution: nil,
|
149
|
+
process: Parallel.worker_number
|
150
|
+
}
|
151
|
+
else
|
152
|
+
device_data = get_device_data(uuid).merge!(deviceName: "#{caps[:deviceName].gsub(' ','_')}")
|
153
|
+
end
|
154
|
+
{
|
155
|
+
app_package: app_data[:package],
|
156
|
+
app_version: app_data[:version],
|
157
|
+
app_size: app_size,
|
158
|
+
device: device_data
|
159
|
+
}
|
160
|
+
end
|
161
|
+
end
|
@@ -0,0 +1,209 @@
|
|
1
|
+
require 'curb'
|
2
|
+
require 'toml-rb'
|
3
|
+
require 'colorize'
|
4
|
+
require 'pry'
|
5
|
+
require 'redic'
|
6
|
+
require 'highline'
|
7
|
+
|
8
|
+
class CommonSetup
|
9
|
+
|
10
|
+
attr_accessor :redis, :cli
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
self.redis = Redic.new
|
14
|
+
self.cli = HighLine.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def kill_process process
|
18
|
+
`ps -ef | grep #{process} | awk '{print $2}' | xargs kill >> /dev/null 2>&1`
|
19
|
+
end
|
20
|
+
|
21
|
+
def kill_processes process
|
22
|
+
pids = (`ps -ef | grep #{process} | awk '{print $2}'`).split("\n")
|
23
|
+
pids.each { |pid| `kill -9 #{pid} >> /dev/null 2>&1` }
|
24
|
+
end
|
25
|
+
|
26
|
+
def wait_for_appium_server port
|
27
|
+
loop.with_index do |_, count|
|
28
|
+
break if `lsof -i:#{port}`.to_s.length != 0
|
29
|
+
if count * 5 > 30
|
30
|
+
fail "Invoke Appium server timed out"
|
31
|
+
end
|
32
|
+
sleep 5
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def start_appium_server process, reset_session, device, date_dir
|
37
|
+
process = process
|
38
|
+
port = "472#{process}".to_i
|
39
|
+
bp = "225#{process}".to_i
|
40
|
+
appium_log = "./output/#{date_dir}/appium-#{process}.log"
|
41
|
+
pid = spawn("appium #{reset_session} --port #{port} -bp #{bp} #{device} --log #{appium_log} --device-ready-timeout 60 --tmp /tmp/#{process}", :out=>"/dev/null")
|
42
|
+
wait_for_appium_server port
|
43
|
+
{ appium_pid: pid, appium_port: port, appium_log: appium_log }
|
44
|
+
end
|
45
|
+
|
46
|
+
def clear_redis
|
47
|
+
puts "\nClearing Redis DB..\n"
|
48
|
+
redis.call "FLUSHALL"
|
49
|
+
end
|
50
|
+
|
51
|
+
def prep_environment
|
52
|
+
kill_processes "appium"
|
53
|
+
kill_processes "logcat"
|
54
|
+
clear_redis
|
55
|
+
end
|
56
|
+
|
57
|
+
def cleanup_screenshots
|
58
|
+
print_debug "Cleaning files in: #{dir}"
|
59
|
+
#add ruby remove dir method
|
60
|
+
`rm -rf #{dir}/*`
|
61
|
+
end
|
62
|
+
|
63
|
+
def create_output_directory name, time
|
64
|
+
Dir.mkdir name unless File.exists? name
|
65
|
+
output_dir_base = "#{name}/#{time}"
|
66
|
+
Dir.mkdir output_dir_base unless File.exists? output_dir_base
|
67
|
+
return output_dir_base
|
68
|
+
end
|
69
|
+
|
70
|
+
def create_directories dir_data
|
71
|
+
start_dir = Dir.pwd
|
72
|
+
Dir.mkdir "output" unless File.exists? "output"
|
73
|
+
Dir.chdir "output"
|
74
|
+
dir_data.each do |d|
|
75
|
+
Dir.mkdir d unless File.exists? d
|
76
|
+
Dir.chdir d
|
77
|
+
end
|
78
|
+
dir = Dir.pwd
|
79
|
+
Dir.chdir start_dir
|
80
|
+
dir
|
81
|
+
end
|
82
|
+
|
83
|
+
def format_options options
|
84
|
+
config = TomlRB.load_file(options[:config], symbolize_keys: true)
|
85
|
+
app_caps = config[:caps]
|
86
|
+
app_caps[:orientation] = options[:orientation].to_s.upcase #make sure orientation is always an upcased string...
|
87
|
+
app_caps[:platform] = app_caps[:platform].downcase #make sure platform is always downcased...
|
88
|
+
|
89
|
+
if options[:cloud] #get cloud device capabilities
|
90
|
+
cloud_caps = TomlRB.load_file(config[:cloud][:caps_path], symbolize_keys: true)
|
91
|
+
app = upload_app_to_cloud(config)
|
92
|
+
cloud_caps[:common_caps][:cloud_app] = app
|
93
|
+
app_caps.delete(:deviceName)
|
94
|
+
caps = cloud_caps.map { |device_caps| { caps: device_caps[1].merge!(cloud_caps[:common_caps]).merge!(app_caps) } if device_caps.to_s.include? "Device" }.compact
|
95
|
+
capabilities = caps.each { |cap| cap.merge!({:appium_lib=>cloud_caps[:appium_lib], :wait=> 0}) }
|
96
|
+
else #get local device capabilities
|
97
|
+
if options[:emulator]
|
98
|
+
emulators = options[:emulator].join.split
|
99
|
+
emulator_caps = emulators.map do |emulator|
|
100
|
+
{ caps: app_caps }.merge!(avd: emulator).merge!({:appium_lib=>{:server_url=>app_caps[:url], :wait=> 0}})
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
if options[:uuid]
|
105
|
+
devices = options[:uuid].join.split
|
106
|
+
device_caps = devices.map do |device|
|
107
|
+
{ caps: app_caps }.merge!(udid: device).merge!({:appium_lib=>{:server_url=>app_caps[:url], :wait=> 0}})
|
108
|
+
end
|
109
|
+
end
|
110
|
+
capabilities = [emulator_caps, device_caps].compact.flatten
|
111
|
+
end
|
112
|
+
|
113
|
+
#convert language string to array. e.g. -l "en fr de" -> ["en", "fr", "de"]
|
114
|
+
options[:language] = options[:language].join.split unless options[:mode] == "monkey"
|
115
|
+
|
116
|
+
#Load App Activities
|
117
|
+
#TODO: Figure out out to parse iOS app activities.
|
118
|
+
if app_caps[:platform] == 'android'
|
119
|
+
activities = get_android_activities app_caps[:app], app_caps[:appPackage]
|
120
|
+
load_activities activities
|
121
|
+
elsif app_caps[:platform] == 'ios'
|
122
|
+
#placeholder for ios activities
|
123
|
+
end
|
124
|
+
|
125
|
+
{ activities: activities, options: options, config: config, caps: capabilities }
|
126
|
+
end
|
127
|
+
|
128
|
+
def add_activity activity
|
129
|
+
redis.call "LPUSH", "activities", activity
|
130
|
+
end
|
131
|
+
|
132
|
+
def load_activities activities
|
133
|
+
puts "\nApp Activities: "
|
134
|
+
ap activities
|
135
|
+
activities.each { |a| add_activity a }
|
136
|
+
puts "\n"
|
137
|
+
end
|
138
|
+
|
139
|
+
def get_android_activities app, package
|
140
|
+
data = ApkXml.new app
|
141
|
+
data.parse_xml("AndroidManifest.xml", false, true)
|
142
|
+
activities = []
|
143
|
+
data.xml_elements.each do |x|
|
144
|
+
x.attributes.each do |y|
|
145
|
+
activities << y.value if y.value.include? "Activity"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
activities.find_all { |x| x.include? package }.uniq
|
149
|
+
activities.map { |x| x.gsub(package, "") }.uniq
|
150
|
+
end
|
151
|
+
|
152
|
+
def report_dir
|
153
|
+
"#{Dir.pwd}/runs"
|
154
|
+
end
|
155
|
+
|
156
|
+
def get_run_reports package_name
|
157
|
+
runs = Dir.glob("#{report_dir}/*").find_all { |r| r.include? package_name }
|
158
|
+
runs.sort_by { |r| r.match(/#{report_dir}\/(.*)d*-/)[1].split("-")[0] }
|
159
|
+
end
|
160
|
+
|
161
|
+
def select_run package_name
|
162
|
+
reports = get_run_reports(package_name)
|
163
|
+
puts ""
|
164
|
+
cli.choose do |menu|
|
165
|
+
menu.prompt = "Please Choose a Test Run: "
|
166
|
+
menu.choices(*reports) do |chosen|
|
167
|
+
puts "\nTest Chosen: #{chosen}\n".yellow
|
168
|
+
return chosen
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def symbolize(obj)
|
174
|
+
return obj.reduce({}) do |memo, (k, v)|
|
175
|
+
memo.tap { |m| m[k.to_sym] = symbolize(v) }
|
176
|
+
end if obj.is_a? Hash
|
177
|
+
|
178
|
+
return obj.reduce([]) do |memo, v|
|
179
|
+
memo << symbolize(v); memo
|
180
|
+
end if obj.is_a? Array
|
181
|
+
|
182
|
+
obj
|
183
|
+
end
|
184
|
+
|
185
|
+
def upload_app_to_cloud config
|
186
|
+
if !config[:cloud][:service] == "saucelabs"
|
187
|
+
puts "\nCurrently only Sauce Labs ('saucelabs') is supported\n".red
|
188
|
+
abort
|
189
|
+
end
|
190
|
+
app = config[:caps][:zippedApp]
|
191
|
+
filename = File.basename(app)
|
192
|
+
puts "Uploading App to Sauce Labs: #{app}"
|
193
|
+
url = "https://saucelabs.com/rest/v1/storage/#{config[:cloud][:user]}/#{filename}?overwrite=true"
|
194
|
+
c = Curl::Easy.new(url)
|
195
|
+
c.http_auth_types = :basic
|
196
|
+
c.username = config[:cloud][:user]
|
197
|
+
c.password = config[:cloud][:key]
|
198
|
+
c.multipart_form_post = true
|
199
|
+
c.http_post(Curl::PostField.file("@#{app}", app))
|
200
|
+
if c.status == "200 OK"
|
201
|
+
puts "\nFile Upload Status Code: #{c.status}"
|
202
|
+
puts "Cloud App: sauce-storage:#{filename}\n"
|
203
|
+
"sauce-storage:#{filename}"
|
204
|
+
else
|
205
|
+
puts "\n#{app}: File did not upload successfully.\nFile Upload Status Code: #{c.status}\nAborting...\n".red
|
206
|
+
abort
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
//Open in Firefox... or create http-server > https://stackoverflow.com/questions/20041656/xmlhttprequest-cannot-load-file-cross-origin-requests-are-only-supported-for-ht
|
2
|
+
!!!
|
3
|
+
%html
|
4
|
+
%head
|
5
|
+
%meta{charset: 'UTF-8'}
|
6
|
+
%script{type: 'text/javascript', src: 'https://www.google.com/jsapi'}
|
7
|
+
%script{type: 'text/javascript', src: 'https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'}
|
8
|
+
:javascript
|
9
|
+
google.load('visualization', '1', {'packages':['corechart']});
|
10
|
+
|
11
|
+
// Set a callback to run when the Google Visualization API is loaded.
|
12
|
+
google.setOnLoadCallback(drawChart);
|
13
|
+
|
14
|
+
function drawChart() {
|
15
|
+
var jsonData = $.ajax({
|
16
|
+
url: data_path(),
|
17
|
+
dataType:"json",
|
18
|
+
async: false
|
19
|
+
}).responseText;
|
20
|
+
|
21
|
+
// Create our data table out of JSON data loaded from server.
|
22
|
+
var data = new google.visualization.DataTable(jsonData);
|
23
|
+
|
24
|
+
var options = {
|
25
|
+
title: "#{title}",
|
26
|
+
width: #{graph_settings[:width]},
|
27
|
+
height: #{graph_settings[:height]},
|
28
|
+
pointSize: 15,
|
29
|
+
pointShape: { type: 'triangle', rotation: 180 },
|
30
|
+
hAxis: {title: 'Time', titleTextStyle: {color: '#333'}, slantedText:true, slantedTextAngle:80},
|
31
|
+
vAxis: {minValue: 0},
|
32
|
+
explorer: { actions: ['dragToZoom', 'rightClickToReset'], axis: 'horizontal', keepInBounds: true, maxZoomIn: 4.0},
|
33
|
+
tooltip:{isHtml:true}
|
34
|
+
};
|
35
|
+
|
36
|
+
// Instantiate and draw our chart, passing in some options.
|
37
|
+
var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
|
38
|
+
chart.draw(data, options);
|
39
|
+
}
|
40
|
+
|
41
|
+
function data_path() {
|
42
|
+
return '#{data_file_path}';
|
43
|
+
}
|
44
|
+
|
45
|
+
%title #{title}
|
46
|
+
%body
|
47
|
+
%h1 #{header1}
|
48
|
+
%div{id: 'chart_div'}
|
metadata
ADDED
@@ -0,0 +1,354 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: aaet
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- isonic1
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-06-23 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.13'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.13'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: commander
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: awesome_print
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: colorize
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: faker
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: os
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: pry
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: redic
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 1.5.0
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 1.5.0
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: apktools
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 0.7.1
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 0.7.1
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: parallel
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 1.9.0
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 1.9.0
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: eyes_selenium
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - '='
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: 3.10.1
|
188
|
+
type: :runtime
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - '='
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: 3.10.1
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: tilt
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - ">="
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
type: :runtime
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - ">="
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: haml
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - ">="
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '0'
|
216
|
+
type: :runtime
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - ">="
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '0'
|
223
|
+
- !ruby/object:Gem::Dependency
|
224
|
+
name: curb
|
225
|
+
requirement: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - ">="
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '0'
|
230
|
+
type: :runtime
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
requirements:
|
234
|
+
- - ">="
|
235
|
+
- !ruby/object:Gem::Version
|
236
|
+
version: '0'
|
237
|
+
- !ruby/object:Gem::Dependency
|
238
|
+
name: httparty
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
240
|
+
requirements:
|
241
|
+
- - ">="
|
242
|
+
- !ruby/object:Gem::Version
|
243
|
+
version: '0'
|
244
|
+
type: :runtime
|
245
|
+
prerelease: false
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
247
|
+
requirements:
|
248
|
+
- - ">="
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: '0'
|
251
|
+
- !ruby/object:Gem::Dependency
|
252
|
+
name: toml-rb
|
253
|
+
requirement: !ruby/object:Gem::Requirement
|
254
|
+
requirements:
|
255
|
+
- - ">="
|
256
|
+
- !ruby/object:Gem::Version
|
257
|
+
version: '0'
|
258
|
+
type: :runtime
|
259
|
+
prerelease: false
|
260
|
+
version_requirements: !ruby/object:Gem::Requirement
|
261
|
+
requirements:
|
262
|
+
- - ">="
|
263
|
+
- !ruby/object:Gem::Version
|
264
|
+
version: '0'
|
265
|
+
- !ruby/object:Gem::Dependency
|
266
|
+
name: appium_lib
|
267
|
+
requirement: !ruby/object:Gem::Requirement
|
268
|
+
requirements:
|
269
|
+
- - ">="
|
270
|
+
- !ruby/object:Gem::Version
|
271
|
+
version: '0'
|
272
|
+
type: :runtime
|
273
|
+
prerelease: false
|
274
|
+
version_requirements: !ruby/object:Gem::Requirement
|
275
|
+
requirements:
|
276
|
+
- - ">="
|
277
|
+
- !ruby/object:Gem::Version
|
278
|
+
version: '0'
|
279
|
+
- !ruby/object:Gem::Dependency
|
280
|
+
name: jsonpath
|
281
|
+
requirement: !ruby/object:Gem::Requirement
|
282
|
+
requirements:
|
283
|
+
- - ">="
|
284
|
+
- !ruby/object:Gem::Version
|
285
|
+
version: '0'
|
286
|
+
type: :runtime
|
287
|
+
prerelease: false
|
288
|
+
version_requirements: !ruby/object:Gem::Requirement
|
289
|
+
requirements:
|
290
|
+
- - ">="
|
291
|
+
- !ruby/object:Gem::Version
|
292
|
+
version: '0'
|
293
|
+
description: A CLI to collect metadata about an applicaton on every run from the command
|
294
|
+
line
|
295
|
+
email:
|
296
|
+
- justin.ison@gmail.com
|
297
|
+
executables:
|
298
|
+
- aaet
|
299
|
+
extensions: []
|
300
|
+
extra_rdoc_files: []
|
301
|
+
files:
|
302
|
+
- CODE_OF_CONDUCT.md
|
303
|
+
- Gemfile
|
304
|
+
- Gemfile.lock
|
305
|
+
- LICENSE
|
306
|
+
- README.md
|
307
|
+
- Rakefile
|
308
|
+
- aaet.gemspec
|
309
|
+
- bin/aaet
|
310
|
+
- bin/console
|
311
|
+
- bin/setup
|
312
|
+
- generate_reports.rb
|
313
|
+
- lib/aaet.rb
|
314
|
+
- lib/aaet/android/android.rb
|
315
|
+
- lib/aaet/android/parser.rb
|
316
|
+
- lib/aaet/common/applitools.rb
|
317
|
+
- lib/aaet/common/common_methods.rb
|
318
|
+
- lib/aaet/common/locators.rb
|
319
|
+
- lib/aaet/common/redis.rb
|
320
|
+
- lib/aaet/ios/ios.rb
|
321
|
+
- lib/aaet/ios/parser.rb
|
322
|
+
- lib/version.rb
|
323
|
+
- run.rb
|
324
|
+
- setup/android_setup_methods.rb
|
325
|
+
- setup/common_setup_methods.rb
|
326
|
+
- setup/ios_setup_methods.rb
|
327
|
+
- template_google_api_format.haml
|
328
|
+
homepage: https://github.com/isonic1/Appium-Native-Crawler
|
329
|
+
licenses:
|
330
|
+
- Apache-2.0
|
331
|
+
metadata:
|
332
|
+
allowed_push_host: https://rubygems.org
|
333
|
+
post_install_message:
|
334
|
+
rdoc_options: []
|
335
|
+
require_paths:
|
336
|
+
- lib
|
337
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
338
|
+
requirements:
|
339
|
+
- - ">="
|
340
|
+
- !ruby/object:Gem::Version
|
341
|
+
version: '0'
|
342
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
343
|
+
requirements:
|
344
|
+
- - ">="
|
345
|
+
- !ruby/object:Gem::Version
|
346
|
+
version: '0'
|
347
|
+
requirements: []
|
348
|
+
rubyforge_project:
|
349
|
+
rubygems_version: 2.6.14.1
|
350
|
+
signing_key:
|
351
|
+
specification_version: 4
|
352
|
+
summary: A CLI to crawl native mobile Android applications with Appium on Devices,
|
353
|
+
Emulators & Cloud Serivces
|
354
|
+
test_files: []
|