appium_lib 0.19.1 → 0.21.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/Rakefile +4 -1
- data/appium_lib.gemspec +8 -9
- data/docs/android_docs.md +120 -148
- data/docs/ios_docs.md +125 -125
- data/lib/appium_lib/common/patch.rb +13 -3
- data/lib/appium_lib/common/version.rb +2 -2
- data/lib/appium_lib/driver.rb +0 -4
- data/lib/appium_lib/ios/element/generic.rb +2 -2
- data/lib/appium_lib/ios/patch.rb +3 -3
- data/readme.md +3 -0
- data/release_notes.md +24 -0
- metadata +62 -36
- data/lib/appium_lib/android/webview/javascript.rb +0 -76
- data/lib/appium_lib/android/webview/webview.rb +0 -105
@@ -49,10 +49,20 @@ module Appium::Common
|
|
49
49
|
# https://github.com/appium/appium/wiki/Automating-mobile-gestures
|
50
50
|
# @return [OpenStruct] the relative x, y in a struct. ex: { x: 0.50, y: 0.20 }
|
51
51
|
def location_rel
|
52
|
-
|
52
|
+
location = self.location
|
53
|
+
location_x = location.x.to_f
|
54
|
+
location_y = location.y.to_f
|
55
|
+
|
56
|
+
size = self.size
|
57
|
+
size_width = size.width.to_f
|
58
|
+
size_height = size.height.to_f
|
59
|
+
|
60
|
+
center_x = location_x + (size_width / 2.0)
|
61
|
+
center_y = location_y + (size_height / 2.0)
|
62
|
+
|
53
63
|
w = $driver.window_size
|
54
|
-
OpenStruct.new( x: "#{
|
55
|
-
y: "#{
|
64
|
+
OpenStruct.new( x: "#{center_x} / #{w.width.to_f}",
|
65
|
+
y: "#{center_y} / #{w.height.to_f}" )
|
56
66
|
end
|
57
67
|
end
|
58
68
|
end # module Appium::Common
|
@@ -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-
|
4
|
+
VERSION = '0.21.0' unless defined? ::Appium::VERSION
|
5
|
+
DATE = '2014-03-13' unless defined? ::Appium::DATE
|
6
6
|
end
|
data/lib/appium_lib/driver.rb
CHANGED
@@ -148,8 +148,6 @@ module Appium
|
|
148
148
|
require_relative 'android/element/alert'
|
149
149
|
require_relative 'android/element/generic'
|
150
150
|
require_relative 'android/element/textfield'
|
151
|
-
require_relative 'android/webview/javascript'
|
152
|
-
require_relative 'android/webview/webview'
|
153
151
|
|
154
152
|
def self.promote_singleton_appium_methods main_module
|
155
153
|
raise 'Driver is nil' if $driver.nil?
|
@@ -324,8 +322,6 @@ module Appium
|
|
324
322
|
# load common methods
|
325
323
|
extend Appium::Common
|
326
324
|
if @device == 'Android'
|
327
|
-
raise 'APP_ACTIVITY must be set.' if @app_activity.nil?
|
328
|
-
|
329
325
|
# load Android specific methods
|
330
326
|
extend Appium::Android
|
331
327
|
else
|
@@ -42,7 +42,7 @@ module Appium::Ios
|
|
42
42
|
# @return [String] the completed JavaScript program
|
43
43
|
def first_ele_js predicate
|
44
44
|
(<<-JS).strip # remove trailing newline
|
45
|
-
au.mainApp.getFirstWithPredicateWeighted("#{predicate}");
|
45
|
+
au.mainApp().getFirstWithPredicateWeighted("#{predicate}");
|
46
46
|
JS
|
47
47
|
end
|
48
48
|
|
@@ -51,7 +51,7 @@ module Appium::Ios
|
|
51
51
|
# @return [String] the completed JavaScript program
|
52
52
|
def all_ele_js predicate
|
53
53
|
(<<-JS).strip # remove trailing newline
|
54
|
-
au.mainApp.getAllWithPredicate("#{predicate}");
|
54
|
+
au.mainApp().getAllWithPredicate("#{predicate}");
|
55
55
|
JS
|
56
56
|
end
|
57
57
|
|
data/lib/appium_lib/ios/patch.rb
CHANGED
@@ -30,13 +30,13 @@ Swiping inside the keyboard will not dismiss it.
|
|
30
30
|
# setValue will work, however the keyboard will never display
|
31
31
|
# because users are normally not allowed to type into it.
|
32
32
|
$driver.wait_true(5) do
|
33
|
-
$driver.execute_script %(au.mainApp.keyboard().type() !== 'UIAElementNil')
|
33
|
+
$driver.execute_script %(au.mainApp().keyboard().type() !== 'UIAElementNil')
|
34
34
|
end
|
35
35
|
|
36
36
|
# dismiss keyboard
|
37
37
|
js = <<-JS
|
38
|
-
if (au.mainApp.keyboard().type() !== "UIAElementNil") {
|
39
|
-
var startY = au.mainApp.keyboard().rect().origin.y - 10;
|
38
|
+
if (au.mainApp().keyboard().type() !== "UIAElementNil") {
|
39
|
+
var startY = au.mainApp().keyboard().rect().origin.y - 10;
|
40
40
|
var endY = au.mainWindow.rect().size.height - 10;
|
41
41
|
au.flickApp(0, startY, 0, endY);
|
42
42
|
}
|
data/readme.md
CHANGED
@@ -49,6 +49,9 @@ apk = {
|
|
49
49
|
Appium::Driver.new(apk).start_driver
|
50
50
|
|
51
51
|
# Define the methods on all objects.
|
52
|
+
# Note that this can also be scoped to limit the potential for conflicts.
|
53
|
+
# Example: Appium.promote_appium_methods ::Minitest::Spec
|
54
|
+
# Another alternative is to not promote at all. Instead access methods via $driver
|
52
55
|
Appium.promote_appium_methods Object
|
53
56
|
```
|
54
57
|
|
data/release_notes.md
CHANGED
@@ -1,3 +1,27 @@
|
|
1
|
+
#### v0.21.0 2014-03-13
|
2
|
+
|
3
|
+
- [db2df39](https://github.com/appium/ruby_lib/commit/db2df39eb6fc09e516e22334dd990699755c0509) Release 0.21.0
|
4
|
+
- [bf74d7a](https://github.com/appium/ruby_lib/commit/bf74d7a70c0f7cab8e4cb115d53d86c3720e2df3) Remove webview. Update gemspec
|
5
|
+
|
6
|
+
|
7
|
+
#### v0.20.0 2014-03-13
|
8
|
+
|
9
|
+
- [e79923f](https://github.com/appium/ruby_lib/commit/e79923f731c0f7ba85f280b512f5d82d365fd619) Release 0.20.0
|
10
|
+
- [9a6c6ea](https://github.com/appium/ruby_lib/commit/9a6c6eaf798938f8a483466e718e53483e3c0f02) Add bundle update to release rake task
|
11
|
+
- [093ba77](https://github.com/appium/ruby_lib/commit/093ba7712275b009d66146bcd9429ed9bf2f8d7f) Update readme.md
|
12
|
+
- [8dbe853](https://github.com/appium/ruby_lib/commit/8dbe853909a3a2691d3cc510d9751cfe8179dc76) Fix mainApp
|
13
|
+
- [347ae13](https://github.com/appium/ruby_lib/commit/347ae13cc78101875bb223fdfee97898f50a791b) Update readme.md
|
14
|
+
- [ba4d51c](https://github.com/appium/ruby_lib/commit/ba4d51c44329db8a849f59bfeedfa1eb99538d3a) Update location_rel to use center point
|
15
|
+
|
16
|
+
|
17
|
+
#### v0.19.1 2014-02-25
|
18
|
+
|
19
|
+
- [efa2e3f](https://github.com/appium/ruby_lib/commit/efa2e3feb74319a19d1fe3ef49d5a7fe3a2eb59a) Release 0.19.1
|
20
|
+
- [1aee2fc](https://github.com/appium/ruby_lib/commit/1aee2fcc5773cc92b1f83a80188f6cac50d2e206) Add android coverage cap
|
21
|
+
- [ccb213f](https://github.com/appium/ruby_lib/commit/ccb213f3866672f2be7ea526e6deb1656d497e6e) Update path logic
|
22
|
+
- [9772383](https://github.com/appium/ruby_lib/commit/97723833f1d888fa809d704801d98bdff8a3e2a4) Fix load_appium_txt relative path
|
23
|
+
|
24
|
+
|
1
25
|
#### v0.19.0 2014-02-20
|
2
26
|
|
3
27
|
- [6fd332b](https://github.com/appium/ruby_lib/commit/6fd332b1715d7b8f4b3b3c99e7ca58e5d4d01b52) Release 0.19.0
|
metadata
CHANGED
@@ -1,125 +1,153 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appium_lib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.21.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-
|
11
|
+
date: 2014-03-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: selenium-webdriver
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.39'
|
20
|
+
- - ">="
|
18
21
|
- !ruby/object:Gem::Version
|
19
22
|
version: 2.39.0
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - ~>
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.39'
|
30
|
+
- - ">="
|
25
31
|
- !ruby/object:Gem::Version
|
26
32
|
version: 2.39.0
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: awesome_print
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
|
-
- - ~>
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.2'
|
40
|
+
- - ">="
|
32
41
|
- !ruby/object:Gem::Version
|
33
42
|
version: 1.2.0
|
34
43
|
type: :runtime
|
35
44
|
prerelease: false
|
36
45
|
version_requirements: !ruby/object:Gem::Requirement
|
37
46
|
requirements:
|
38
|
-
- - ~>
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.2'
|
50
|
+
- - ">="
|
39
51
|
- !ruby/object:Gem::Version
|
40
52
|
version: 1.2.0
|
41
53
|
- !ruby/object:Gem::Dependency
|
42
54
|
name: json
|
43
55
|
requirement: !ruby/object:Gem::Requirement
|
44
56
|
requirements:
|
45
|
-
- - ~>
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '1.8'
|
60
|
+
- - ">="
|
46
61
|
- !ruby/object:Gem::Version
|
47
62
|
version: 1.8.1
|
48
63
|
type: :runtime
|
49
64
|
prerelease: false
|
50
65
|
version_requirements: !ruby/object:Gem::Requirement
|
51
66
|
requirements:
|
52
|
-
- - ~>
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '1.8'
|
70
|
+
- - ">="
|
53
71
|
- !ruby/object:Gem::Version
|
54
72
|
version: 1.8.1
|
55
73
|
- !ruby/object:Gem::Dependency
|
56
74
|
name: toml
|
57
75
|
requirement: !ruby/object:Gem::Requirement
|
58
76
|
requirements:
|
59
|
-
- - ~>
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0.0'
|
80
|
+
- - ">="
|
60
81
|
- !ruby/object:Gem::Version
|
61
82
|
version: 0.0.4
|
62
83
|
type: :runtime
|
63
84
|
prerelease: false
|
64
85
|
version_requirements: !ruby/object:Gem::Requirement
|
65
86
|
requirements:
|
66
|
-
- - ~>
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.0'
|
90
|
+
- - ">="
|
67
91
|
- !ruby/object:Gem::Version
|
68
92
|
version: 0.0.4
|
69
93
|
- !ruby/object:Gem::Dependency
|
70
94
|
name: posix-spawn
|
71
95
|
requirement: !ruby/object:Gem::Requirement
|
72
96
|
requirements:
|
73
|
-
- - ~>
|
97
|
+
- - "~>"
|
74
98
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0.3
|
76
|
-
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ~>
|
99
|
+
version: '0.3'
|
100
|
+
- - ">="
|
81
101
|
- !ruby/object:Gem::Version
|
82
102
|
version: 0.3.8
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: webkit_remote
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ~>
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: 0.4.1
|
90
103
|
type: :runtime
|
91
104
|
prerelease: false
|
92
105
|
version_requirements: !ruby/object:Gem::Requirement
|
93
106
|
requirements:
|
94
|
-
- - ~>
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0.3'
|
110
|
+
- - ">="
|
95
111
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.
|
112
|
+
version: 0.3.8
|
97
113
|
- !ruby/object:Gem::Dependency
|
98
114
|
name: rake
|
99
115
|
requirement: !ruby/object:Gem::Requirement
|
100
116
|
requirements:
|
101
|
-
- - ~>
|
117
|
+
- - "~>"
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '10.0'
|
120
|
+
- - ">="
|
102
121
|
- !ruby/object:Gem::Version
|
103
122
|
version: 10.0.4
|
104
123
|
type: :development
|
105
124
|
prerelease: false
|
106
125
|
version_requirements: !ruby/object:Gem::Requirement
|
107
126
|
requirements:
|
108
|
-
- - ~>
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '10.0'
|
130
|
+
- - ">="
|
109
131
|
- !ruby/object:Gem::Version
|
110
132
|
version: 10.0.4
|
111
133
|
- !ruby/object:Gem::Dependency
|
112
134
|
name: yard
|
113
135
|
requirement: !ruby/object:Gem::Requirement
|
114
136
|
requirements:
|
115
|
-
- - ~>
|
137
|
+
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0.8'
|
140
|
+
- - ">="
|
116
141
|
- !ruby/object:Gem::Version
|
117
142
|
version: 0.8.7.3
|
118
143
|
type: :development
|
119
144
|
prerelease: false
|
120
145
|
version_requirements: !ruby/object:Gem::Requirement
|
121
146
|
requirements:
|
122
|
-
- - ~>
|
147
|
+
- - "~>"
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0.8'
|
150
|
+
- - ">="
|
123
151
|
- !ruby/object:Gem::Version
|
124
152
|
version: 0.8.7.3
|
125
153
|
description: Ruby library for Appium.
|
@@ -129,7 +157,7 @@ executables: []
|
|
129
157
|
extensions: []
|
130
158
|
extra_rdoc_files: []
|
131
159
|
files:
|
132
|
-
- .gitignore
|
160
|
+
- ".gitignore"
|
133
161
|
- Gemfile
|
134
162
|
- LICENSE-2.0.txt
|
135
163
|
- Rakefile
|
@@ -147,8 +175,6 @@ files:
|
|
147
175
|
- lib/appium_lib/android/element/textfield.rb
|
148
176
|
- lib/appium_lib/android/helper.rb
|
149
177
|
- lib/appium_lib/android/patch.rb
|
150
|
-
- lib/appium_lib/android/webview/javascript.rb
|
151
|
-
- lib/appium_lib/android/webview/webview.rb
|
152
178
|
- lib/appium_lib/common/element/button.rb
|
153
179
|
- lib/appium_lib/common/element/text.rb
|
154
180
|
- lib/appium_lib/common/element/window.rb
|
@@ -173,17 +199,17 @@ require_paths:
|
|
173
199
|
- lib
|
174
200
|
required_ruby_version: !ruby/object:Gem::Requirement
|
175
201
|
requirements:
|
176
|
-
- -
|
202
|
+
- - ">="
|
177
203
|
- !ruby/object:Gem::Version
|
178
204
|
version: 1.9.3
|
179
205
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
180
206
|
requirements:
|
181
|
-
- -
|
207
|
+
- - ">="
|
182
208
|
- !ruby/object:Gem::Version
|
183
209
|
version: '0'
|
184
210
|
requirements: []
|
185
211
|
rubyforge_project:
|
186
|
-
rubygems_version: 2.
|
212
|
+
rubygems_version: 2.2.2
|
187
213
|
signing_key:
|
188
214
|
specification_version: 4
|
189
215
|
summary: Ruby library for Appium
|
@@ -1,76 +0,0 @@
|
|
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
|
@@ -1,105 +0,0 @@
|
|
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 package
|
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
|