@@ -19,6 +19,55 @@ module Appium::Ios
19
19
Android name = iOS name & label
20
20
Android text = iOS value
21
21
=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
22
71
23
72
# returnElems requires a wrapped $(element).
24
73
# set to empty array when length is zero to prevent hang.
@@ -149,9 +198,12 @@ def texts text
149
198
# @param name [String] the name to search for
150
199
# @return [Element] the first matching element
151
200
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
153
205
154
- execute_script ( js ) . first
206
+ execute_script %(au.mainApp.getNameContains(" #{ name } "))
155
207
end
156
208
157
209
# Return all elements matching name.
0 commit comments