Skip to content

Commit fa8b679

Browse files
Fix iOS name
Based on Appium's getTree method. #31
1 parent 5be26c4 commit fa8b679

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

lib/appium_lib/driver.rb

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def initialize opts={}
7171
# load Android specific methods
7272
extend Appium::Android
7373
else
74+
@ios_js = [] # used to keep track of loaded JavaScript on iOS
7475
# load iOS specific methods
7576
extend Appium::Ios
7677
end

lib/appium_lib/ios/element/generic.rb

+54-2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,55 @@ module Appium::Ios
1919
Android name = iOS name & label
2020
Android text = iOS value
2121
=end
22+
def ios_js_loaded? method_name
23+
@ios_js.include? method_name
24+
end
25+
26+
def ios_js_load method_name
27+
@ios_js.push method_name
28+
end
29+
30+
def name_contains_js
31+
# execute_script 'au.mainApp.getNameContains("sign")'
32+
# execute_script 'au.mainApp.getNameContains("zzz")'
33+
<<-JS
34+
UIAElement.prototype.getNameContains = function(targetName) {
35+
var target = UIATarget.localTarget();
36+
target.pushTimeout(0);
37+
var search = "name contains[c] '" + targetName + "' || label contains[c] '" + targetName + "'";
38+
var searchElements = function(element) {
39+
var children = element.elements();
40+
var result = children.firstWithPredicate(search);
41+
if (result.type() !== 'UIAElementNil') {
42+
return result;
43+
}
44+
45+
for ( var a = 0, len = children.length; a < len; a++) {
46+
result = searchElements(children[a]);
47+
if (result.type() !== 'UIAElementNil') {
48+
return result;
49+
}
50+
}
51+
52+
return result;
53+
};
54+
var result = searchElements(this);
55+
target.popTimeout();
56+
57+
if (result.type() === 'UIAElementNil') {
58+
return {
59+
status: 7,
60+
value: {'message': 'An element could not be located on the page using the given search parameters.'}
61+
};
62+
}
63+
64+
return {
65+
status: 0,
66+
value: {ELEMENT: au.getId(result)}
67+
};
68+
};
69+
JS
70+
end
2271

2372
# returnElems requires a wrapped $(element).
2473
# set to empty array when length is zero to prevent hang.
@@ -149,9 +198,12 @@ def texts text
149198
# @param name [String] the name to search for
150199
# @return [Element] the first matching element
151200
def name name
152-
js = first_ele_js "name contains[c] '#{name}' || label contains[c] '#{name}'"
201+
unless ios_js_loaded? 'name_contains_js'
202+
execute_script name_contains_js
203+
ios_js_load 'name_contains_js'
204+
end
153205

154-
execute_script(js).first
206+
execute_script %(au.mainApp.getNameContains("#{name}"))
155207
end
156208

157209
# Return all elements matching name.

0 commit comments

Comments
 (0)