appium_lib 0.16.0 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/appium_lib.gemspec +2 -1
- data/docs/android_docs.md +120 -120
- data/docs/api_19_webview.md +49 -0
- data/docs/ios_docs.md +124 -124
- data/lib/appium_lib.rb +1 -1
- data/lib/appium_lib/android/webview/javascript.rb +76 -0
- data/lib/appium_lib/android/webview/webview.rb +105 -0
- data/lib/appium_lib/common/version.rb +2 -2
- data/lib/appium_lib/driver.rb +27 -21
- data/release_notes.md +6 -0
- metadata +29 -12
data/lib/appium_lib.rb
CHANGED
@@ -0,0 +1,76 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Appium; end # fix module not defined
|
3
|
+
module Android; end
|
4
|
+
module Appium::Android::Webview
|
5
|
+
class << self
|
6
|
+
# firstEmailInput().value = 'example';
|
7
|
+
# firstPasswordInput().value = 'example'
|
8
|
+
# firstSubmitElement().click();
|
9
|
+
|
10
|
+
# todo: prevent namespace pollution
|
11
|
+
# AppiumWebview = { 'ok': function() { return 'ok'; }, 'ok2': function() { return self.ok(); } }
|
12
|
+
|
13
|
+
def javascript
|
14
|
+
@javascript_webview_helpers ||= <<-'JS'
|
15
|
+
function firstTagWithTypeOrName(targetTag, targetType, targetName) {
|
16
|
+
var inputs = document.getElementsByTagName(targetTag);
|
17
|
+
var inputsLength = inputs.length;
|
18
|
+
var target = null;
|
19
|
+
|
20
|
+
var targetNames = [];
|
21
|
+
if (targetName) targetNames = targetName.split(",");
|
22
|
+
|
23
|
+
for (var i = 0; i < inputsLength; i++) {
|
24
|
+
var input = inputs[i];
|
25
|
+
|
26
|
+
if (targetType) {
|
27
|
+
var type = input.type;
|
28
|
+
var hasType = typeof type !== "undefined";
|
29
|
+
if (hasType && type.trim().toLowerCase() === targetType) {
|
30
|
+
target = input;
|
31
|
+
break;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
// type only search will have undefined targetName.
|
36
|
+
if (targetName) {
|
37
|
+
var name = input.name;
|
38
|
+
var hasName = typeof name !== "undefined";
|
39
|
+
if (hasName && targetNames.indexOf(name.trim().toLowerCase()) !== -1) {
|
40
|
+
target = input;
|
41
|
+
break;
|
42
|
+
}
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
return target;
|
47
|
+
}
|
48
|
+
|
49
|
+
function firstInputWithTypeOrName(targetType, targetName) {
|
50
|
+
return firstTagWithTypeOrName('input', targetType, targetName);
|
51
|
+
}
|
52
|
+
|
53
|
+
function firstEmailInput() {
|
54
|
+
return firstInputWithTypeOrName('email', 'id,username');
|
55
|
+
}
|
56
|
+
|
57
|
+
function firstPasswordInput() {
|
58
|
+
return firstInputWithTypeOrName('password', 'password');
|
59
|
+
}
|
60
|
+
|
61
|
+
// yahoo uses a submit button
|
62
|
+
function firstSubmitElement() {
|
63
|
+
return firstTagWithTypeOrName('button', 'submit', 'submit') ||
|
64
|
+
firstTagWithTypeOrName('input', 'submit', 'submit') ||
|
65
|
+
firstTagWithTypeOrName('a', 'submit', 'submit');
|
66
|
+
}
|
67
|
+
|
68
|
+
// yahoo authorize link
|
69
|
+
// <a type="submit"
|
70
|
+
function firstAuthElement() {
|
71
|
+
return firstTagWithTypeOrName('a', 'submit');
|
72
|
+
}
|
73
|
+
JS
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# system requires
|
3
|
+
require 'net/http'
|
4
|
+
|
5
|
+
# 3rd party gems
|
6
|
+
require 'rubygems'
|
7
|
+
require 'json'
|
8
|
+
require 'posix/spawn'
|
9
|
+
require 'webkit_remote' # https://github.com/pwnall/webkit_remote/
|
10
|
+
|
11
|
+
module Appium; end # fix module not defined
|
12
|
+
module Android; end
|
13
|
+
module Appium::Android::Webview
|
14
|
+
class << self
|
15
|
+
# @private
|
16
|
+
def adb_cmd cmd
|
17
|
+
_pid, _in, _out, _err = POSIX::Spawn::popen4 cmd, {:err => [:child, :out]}
|
18
|
+
_in.close
|
19
|
+
|
20
|
+
output = ''
|
21
|
+
|
22
|
+
begin
|
23
|
+
Process.waitpid _pid
|
24
|
+
output = _out.read
|
25
|
+
[_out, _err].each { |io| io.close unless io.nil? || io.closed? }
|
26
|
+
rescue # no such process
|
27
|
+
end
|
28
|
+
|
29
|
+
output
|
30
|
+
end
|
31
|
+
|
32
|
+
# @private
|
33
|
+
# returns nil if not found
|
34
|
+
def package_to_pid package
|
35
|
+
# USER PID PPID VSIZE RSS WCHAN PC NAME
|
36
|
+
# use detect to return the first match
|
37
|
+
ps = adb_cmd('adb shell ps').split("\r\n").detect { |l| l.split(' ').last == package }
|
38
|
+
ps ? ps.split(' ')[1].to_i : nil # return pid
|
39
|
+
end
|
40
|
+
|
41
|
+
# @private
|
42
|
+
# 1 pid may have many webviews. The path remains the same
|
43
|
+
#
|
44
|
+
#["00000000: 00000002 00000000 00010000 0001 01 4716 @webview_devtools_remote_1597",
|
45
|
+
# "00000000: 00000003 00000000 00000000 0001 03 55080 @webview_devtools_remote_1597",
|
46
|
+
# "00000000: 00000003 00000000 00000000 0001 03 55078 @webview_devtools_remote_1597"]
|
47
|
+
#
|
48
|
+
# returns nil if not found
|
49
|
+
def pid_to_webview pid
|
50
|
+
return nil if pid.nil?
|
51
|
+
# Num RefCount Protocol Flags Type St Inode Path
|
52
|
+
cat_proc = adb_cmd 'adb shell cat /proc/net/unix'
|
53
|
+
pid_webview = "@webview_devtools_remote_#{pid}"
|
54
|
+
found = cat_proc.split("\r\n").detect { |l| l.include?(pid_webview) }
|
55
|
+
# must remove '@' prefix for use with adb forward command
|
56
|
+
found ? found.split(' ').last.sub('@', '') : nil
|
57
|
+
end
|
58
|
+
|
59
|
+
# @private
|
60
|
+
# connect_to_webview package: 'com.example.Package'
|
61
|
+
def connect_to_webview opts={}
|
62
|
+
package = opts[:package]
|
63
|
+
raise 'Must provide package' unless package
|
64
|
+
port = opts.fetch :port, 9000
|
65
|
+
|
66
|
+
unix_socket = pid_to_webview package_to_pid 'com.litl.Woven'
|
67
|
+
raise 'No webview found' unless unix_socket
|
68
|
+
adb_cmd "adb forward tcp:#{port} localabstract:#{unix_socket}"
|
69
|
+
end
|
70
|
+
|
71
|
+
# @public
|
72
|
+
#
|
73
|
+
# ```ruby
|
74
|
+
# webview = Appium::Android::Webview.attach_to_tab package: 'com.example.Package', url: 'yahoo.com/'
|
75
|
+
# webview.location
|
76
|
+
# webview.client
|
77
|
+
# webview.client.remote_eval Appium::Android::Webview.javascript
|
78
|
+
# ```
|
79
|
+
#
|
80
|
+
# port: is optional.
|
81
|
+
#
|
82
|
+
# can't be called more than once.
|
83
|
+
#
|
84
|
+
# returns URL of connected tab.
|
85
|
+
def attach_to_tab opts={}
|
86
|
+
connect_to_webview package: opts[:package]
|
87
|
+
target_url = opts[:url]
|
88
|
+
raise 'Must provide :url' unless target_url
|
89
|
+
port = opts.fetch(:port, 9000)
|
90
|
+
|
91
|
+
# webkit_remote defaults to using the last tab.
|
92
|
+
# The browser may have many tabs and the last tab is not always correct.
|
93
|
+
# Detect the tab by inspecting the URL.
|
94
|
+
# https://github.com/pwnall/webkit_remote/blob/590bfd3ace098f2b75d1a07651f36f4392109a23/lib/webkit_remote/top_level.rb#L30
|
95
|
+
browser = WebkitRemote::Browser.new host: 'localhost', port: port
|
96
|
+
target_tab = browser.tabs.detect { |tab| tab.url.include?(target_url) }
|
97
|
+
|
98
|
+
client = WebkitRemote::Client.new tab: target_tab, close_browser: true
|
99
|
+
document_location = client.remote_eval 'document.location.toString()'
|
100
|
+
client.clear_all
|
101
|
+
|
102
|
+
OpenStruct.new( client: client, location: document_location )
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Appium
|
3
3
|
# Version and Date are defined on the 'Appium' module, not 'Appium::Common'
|
4
|
-
VERSION = '0.
|
5
|
-
DATE = '2014-01-
|
4
|
+
VERSION = '0.17.0' unless defined? ::Appium::VERSION
|
5
|
+
DATE = '2014-01-22' unless defined? ::Appium::DATE
|
6
6
|
end
|
data/lib/appium_lib/driver.rb
CHANGED
@@ -129,27 +129,29 @@ module Appium
|
|
129
129
|
require 'selenium-webdriver'
|
130
130
|
|
131
131
|
# common
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
132
|
+
require_relative 'common/helper'
|
133
|
+
require_relative 'common/patch'
|
134
|
+
require_relative 'common/version'
|
135
|
+
require_relative 'common/element/button'
|
136
|
+
require_relative 'common/element/text'
|
137
|
+
require_relative 'common/element/window'
|
138
138
|
|
139
139
|
# ios
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
140
|
+
require_relative 'ios/helper'
|
141
|
+
require_relative 'ios/patch'
|
142
|
+
require_relative 'ios/element/alert'
|
143
|
+
require_relative 'ios/element/generic'
|
144
|
+
require_relative 'ios/element/textfield'
|
145
145
|
|
146
146
|
# android
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
147
|
+
require_relative 'android/dynamic'
|
148
|
+
require_relative 'android/helper'
|
149
|
+
require_relative 'android/patch'
|
150
|
+
require_relative 'android/element/alert'
|
151
|
+
require_relative 'android/element/generic'
|
152
|
+
require_relative 'android/element/textfield'
|
153
|
+
require_relative 'android/webview/javascript'
|
154
|
+
require_relative 'android/webview/webview'
|
153
155
|
|
154
156
|
def self.promote_singleton_appium_methods main_module
|
155
157
|
raise 'Driver is nil' if $driver.nil?
|
@@ -250,12 +252,16 @@ module Appium
|
|
250
252
|
# quit last driver
|
251
253
|
$driver.driver_quit if $driver
|
252
254
|
opts = {} if opts.nil?
|
255
|
+
tmp_opts = {}
|
256
|
+
|
253
257
|
# convert to downcased symbols
|
254
|
-
opts.each_pair { |k,v|
|
258
|
+
opts.each_pair { |k,v| tmp_opts[k.to_s.downcase.strip.intern] = v }
|
259
|
+
opts = tmp_opts
|
255
260
|
|
256
261
|
@custom_url = opts.fetch :server_url, false
|
257
262
|
|
258
263
|
@compress_xml = opts[:compress_xml] ? true : false
|
264
|
+
@fast_clear = opts[:fast_clear] ? true : false
|
259
265
|
|
260
266
|
@export_session = opts.fetch :export_session, false
|
261
267
|
|
@@ -296,7 +302,7 @@ module Appium
|
|
296
302
|
|
297
303
|
# :ios, :android, :selendroid
|
298
304
|
@device = opts.fetch :device, ENV['DEVICE'] || :ios
|
299
|
-
@device = @device.intern # device must be a symbol
|
305
|
+
@device = @device.to_s.downcase.intern # device must be a symbol
|
300
306
|
|
301
307
|
# load common methods
|
302
308
|
extend Appium::Common
|
@@ -377,7 +383,7 @@ module Appium
|
|
377
383
|
:'app-package' => @app_package,
|
378
384
|
:'app-activity' => @app_activity,
|
379
385
|
:'app-wait-activity' => @app_wait_activity || @app_activity,
|
380
|
-
fastClear:
|
386
|
+
fastClear: @fast_clear
|
381
387
|
}
|
382
388
|
end
|
383
389
|
|
@@ -627,4 +633,4 @@ end # end module Appium
|
|
627
633
|
# Paging in Pry is annoying :q required to exit.
|
628
634
|
# With pager disabled, the output is similar to IRB
|
629
635
|
# Only set if Pry is defined.
|
630
|
-
Pry.config.pager = false if defined?(Pry)
|
636
|
+
Pry.config.pager = false if defined?(Pry)
|
data/release_notes.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
#### v0.16.0 2014-01-09
|
2
|
+
|
3
|
+
- [b9264f6](https://github.com/appium/ruby_lib/commit/b9264f66b9dd04eb5221c3a4c4ea17c4eb9ef8aa) Release 0.16.0
|
4
|
+
- [18466ea](https://github.com/appium/ruby_lib/commit/18466eae986647b27e3dbb041c591ce2dbc972a2) Hide invisible elements in iOS page output
|
5
|
+
|
6
|
+
|
1
7
|
#### v0.15.2 2013-12-23
|
2
8
|
|
3
9
|
- [35b84fd](https://github.com/appium/ruby_lib/commit/35b84fd4a0dcf37fe136451c9bcfa936e1017023) Release 0.15.2
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appium_lib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- code@bootstraponline.com
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: selenium-webdriver
|
@@ -67,47 +67,61 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 0.0.4
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: posix-spawn
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ~>
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
76
|
-
type: :
|
75
|
+
version: 0.3.8
|
76
|
+
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
82
|
+
version: 0.3.8
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: webkit_remote
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - ~>
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.
|
89
|
+
version: 0.4.1
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.4.1
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 10.0.4
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
108
|
- - ~>
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.
|
110
|
+
version: 10.0.4
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
112
|
+
name: yard
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
115
|
- - ~>
|
102
116
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.3
|
117
|
+
version: 0.8.7.3
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
108
122
|
- - ~>
|
109
123
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.3
|
124
|
+
version: 0.8.7.3
|
111
125
|
description: Ruby library for Appium.
|
112
126
|
email:
|
113
127
|
- code@bootstraponline.com
|
@@ -121,6 +135,7 @@ files:
|
|
121
135
|
- Rakefile
|
122
136
|
- appium_lib.gemspec
|
123
137
|
- docs/android_docs.md
|
138
|
+
- docs/api_19_webview.md
|
124
139
|
- docs/docs.md
|
125
140
|
- docs/ios_docs.md
|
126
141
|
- docs_gen/docs_from_js.md
|
@@ -132,6 +147,8 @@ files:
|
|
132
147
|
- lib/appium_lib/android/element/textfield.rb
|
133
148
|
- lib/appium_lib/android/helper.rb
|
134
149
|
- lib/appium_lib/android/patch.rb
|
150
|
+
- lib/appium_lib/android/webview/javascript.rb
|
151
|
+
- lib/appium_lib/android/webview/webview.rb
|
135
152
|
- lib/appium_lib/common/element/button.rb
|
136
153
|
- lib/appium_lib/common/element/text.rb
|
137
154
|
- lib/appium_lib/common/element/window.rb
|