|
1 #各位客官,虽然今天是周末,我还是奋斗到工作的第一线
2 #研究python-client,也就是api,哈哈,大家自己翻译吧,我把代码贴出来
3 @property
4 def contexts(self):
5 """
6 Returns the contexts within the current session.
7
8 :Usage:
9 driver.contexts
10 """
11 return self.execute(Command.CONTEXTS)['value']
12
13 @property
14 def current_context(self):
15 """
16 Returns the current context of the current session.
17
18 :Usage:
19 driver.current_context
20 """
21 return self.execute(Command.GET_CURRENT_CONTEXT)['value']
22
23 @property
24 def context(self):
25 """
26 Returns the current context of the current session.
27
28 :Usage:
29 driver.context
30 """
31 return self.current_context
32
33 def find_element_by_ios_uiautomation(self, uia_string):
34 """Finds an element by uiautomation in iOS.
35
36 :Args:
37 - uia_string - The element name in the iOS UIAutomation library
38
39 :Usage:
40 driver.find_element_by_ios_uiautomation('.elements()[1].cells()[2]')
41 """
42 return self.find_element(by=By.IOS_UIAUTOMATION, value=uia_string)
43
44 def find_elements_by_ios_uiautomation(self, uia_string):
45 """Finds elements by uiautomation in iOS.
46
47 :Args:
48 - uia_string - The element name in the iOS UIAutomation library
49
50 :Usage:
51 driver.find_elements_by_ios_uiautomation('.elements()[1].cells()[2]')
52 """
53 return self.find_elements(by=By.IOS_UIAUTOMATION, value=uia_string)
54
55 def find_element_by_android_uiautomator(self, uia_string):
56 """Finds element by uiautomator in Android.
57
58 :Args:
59 - uia_string - The element name in the Android UIAutomator library
60
61 :Usage:
62 driver.find_element_by_android_uiautomator('.elements()[1].cells()[2]')
63 """
64 return self.find_element(by=By.ANDROID_UIAUTOMATOR, value=uia_string)
65
66 def find_elements_by_android_uiautomator(self, uia_string):
67 """Finds elements by uiautomator in Android.
68
69 :Args:
70 - uia_string - The element name in the Android UIAutomator library
71
72 :Usage:
73 driver.find_elements_by_android_uiautomator('.elements()[1].cells()[2]')
74 """
75 return self.find_elements(by=By.ANDROID_UIAUTOMATOR, value=uia_string)
76
77 def find_element_by_accessibility_id(self, id):
78 """Finds an element by accessibility id.
79
80 :Args:
81 - id - a string corresponding to a recursive element search using the
82 Id/Name that the native Accessibility options utilize
83
84 :Usage:
85 driver.find_element_by_accessibility_id()
86 """
87 return self.find_element(by=By.ACCESSIBILITY_ID, value=id)
88
89 def find_elements_by_accessibility_id(self, id):
90 """Finds elements by accessibility id.
91
92 :Args:
93 - id - a string corresponding to a recursive element search using the
94 Id/Name that the native Accessibility options utilize
95
96 :Usage:
97 driver.find_elements_by_accessibility_id()
98 """
99 return self.find_elements(by=By.ACCESSIBILITY_ID, value=id)
100
101 def create_web_element(self, element_id):
102 """
103 Creates a web element with the specified element_id.
104 Overrides method in Selenium WebDriver in order to always give them
105 Appium WebElement
106 """
107 return MobileWebElement(self, element_id)
108
109 # convenience method added to Appium (NOT Selenium 3)
110 def scroll(self, origin_el, destination_el):
111 """Scrolls from one element to another
112
113 :Args:
114 - originalEl - the element from which to being scrolling
115 - destinationEl - the element to scroll to
116
117 :Usage:
118 driver.scroll(el1, el2)
119 """
120 action = TouchAction(self)
121 action.press(origin_el).move_to(destination_el).release().perform()
122 return self
123
124 # convenience method added to Appium (NOT Selenium 3)
125 def drag_and_drop(self, origin_el, destination_el):
126 """Drag the origin element to the destination element
127
128 :Args:
129 - originEl - the element to drag
130 - destinationEl - the element to drag to
131 """
132 action = TouchAction(self)
133 action.long_press(origin_el).move_to(destination_el).release().perform()
134 return self
135
136 # convenience method added to Appium (NOT Selenium 3)
137 def tap(self, positions, duration=None):
138 """Taps on an particular place with up to five fingers, holding for a
139 certain time
140
141 :Args:
142 - positions - an array of tuples representing the x/y coordinates of
143 the fingers to tap. Length can be up to five.
144 - duration - (optional) length of time to tap, in ms
145
146 :Usage:
147 driver.tap([(100, 20), (100, 60), (100, 100)], 500)
148 """
149 if len(positions) == 1:
150 action = TouchAction(self)
151 x = positions[0][0]
152 y = positions[0][1]
153 if duration:
154 duration = duration
155 action.long_press(x=x, y=y, duration=duration).release()
156 else:
157 action.press(x=x, y=y).release()
158 action.perform()
159 else:
160 ma = MultiAction(self)
161 for position in positions:
162 x = position[0]
163 y = position[1]
164 action = TouchAction(self)
165 if duration:
166 duration *= 1000 # we take seconds, but send milliseconds
167 action.long_press(x=x, y=y, duration=duration).release()
168 else:
169 action.press(x=x, y=y).release()
170 ma.add(action)
171
172 ma.perform()
173 return self
174
175 # convenience method added to Appium (NOT Selenium 3)
176 def swipe(self, start_x, start_y, end_x, end_y, duration=None):
177 """Swipe from one point to another point, for an optional duration.
178
179 :Args:
180 - start_x - x-coordinate at which to start
181 - start_y - y-coordinate at which to end
182 - end_x - x-coordinate at which to stop
183 - end_y - y-coordinate at which to stop
184 - duration - (optional) time to take the swipe, in ms.
185
186 :Usage:
187 driver.swipe(100, 100, 100, 400)
188 """
189 # `swipe` is something like press-wait-move_to-release, which the server
190 # will translate into the correct action
191 action = TouchAction(self)
192 action \
193 .press(x=start_x, y=start_y) \
194 .wait(ms=duration) \
195 .move_to(x=end_x, y=end_y) \
196 .release()
197 action.perform()
198 return self
199
200 # convenience method added to Appium (NOT Selenium 3)
201 def flick(self, start_x, start_y, end_x, end_y):
202 """Flick from one point to another point.
203
204 :Args:
205 - start_x - x-coordinate at which to start
206 - start_y - y-coordinate at which to end
207 - end_x - x-coordinate at which to stop
208 - end_y - y-coordinate at which to stop
209
210 :Usage:
211 driver.flick(100, 100, 100, 400)
212 """
213 action = TouchAction(self)
214 action \
215 .press(x=start_x, y=start_y) \
216 .move_to(x=end_x, y=end_y) \
217 .release()
218 action.perform()
219 return self
220
221 # convenience method added to Appium (NOT Selenium 3)
222 def pinch(self, element=None, percent=200, steps=50):
223 """Pinch on an element a certain amount
224
225 :Args:
226 - element - the element to pinch
227 - percent - (optional) amount to pinch. Defaults to 200%
228 - steps - (optional) number of steps in the pinch action
229
230 :Usage:
231 driver.pinch(element)
232 """
233 if element:
234 element = element.id
235
236 opts = {
237 'element': element,
238 'percent': percent,
239 'steps': steps,
240 }
241 self.execute_script('mobile: pinchClose', opts)
242 return self
243
244 # convenience method added to Appium (NOT Selenium 3)
245 def zoom(self, element=None, percent=200, steps=50):
246 """Zooms in on an element a certain amount
247
248 :Args:
249 - element - the element to zoom
250 - percent - (optional) amount to zoom. Defaults to 200%
251 - steps - (optional) number of steps in the zoom action
252
253 :Usage:
254 driver.zoom(element)
255 """
256 if element:
257 element = element.id
258
259 opts = {
260 'element': element,
261 'percent': percent,
262 'steps': steps,
263 }
264 self.execute_script('mobile: pinchOpen', opts)
265 return self
266
267 def app_strings(self, language=None):
268 """Returns the application strings from the device for the specified
269 language.
270
271 :Args:
272 - language - strings language code
273 """
274 data = {}
275 if language != None:
276 data['language'] = language
277 return self.execute(Command.GET_APP_STRINGS, data)['value']
278
279 def reset(self):
280 """Resets the current application on the device.
281 """
282 self.execute(Command.RESET)
283 return self
284
285 def hide_keyboard(self, key_name=None):
286 """Hides the software keyboard on the device, using the specified key to
287 press. If no key name is given, the keyboard is closed by moving focus
288 from the text field. iOS only.
289 """
290 data = {}
291 if key_name is not None:
292 data['keyName'] = key_name
293 self.execute(Command.HIDE_KEYBOARD, data)
294 return self
295
296 # TODO: remove when new Appium is out
297 def keyevent(self, keycode, metastate=None):
298 """Sends a keycode to the device. Android only. Possible keycodes can be
299 found in http://developer.android.com/reference/android/view/KeyEvent.html.
300
301 :Args:
302 - keycode - the keycode to be sent to the device
303 - metastate - meta information about the keycode being sent
304 """
305 data = {
306 'keycode': keycode,
307 }
308 if metastate is not None:
309 data['metastate'] = metastate
310 self.execute(Command.KEY_EVENT, data)
311 return self
312
313 def press_keycode(self, keycode, metastate=None):
314 """Sends a keycode to the device. Android only. Possible keycodes can be
315 found in http://developer.android.com/reference/android/view/KeyEvent.html.
316
317 :Args:
318 - keycode - the keycode to be sent to the device
319 - metastate - meta information about the keycode being sent
320 """
321 data = {
322 'keycode': keycode,
323 }
324 if metastate is not None:
325 data['metastate'] = metastate
326 self.execute(Command.PRESS_KEYCODE, data)
327 return self
328
329 def long_press_keycode(self, keycode, metastate=None):
330 """Sends a long press of keycode to the device. Android only. Possible keycodes can be
331 found in http://developer.android.com/reference/android/view/KeyEvent.html.
332
333 :Args:
334 - keycode - the keycode to be sent to the device
335 - metastate - meta information about the keycode being sent
336 """
337 data = {
338 'keycode': keycode
339 }
340 if metastate != None:
341 data['metastate'] = metastate
342 self.execute(Command.LONG_PRESS_KEYCODE, data)
343 return self
344
345 @property
346 def current_activity(self):
347 """Retrieves the current activity on the device.
348 """
349 return self.execute(Command.GET_CURRENT_ACTIVITY)['value']
350
351 def set_value(self, element, value):
352 """Set the value on an element in the application.
353
354 :Args:
355 - element - the element whose value will be set
356 - Value - the value to set on the element
357 """
358 data = {
359 'elementId': element.id,
360 'value': [value],
361 }
362 self.execute(Command.SET_IMMEDIATE_VALUE, data)
363 return self
364
365 def pull_file(self, path):
366 """Retrieves the file at `path`. Returns the file's content encoded as
367 Base64.
368
369 :Args:
370 - path - the path to the file on the device
371 """
372 data = {
373 'path': path,
374 }
375 return self.execute(Command.PULL_FILE, data)['value']
376
377 def push_file(self, path, base64data):
378 """Puts the data, encoded as Base64, in the file specified as `path`.
379
380 :Args:
381 - path - the path on the device
382 - base64data - data, encoded as Base64, to be written to the file
383 """
384 data = {
385 'path': path,
386 'data': base64data,
387 }
388 self.execute(Command.PUSH_FILE, data)
389 return self
390
391 def complex_find(self, selector):
392 """Performs a find for elements in the current application.
393
394 :Args:
395 - selector - an array of selection criteria
396 """
397 data = {
398 'selector': selector,
399 }
400 return self.execute(Command.COMPLEX_FIND, data)['value']
401
402 def background_app(self, seconds):
403 """Puts the application in the background on the device for a certain
404 duration.
405
406 :Args:
407 - seconds - the duration for the application to remain in the background
408 """
409 data = {
410 'seconds': seconds,
411 }
412 self.execute(Command.BACKGROUND, data)
413 return self
414
415 def is_app_installed(self, bundle_id):
416 """Checks whether the application specified by `bundle_id` is installed
417 on the device.
418
419 :Args:
420 - bundle_id - the id of the application to query
421 """
422 data = {
423 'bundleId': bundle_id,
424 }
425 return self.execute(Command.IS_APP_INSTALLED, data)['value']
426
427 def install_app(self, app_path):
428 """Install the application found at `app_path` on the device.
429
430 :Args:
431 - app_path - the local or remote path to the application to install
432 """
433 data = {
434 'appPath': app_path,
435 }
436 self.execute(Command.INSTALL_APP, data)
437 return self
438
439 def remove_app(self, app_id):
440 """Remove the specified application from the device.
441
442 :Args:
443 - app_id - the application id to be removed
444 """
445 data = {
446 'appId': app_id,
447 }
448 self.execute(Command.REMOVE_APP, data)
449 return self
450
451 def launch_app(self):
452 """Start on the device the application specified in the desired capabilities.
453 """
454 self.execute(Command.LAUNCH_APP)
455 return self
456
457 def close_app(self):
458 """Stop the running application, specified in the desired capabilities, on
459 the device.
460 """
461 self.execute(Command.CLOSE_APP)
462 return self
463
464 def end_test_coverage(self, intent, path):
465 """Ends the coverage collection and pull the coverage.ec file from the device.
466 Android only.
467
468 See https://github.com/appium/appium/blob/master/docs/en/android_coverage.md
469
470 :Args:
471 - intent - description of operation to be performed
472 - path - path to coverage.ec file to be pulled from the device
473 """
474 data = {
475 'intent': intent,
476 'path': path,
477 }
478 return self.execute(Command.END_TEST_COVERAGE, data)['value']
479
480 def lock(self, seconds):
481 """Lock the device for a certain period of time. iOS only.
482
483 :Args:
484 - the duration to lock the device, in seconds
485 """
486 data = {
487 'seconds': seconds,
488 }
489 self.execute(Command.LOCK, data)
490 return self
491
492 def shake(self):
493 """Shake the device.
494 """
495 self.execute(Command.SHAKE)
496 return self
497
498 def open_notifications(self):
499 """Open notification shade in Android (API Level 18 and above)
500 """
501 self.execute(Command.OPEN_NOTIFICATIONS, {})
502 return self
503
504 def _addCommands(self):
505 self.command_executor._commands[Command.CONTEXTS] = \
506 ('GET', '/session/$sessionId/contexts')
507 self.command_executor._commands[Command.GET_CURRENT_CONTEXT] = \
508 ('GET', '/session/$sessionId/context')
509 self.command_executor._commands[Command.SWITCH_TO_CONTEXT] = \
510 ('POST', '/session/$sessionId/context')
511 self.command_executor._commands[Command.TOUCH_ACTION] = \
512 ('POST', '/session/$sessionId/touch/perform')
513 self.command_executor._commands[Command.MULTI_ACTION] = \
514 ('POST', '/session/$sessionId/touch/multi/perform')
515 self.command_executor._commands[Command.GET_APP_STRINGS] = \
516 ('POST', '/session/$sessionId/appium/app/strings')
517 # TODO: remove when new Appium is out
518 self.command_executor._commands[Command.KEY_EVENT] = \
519 ('POST', '/session/$sessionId/appium/device/keyevent')
520 self.command_executor._commands[Command.PRESS_KEYCODE] = \
521 ('POST', '/session/$sessionId/appium/device/press_keycode')
522 self.command_executor._commands[Command.LONG_PRESS_KEYCODE] = \
523 ('POST', '/session/$sessionId/appium/device/long_press_keycode')
524 self.command_executor._commands[Command.GET_CURRENT_ACTIVITY] = \
525 ('GET', '/session/$sessionId/appium/device/current_activity')
526 self.command_executor._commands[Command.SET_IMMEDIATE_VALUE] = \
527 ('POST', '/session/$sessionId/appium/element/$elementId/value')
528 self.command_executor._commands[Command.PULL_FILE] = \
529 ('POST', '/session/$sessionId/appium/device/pull_file')
530 self.command_executor._commands[Command.PUSH_FILE] = \
531 ('POST', '/session/$sessionId/appium/device/push_file')
532 self.command_executor._commands[Command.COMPLEX_FIND] = \
533 ('POST', '/session/$sessionId/appium/app/complex_find')
534 self.command_executor._commands[Command.BACKGROUND] = \
535 ('POST', '/session/$sessionId/appium/app/background')
536 self.command_executor._commands[Command.IS_APP_INSTALLED] = \
537 ('POST', '/session/$sessionId/appium/device/app_installed')
538 self.command_executor._commands[Command.INSTALL_APP] = \
539 ('POST', '/session/$sessionId/appium/device/install_app')
540 self.command_executor._commands[Command.REMOVE_APP] = \
541 ('POST', '/session/$sessionId/appium/device/remove_app')
542 self.command_executor._commands[Command.LAUNCH_APP] = \
543 ('POST', '/session/$sessionId/appium/app/launch')
544 self.command_executor._commands[Command.CLOSE_APP] = \
545 ('POST', '/session/$sessionId/appium/app/close')
546 self.command_executor._commands[Command.END_TEST_COVERAGE] = \
547 ('POST', '/session/$sessionId/appium/app/end_test_coverage')
548 self.command_executor._commands[Command.LOCK] = \
549 ('POST', '/session/$sessionId/appium/device/lock')
550 self.command_executor._commands[Command.SHAKE] = \
551 ('POST', '/session/$sessionId/appium/device/shake')
552 self.command_executor._commands[Command.RESET] = \
553 ('POST', '/session/$sessionId/appium/app/reset')
554 self.command_executor._commands[Command.HIDE_KEYBOARD] = \
555 ('POST', '/session/$sessionId/appium/device/hide_keyboard')
556 self.command_executor._commands[Command.OPEN_NOTIFICATIONS] = \
557 ('POST', '/session/$sessionId/appium/device/open_notifications')
|
|