appium_lib 0.16.0 → 0.17.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 +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
|