appium_lib 9.15.1 → 9.15.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +13 -15
- data/CHANGELOG.md +8 -0
- data/appium_lib.gemspec +7 -10
- data/docs/android_docs.md +259 -181
- data/docs/ios_docs.md +322 -244
- data/docs/ios_xcuitest.md +1 -1
- data/docs/w3c.md +21 -0
- data/lib/appium_lib/android/common/helper.rb +13 -13
- data/lib/appium_lib/android/element/button.rb +2 -0
- data/lib/appium_lib/android/element/generic.rb +2 -2
- data/lib/appium_lib/android/element/text.rb +2 -0
- data/lib/appium_lib/android/element/textfield.rb +2 -0
- data/lib/appium_lib/android/uiautomator2/element/button.rb +3 -0
- data/lib/appium_lib/android/uiautomator2/helper.rb +10 -8
- data/lib/appium_lib/appium.rb +4 -0
- data/lib/appium_lib/common/helper.rb +9 -8
- data/lib/appium_lib/common/multi_touch.rb +2 -0
- data/lib/appium_lib/common/touch_actions.rb +6 -5
- data/lib/appium_lib/driver.rb +72 -19
- data/lib/appium_lib/ios/common/helper.rb +36 -30
- data/lib/appium_lib/ios/element/button.rb +2 -0
- data/lib/appium_lib/ios/element/generic.rb +1 -0
- data/lib/appium_lib/ios/element/text.rb +2 -0
- data/lib/appium_lib/ios/element/textfield.rb +5 -2
- data/lib/appium_lib/ios/xcuitest/command/gestures.rb +4 -4
- data/lib/appium_lib/ios/xcuitest/element/button.rb +2 -0
- data/lib/appium_lib/ios/xcuitest/element/generic.rb +1 -0
- data/lib/appium_lib/ios/xcuitest/element/text.rb +2 -0
- data/lib/appium_lib/ios/xcuitest/element/textfield.rb +3 -0
- data/lib/appium_lib/ios/xcuitest/helper.rb +3 -4
- data/lib/appium_lib/version.rb +2 -2
- data/release_notes.md +10 -0
- metadata +39 -53
data/docs/ios_xcuitest.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
- How to migrate XCUITest from UIAutomation
|
6
6
|
- [Migrating your iOS tests from UIAutomation](https://github.com/appium/appium/blob/v1.6.2/docs/en/advanced-concepts/migrating-to-xcuitest.md)
|
7
7
|
- Mobile gestures for XCUITest
|
8
|
-
- [ios-xctest-mobile-gestures](https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/ios-xctest-mobile-gestures.md)
|
8
|
+
- [ios-xctest-mobile-gestures](https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/ios/ios-xctest-mobile-gestures.md)
|
9
9
|
- Required Appium1.6.4+
|
10
10
|
|
11
11
|
## find elements
|
data/docs/w3c.md
CHANGED
@@ -15,6 +15,27 @@ driver.action
|
|
15
15
|
.move_to_location(500, 500).pointer_down(:left)
|
16
16
|
.move_to_location(0, 700)
|
17
17
|
.release.perform
|
18
|
+
|
19
|
+
# multiple action chains
|
20
|
+
f1 = driver.action.add_pointer_input(:touch, 'finger1')
|
21
|
+
f1.create_pointer_move(duration: 1, x: 200, y: 500,
|
22
|
+
origin: ::Selenium::WebDriver::Interactions::PointerMove::VIEWPORT)
|
23
|
+
f1.create_pointer_down(:left)
|
24
|
+
f1.create_pause(0.5)
|
25
|
+
f1.create_pointer_move(duration: 1, x: 200, y: 200,
|
26
|
+
origin: ::Selenium::WebDriver::Interactions::PointerMove::VIEWPORT)
|
27
|
+
f1.create_pointer_up(:left)
|
28
|
+
|
29
|
+
f2 = driver.action.add_pointer_input(:touch, 'finger2')
|
30
|
+
f2.create_pointer_move(duration: 1, x: 200, y: 500,
|
31
|
+
origin: ::Selenium::WebDriver::Interactions::PointerMove::VIEWPORT)
|
32
|
+
f2.create_pointer_down(:left)
|
33
|
+
f2.create_pause(0.5)
|
34
|
+
f2.create_pointer_move(duration: 1, x: 200, y: 800,
|
35
|
+
origin: ::Selenium::WebDriver::Interactions::PointerMove::VIEWPORT)
|
36
|
+
f2.create_pointer_up(:left)
|
37
|
+
|
38
|
+
driver.perform_actions [f1, f2]
|
18
39
|
```
|
19
40
|
|
20
41
|
# Note
|
@@ -8,7 +8,8 @@ module Appium
|
|
8
8
|
# convert to string to support symbols
|
9
9
|
def filter=(value)
|
10
10
|
# nil and false disable the filter
|
11
|
-
return @filter = false unless value
|
11
|
+
return @filter = false unless value # rubocop:disable Lint/ReturnInVoidContext
|
12
|
+
|
12
13
|
@filter = value.to_s.downcase
|
13
14
|
end
|
14
15
|
|
@@ -136,6 +137,7 @@ module Appium
|
|
136
137
|
index -= 1 if index >= 0
|
137
138
|
else
|
138
139
|
raise 'Index must be >= 1' unless index >= 1
|
140
|
+
|
139
141
|
index -= 1 if index >= 1
|
140
142
|
end
|
141
143
|
|
@@ -218,7 +220,7 @@ module Appium
|
|
218
220
|
|
219
221
|
if class_name == '*'
|
220
222
|
return "//*[contains(translate(@text,'#{value.upcase}', '#{value}'), '#{value}')" \
|
221
|
-
|
223
|
+
" or contains(translate(@content-desc,'#{value.upcase}', '#{value}'), '#{value}')" + r_id + ']'
|
222
224
|
end
|
223
225
|
|
224
226
|
"//#{class_name}[contains(translate(@text,'#{value.upcase}', '#{value}'), '#{value}')" \
|
@@ -237,14 +239,14 @@ module Appium
|
|
237
239
|
value = %("#{value}")
|
238
240
|
if class_name == '*'
|
239
241
|
return (resource_id(value, "new UiSelector().resourceId(#{value});") +
|
240
|
-
|
241
|
-
|
242
|
+
"new UiSelector().descriptionContains(#{value});" \
|
243
|
+
"new UiSelector().textContains(#{value});")
|
242
244
|
end
|
243
245
|
|
244
246
|
class_name = %("#{class_name}")
|
245
247
|
resource_id(value, "new UiSelector().className(#{class_name}).resourceId(#{value});") +
|
246
|
-
|
247
|
-
|
248
|
+
"new UiSelector().className(#{class_name}).descriptionContains(#{value});" \
|
249
|
+
"new UiSelector().className(#{class_name}).textContains(#{value});"
|
248
250
|
end
|
249
251
|
|
250
252
|
# Find the first element that contains value
|
@@ -272,9 +274,7 @@ module Appium
|
|
272
274
|
def string_visible_exact_xpath(class_name, value)
|
273
275
|
r_id = resource_id(value, " or @resource-id='#{value}'")
|
274
276
|
|
275
|
-
if class_name == '*'
|
276
|
-
return "//*[@text='#{value}' or @content-desc='#{value}'" + r_id + ']'
|
277
|
-
end
|
277
|
+
return "//*[@text='#{value}' or @content-desc='#{value}'" + r_id + ']' if class_name == '*'
|
278
278
|
|
279
279
|
"//#{class_name}[@text='#{value}' or @content-desc='#{value}'" + r_id + ']'
|
280
280
|
end
|
@@ -289,14 +289,14 @@ module Appium
|
|
289
289
|
|
290
290
|
if class_name == '*'
|
291
291
|
return (resource_id(value, "new UiSelector().resourceId(#{value});") +
|
292
|
-
|
293
|
-
|
292
|
+
"new UiSelector().description(#{value});" \
|
293
|
+
"new UiSelector().text(#{value});")
|
294
294
|
end
|
295
295
|
|
296
296
|
class_name = %("#{class_name}")
|
297
297
|
resource_id(value, "new UiSelector().className(#{class_name}).resourceId(#{value});") +
|
298
|
-
|
299
|
-
|
298
|
+
"new UiSelector().className(#{class_name}).description(#{value});" \
|
299
|
+
"new UiSelector().className(#{class_name}).text(#{value});"
|
300
300
|
end
|
301
301
|
|
302
302
|
# Find the first element exactly matching value
|
@@ -26,6 +26,7 @@ module Appium
|
|
26
26
|
# @return [Array<Button>]
|
27
27
|
def buttons(value = false)
|
28
28
|
return find_elements :uiautomator, _button_visible_selectors unless value
|
29
|
+
|
29
30
|
find_elements :uiautomator, _button_contains_string(value)
|
30
31
|
end
|
31
32
|
|
@@ -69,6 +70,7 @@ module Appium
|
|
69
70
|
# @private
|
70
71
|
def raise_no_such_element_if_empty(elements)
|
71
72
|
raise _no_such_element if elements.empty?
|
73
|
+
|
72
74
|
elements.first
|
73
75
|
end
|
74
76
|
|
@@ -45,7 +45,7 @@ module Appium
|
|
45
45
|
begin
|
46
46
|
elem = find_element :uiautomator, scroll_uiselector(arg, scrollable_index)
|
47
47
|
return elem
|
48
|
-
rescue => e
|
48
|
+
rescue StandardError => e
|
49
49
|
raise e if index == args.size - 1
|
50
50
|
end
|
51
51
|
end
|
@@ -63,7 +63,7 @@ module Appium
|
|
63
63
|
begin
|
64
64
|
elem = find_element :uiautomator, scroll_uiselector(arg, scrollable_index)
|
65
65
|
return elem
|
66
|
-
rescue => e
|
66
|
+
rescue StandardError => e
|
67
67
|
raise e if index == args.size - 1
|
68
68
|
end
|
69
69
|
end
|
@@ -9,6 +9,7 @@ module Appium
|
|
9
9
|
# @return [TextView]
|
10
10
|
def text(value)
|
11
11
|
return ele_index TextView, value if value.is_a? Numeric
|
12
|
+
|
12
13
|
complex_find_contains TextView, value
|
13
14
|
end
|
14
15
|
|
@@ -18,6 +19,7 @@ module Appium
|
|
18
19
|
# @return [Array<TextView>]
|
19
20
|
def texts(value = false)
|
20
21
|
return tags TextView unless value
|
22
|
+
|
21
23
|
complex_finds_contains TextView, value
|
22
24
|
end
|
23
25
|
|
@@ -8,6 +8,7 @@ module Appium
|
|
8
8
|
# @return [EditText]
|
9
9
|
def textfield(value)
|
10
10
|
return ele_index EditText, value if value.is_a? Numeric
|
11
|
+
|
11
12
|
complex_find_contains EditText, value
|
12
13
|
end
|
13
14
|
|
@@ -17,6 +18,7 @@ module Appium
|
|
17
18
|
# @return [Array<EditText>]
|
18
19
|
def textfields(value = false)
|
19
20
|
return tags EditText unless value
|
21
|
+
|
20
22
|
complex_finds_contains EditText, value
|
21
23
|
end
|
22
24
|
|
@@ -15,6 +15,7 @@ module Appium
|
|
15
15
|
|
16
16
|
result = find_elements :uiautomator, _button_visible_selectors(index: index)
|
17
17
|
raise _no_such_element if result.empty?
|
18
|
+
|
18
19
|
return result[value - 1]
|
19
20
|
end
|
20
21
|
|
@@ -28,6 +29,7 @@ module Appium
|
|
28
29
|
# @return [Array<Button>]
|
29
30
|
def buttons(value = false)
|
30
31
|
return find_elements :uiautomator, _button_visible_selectors unless value
|
32
|
+
|
31
33
|
find_elements :uiautomator, _button_contains_string(value)
|
32
34
|
end
|
33
35
|
|
@@ -74,6 +76,7 @@ module Appium
|
|
74
76
|
# @private
|
75
77
|
def raise_no_such_element_if_empty(elements)
|
76
78
|
raise _no_such_element if elements.empty?
|
79
|
+
|
77
80
|
elements.first
|
78
81
|
end
|
79
82
|
|
@@ -14,14 +14,14 @@ module Appium
|
|
14
14
|
value = %("#{value}")
|
15
15
|
if class_name == '*'
|
16
16
|
return (resource_id(value, "new UiSelector().resourceId(#{value});") +
|
17
|
-
|
18
|
-
|
17
|
+
"new UiSelector().descriptionContains(#{value});" \
|
18
|
+
"new UiSelector().textContains(#{value});")
|
19
19
|
end
|
20
20
|
|
21
21
|
class_name = %("#{class_name}")
|
22
22
|
resource_id(value, "new UiSelector().className(#{class_name}).resourceId(#{value});") +
|
23
|
-
|
24
|
-
|
23
|
+
"new UiSelector().className(#{class_name}).descriptionContains(#{value});" \
|
24
|
+
"new UiSelector().className(#{class_name}).textContains(#{value});"
|
25
25
|
end
|
26
26
|
|
27
27
|
# Find the first element that contains value
|
@@ -31,6 +31,7 @@ module Appium
|
|
31
31
|
def complex_find_contains(class_name, value)
|
32
32
|
elements = find_elements :uiautomator, string_visible_contains(class_name, value)
|
33
33
|
raise _no_such_element if elements.empty?
|
34
|
+
|
34
35
|
elements.first
|
35
36
|
end
|
36
37
|
|
@@ -52,14 +53,14 @@ module Appium
|
|
52
53
|
|
53
54
|
if class_name == '*'
|
54
55
|
return (resource_id(value, "new UiSelector().resourceId(#{value});") +
|
55
|
-
|
56
|
-
|
56
|
+
"new UiSelector().description(#{value});" \
|
57
|
+
"new UiSelector().text(#{value});")
|
57
58
|
end
|
58
59
|
|
59
60
|
class_name = %("#{class_name}")
|
60
61
|
resource_id(value, "new UiSelector().className(#{class_name}).resourceId(#{value});") +
|
61
|
-
|
62
|
-
|
62
|
+
"new UiSelector().className(#{class_name}).description(#{value});" \
|
63
|
+
"new UiSelector().className(#{class_name}).text(#{value});"
|
63
64
|
end
|
64
65
|
|
65
66
|
# Find the first element exactly matching value
|
@@ -69,6 +70,7 @@ module Appium
|
|
69
70
|
def complex_find_exact(class_name, value)
|
70
71
|
elements = find_elements :uiautomator, string_visible_exact(class_name, value)
|
71
72
|
raise _no_such_element if elements.empty?
|
73
|
+
|
72
74
|
elements.first
|
73
75
|
end
|
74
76
|
|
data/lib/appium_lib/appium.rb
CHANGED
@@ -49,6 +49,7 @@ module Appium
|
|
49
49
|
|
50
50
|
toml = opts[:file]
|
51
51
|
raise 'Must pass a capability file which has [caps] and [appium_lib]' unless toml
|
52
|
+
|
52
53
|
verbose = opts.fetch :verbose, false
|
53
54
|
|
54
55
|
Appium::Logger.info "appium settings path: #{toml}" if verbose
|
@@ -57,6 +58,7 @@ module Appium
|
|
57
58
|
Appium::Logger.info "Exists? #{toml_exists}" if verbose
|
58
59
|
|
59
60
|
raise "toml doesn't exist #{toml}" unless toml_exists
|
61
|
+
|
60
62
|
require 'tomlrb'
|
61
63
|
Appium::Logger.info "Loading #{toml}" if verbose
|
62
64
|
|
@@ -135,6 +137,7 @@ module Appium
|
|
135
137
|
end
|
136
138
|
else
|
137
139
|
raise 'modules must be a module or an array' unless modules.is_a? Array
|
140
|
+
|
138
141
|
target_modules = modules
|
139
142
|
end
|
140
143
|
|
@@ -181,6 +184,7 @@ module Appium
|
|
181
184
|
#
|
182
185
|
def promote_appium_methods(class_array, driver = $driver)
|
183
186
|
raise 'Driver is nil' if driver.nil?
|
187
|
+
|
184
188
|
# Wrap single class into an array
|
185
189
|
class_array = [class_array] unless class_array.class == Array
|
186
190
|
# Promote Appium driver methods to class instance methods.
|
@@ -194,7 +194,8 @@ module Appium
|
|
194
194
|
# convert to string to support symbols
|
195
195
|
def filter=(value)
|
196
196
|
# nil and false disable the filter
|
197
|
-
return @filter = false unless value
|
197
|
+
return @filter = false unless value # rubocop:disable Lint/ReturnInVoidContext
|
198
|
+
|
198
199
|
@filter = value.to_s.downcase
|
199
200
|
end
|
200
201
|
|
@@ -211,16 +212,13 @@ module Appium
|
|
211
212
|
|
212
213
|
def result
|
213
214
|
@elements_in_order.reduce('') do |r, e|
|
214
|
-
name
|
215
|
+
name = e.delete :name
|
215
216
|
attr_string = e.reduce('') do |string, attr|
|
216
|
-
|
217
|
-
|
218
|
-
string + " #{attr[0]}: #{attr_1}\n"
|
217
|
+
attr1 = attr[1] ? attr[1].strip : attr[1]
|
218
|
+
"#{string} #{attr[0]}: #{attr1}\n"
|
219
219
|
end
|
220
220
|
|
221
|
-
unless attr_string.nil? || attr_string.empty?
|
222
|
-
r += "\n#{name}\n#{attr_string}"
|
223
|
-
end
|
221
|
+
r.concat "\n#{name}\n#{attr_string}" unless attr_string.nil? || attr_string.empty?
|
224
222
|
r
|
225
223
|
end
|
226
224
|
end
|
@@ -228,6 +226,7 @@ module Appium
|
|
228
226
|
def start_element(name, attrs = [])
|
229
227
|
@skip_element = filter && !filter.include?(name.downcase)
|
230
228
|
return if @skip_element
|
229
|
+
|
231
230
|
element = { name: name }
|
232
231
|
attrs.each { |a| element[a[0]] = a[1] }
|
233
232
|
@element_stack.push element
|
@@ -236,12 +235,14 @@ module Appium
|
|
236
235
|
|
237
236
|
def end_element(name)
|
238
237
|
return if filter && !filter.include?(name.downcase)
|
238
|
+
|
239
239
|
element_index = @element_stack.rindex { |e| e[:name] == name }
|
240
240
|
@element_stack.delete_at element_index
|
241
241
|
end
|
242
242
|
|
243
243
|
def characters(chars)
|
244
244
|
return if @skip_element
|
245
|
+
|
245
246
|
element = @element_stack.last
|
246
247
|
element[:text] = chars
|
247
248
|
end
|
@@ -63,6 +63,7 @@ module Appium
|
|
63
63
|
pinch.add top
|
64
64
|
pinch.add bottom
|
65
65
|
return pinch unless auto_perform
|
66
|
+
|
66
67
|
pinch.perform
|
67
68
|
end
|
68
69
|
|
@@ -105,6 +106,7 @@ module Appium
|
|
105
106
|
zoom.add top
|
106
107
|
zoom.add bottom
|
107
108
|
return zoom unless auto_perform
|
109
|
+
|
108
110
|
zoom.perform
|
109
111
|
end
|
110
112
|
|
@@ -36,9 +36,10 @@ module Appium
|
|
36
36
|
COMPLEX_ACTIONS.each do |action|
|
37
37
|
define_method(action) do |opts|
|
38
38
|
auto_perform = opts.delete(:auto_perform) { |_k| true }
|
39
|
-
ta
|
39
|
+
ta = ::Appium::TouchAction.new($driver)
|
40
40
|
ta.send(action, opts)
|
41
41
|
return ta unless auto_perform
|
42
|
+
|
42
43
|
ta.perform
|
43
44
|
end
|
44
45
|
end
|
@@ -49,10 +50,10 @@ module Appium
|
|
49
50
|
end
|
50
51
|
|
51
52
|
def swipe(opts)
|
52
|
-
start_x
|
53
|
-
start_y
|
54
|
-
end_x
|
55
|
-
end_y
|
53
|
+
start_x = opts.fetch :start_x, 0
|
54
|
+
start_y = opts.fetch :start_y, 0
|
55
|
+
end_x = opts.fetch :end_x, 0
|
56
|
+
end_y = opts.fetch :end_y, 0
|
56
57
|
duration = opts.fetch :duration, 200
|
57
58
|
|
58
59
|
if opts[:offset_x]
|
data/lib/appium_lib/driver.rb
CHANGED
@@ -199,7 +199,7 @@ module Appium
|
|
199
199
|
# Save global reference to last created Appium driver for top level methods.
|
200
200
|
$driver = self if global_driver
|
201
201
|
|
202
|
-
self # return newly created driver
|
202
|
+
self # rubocop:disable Lint/Void # return newly created driver
|
203
203
|
end
|
204
204
|
|
205
205
|
private
|
@@ -254,23 +254,25 @@ module Appium
|
|
254
254
|
|
255
255
|
# Returns a hash of the driver attributes
|
256
256
|
def driver_attributes
|
257
|
+
# rubocop:disable Layout/AlignHash
|
257
258
|
{
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
259
|
+
caps: @core.caps,
|
260
|
+
automation_name: @core.automation_name,
|
261
|
+
custom_url: @core.custom_url,
|
262
|
+
export_session: @core.export_session,
|
263
|
+
export_session_path: @core.export_session_path,
|
264
|
+
default_wait: @core.default_wait,
|
265
|
+
sauce_username: @sauce.username,
|
266
|
+
sauce_access_key: @sauce.access_key,
|
267
|
+
sauce_endpoint: @sauce.endpoint,
|
268
|
+
port: @core.port,
|
269
|
+
device: @core.device,
|
270
|
+
debug: @appium_debug,
|
271
|
+
listener: @listener,
|
272
|
+
wait_timeout: @core.wait_timeout,
|
273
|
+
wait_interval: @core.wait_interval
|
273
274
|
}
|
275
|
+
# rubocop:enable Layout/AlignHash
|
274
276
|
end
|
275
277
|
|
276
278
|
def device_is_android?
|
@@ -328,8 +330,9 @@ module Appium
|
|
328
330
|
# @return [Boolean]
|
329
331
|
def check_server_version_xcuitest
|
330
332
|
if automation_name_is_xcuitest? &&
|
331
|
-
|
332
|
-
|
333
|
+
!@appium_server_status.empty? &&
|
334
|
+
(@appium_server_status['build']['version'] < REQUIRED_VERSION_XCUITEST)
|
335
|
+
|
333
336
|
raise(Appium::Core::Error::NotSupportedAppiumServer,
|
334
337
|
"XCUITest requires Appium version >= #{REQUIRED_VERSION_XCUITEST}")
|
335
338
|
end
|
@@ -351,6 +354,7 @@ module Appium
|
|
351
354
|
@core.appium_server_version
|
352
355
|
rescue Selenium::WebDriver::Error::WebDriverError => ex
|
353
356
|
raise ::Appium::Core::Error::ServerError unless ex.message.include?('content-type=""')
|
357
|
+
|
354
358
|
# server (TestObject for instance) does not respond to status call
|
355
359
|
{}
|
356
360
|
end
|
@@ -385,6 +389,7 @@ module Appium
|
|
385
389
|
# @return [String] APP_PATH as an absolute path
|
386
390
|
def self.absolute_app_path(opts)
|
387
391
|
raise 'opts must be a hash' unless opts.is_a? Hash
|
392
|
+
|
388
393
|
caps = opts[:caps] || {}
|
389
394
|
app_path = caps[:app]
|
390
395
|
raise 'absolute_app_path invoked and app is not set!' if app_path.nil? || app_path.empty?
|
@@ -403,6 +408,7 @@ module Appium
|
|
403
408
|
def server_url
|
404
409
|
return @core.custom_url if @core.custom_url
|
405
410
|
return @sauce.server_url if @sauce.sauce_server_url?
|
411
|
+
|
406
412
|
"http://127.0.0.1:#{@core.port}/wd/hub"
|
407
413
|
end
|
408
414
|
|
@@ -517,6 +523,7 @@ module Appium
|
|
517
523
|
unless e.message.include?('The operation requested is not yet implemented by Espresso driver')
|
518
524
|
raise ::Appium::Core::Error::ServerError
|
519
525
|
end
|
526
|
+
|
520
527
|
{}
|
521
528
|
end
|
522
529
|
|
@@ -562,7 +569,7 @@ module Appium
|
|
562
569
|
|
563
570
|
begin
|
564
571
|
yield # search for element
|
565
|
-
rescue
|
572
|
+
rescue StandardError
|
566
573
|
exists = false # error means it's not there
|
567
574
|
end
|
568
575
|
|
@@ -580,6 +587,52 @@ module Appium
|
|
580
587
|
@driver.execute_script script, *args
|
581
588
|
end
|
582
589
|
|
590
|
+
###
|
591
|
+
# Wrap calling selenium webdrier APIs via ruby_core
|
592
|
+
###
|
593
|
+
# Get the window handles of open browser windows
|
594
|
+
def execute_async_script(script, *args)
|
595
|
+
@driver.execute_async_script script, *args
|
596
|
+
end
|
597
|
+
|
598
|
+
def window_handles
|
599
|
+
@driver.window_handles
|
600
|
+
end
|
601
|
+
|
602
|
+
# Get the current window handle
|
603
|
+
def window_handle
|
604
|
+
@driver.window_handle
|
605
|
+
end
|
606
|
+
|
607
|
+
def navigate
|
608
|
+
@driver.navigate
|
609
|
+
end
|
610
|
+
|
611
|
+
def manage
|
612
|
+
@driver.manage
|
613
|
+
end
|
614
|
+
|
615
|
+
def get(url)
|
616
|
+
@driver.get(url)
|
617
|
+
end
|
618
|
+
|
619
|
+
def current_url
|
620
|
+
@driver.current_url
|
621
|
+
end
|
622
|
+
|
623
|
+
def title
|
624
|
+
@driver.title
|
625
|
+
end
|
626
|
+
|
627
|
+
# @return [TargetLocator]
|
628
|
+
# @see TargetLocator
|
629
|
+
def switch_to
|
630
|
+
@driver.switch_to
|
631
|
+
end
|
632
|
+
###
|
633
|
+
# End core
|
634
|
+
###
|
635
|
+
|
583
636
|
# Calls @driver.find_elements_with_appium
|
584
637
|
#
|
585
638
|
# @example
|