aaet 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|