1 press_keycode
1.1 键盘操作
press_keycode
是Appium
的键盘相关函数;
- 可以实现键盘的相关操作,比如返回、按键、音量调节等等;
- 函数使用方法为:
driver.press_keycode(KeyCode)
1.2 关于KeyCode
- 以上
press_keycode
方法中传入参数KeyCode
,而KeyCode
是对应的键值码;
- 其可以传入对应的键值名,也可以传入具体键值名的值(对应数字)。
1.3 press_keycode源码
def press_keycode(self, keycode: int, metastate: Optional[int] = None, flags: Optional[int] = None) -> 'WebDriver':
"""Sends a keycode to the device.
Android only. Possible keycodes can be found
in http://developer.android.com/reference/android/view/KeyEvent.html.
Args:
keycode: the keycode to be sent to the device
metastate: meta information about the keycode being sent
flags: the set of key event flags
Returns:
Union['WebDriver', 'Keyboard']: Self instance
"""
ext_name = 'mobile: pressKey'
args = {
'keycode': keycode}
if metastate is not None:
args['metastate'] = metastate
if flags is not None:
args['flags'] = flags
try:
self.assert_extension_exists(ext_name).execute_script(ext_name, args)
except UnknownMethodException:
self.mark_extension_absence(ext_name).execute(Command.PRESS_KEYCODE, args)
return cast('WebDriver', self)
- 从源码中可以看出,想要找到对应的键值名可以直接去官网查看。
1.4 电话键相关
键值名 |
说明 |
键值 |
KEYCODE_HOME |
HOME 键 |
3 |
KEYCODE_BACK |
返回键 |
4 |
KEYCODE_CALL |
拨号键 |
5 |
KEYCODE_EKDCALL |
挂机键 |
6 |
KEYCODE_VOLUME_UP |
音量增加键 |
24 |
KEYCODE_VOLUME_DOWN |
音量减减键 |
25 |
KEYCODE_POWER |
电源键 |
26 |
KEYCODE_CAMERA |
拍照键 |
27 |
KEYCODE_MENU |
菜单键 |
82 |
KEYCODE_NOTIFICATION |
通知键 |
83 |
KEYCODE_SEARCH |
搜索键 |
84 |
1.5 控制键相关
键值名 |
说明 |
键值 |
KEYCODE_DPAD_UP |
导航键 向上 |
19 |
KEYCODE_DPAD_DOWN |
导航键 向下 |
20 |
KEYCODE_DPAD_LEFT |
导航键 向左 |
21 |
KEYCODE_DPAD_RIGHT |
导航键 向右 |
22 |
KEYCODE_DPAD_CENTER |
导航键 确定键 |
23 |
KEYCODE_TAB |
TAB 键 |
61 |
KEYCODE_ENTER |
回车键 |
66 |
KEYCODE_DEL |
退格键 |
67 |
KEYCODE_ESCAPE |
ESC 键 |
111 |
KEYCODE_FORWARD_DEL |
删除键 |
112 |
KEYCODE_CAPS_LOCK |
大写锁定键 |
115 |
KEYCODE_SCROLL_LOCK |
滚动锁定键 |
116 |
1.6 基本按键相关
- 以下为部分(非全部,仅参考)基本按键相关键值名:
- 其中按键0-9键值为7-16,比如:
键值名 |
说明 |
键值 |
KEYCODE_0 |
按键’0’ |
7 |
KEYCODE_1 |
按键’1’ |
8 |
KEYCODE_2 |
按键’2’ |
9 |
键值名 |
说明 |
键值 |
KEYCODE_A |
按键’A’ |
29 |
KEYCODE_B |
按键’B’ |
30 |
KEYCODE_C |
按键’C’ |
31 |
1.7 组合键相关
键值名 |
说明 |
KEYCODE_ALT_LEFT |
ALT+LIFT |
KEYCODE_ALEERT_RIGHT |
ALT_RIGHT |
KEYCODE_CTRL_LEFT |
Ctrl_lEFT |
KEYCODE_CTRL_RIGHT |
Ctrl_RIGHT |
KEYCODE_SHIFT_LEFT |
Shift+lEFT |
KEYCODE_SHIFT_RIGHT |
Shift+RIGHT |
1.8 符号键相关
键值名 |
说明 |
KEYCODE_PLUS |
按键’+’ |
KEYCODE_MINUS |
按键’-’ |
KEYCODE_STAR |
按键’*’ |
KEYCODE_SLASH |
按键’/’ |
KEYCODE_EQUALS |
按键’=’ |
KEYCODE_AT |
按键’@’ |
KEYCODE_POUND |
按键’#’ |
KEYCODE_SPACE |
空格键 |
1.9 使用举例
driver.press_keycode(4)
driver.press_keycode(84)
driver.keyevent(66)
driver.keyevent(67)
2 swip方法
2.1 swip说明
swip()
方法是从一个坐标位置滑动到另一个坐标位置;
- 也就是说两点之间的滑动。
2.2 swip使用方法
def swipe(self, start_x: int, start_y: int, end_x: int, end_y: int, duration: int = 0) -> 'WebDriver':
"""Swipe from one point to another point, for an optional duration.
Args:
start_x: x-coordinate at which to start
start_y: y-coordinate at which to start
end_x: x-coordinate at which to stop
end_y: y-coordinate at which to stop
duration: defines the swipe speed as time taken to swipe from point a to point b, in ms.
Usage:
driver.swipe(100, 100, 100, 400)
Returns:
Union['WebDriver', 'ActionHelpers']: Self instance
"""
touch_input = PointerInput(interaction.POINTER_TOUCH, "touch")
actions = ActionChains(self)
actions.w3c_actions = ActionBuilder(self, mouse=touch_input)
actions.w3c_actions.pointer_action.move_to_location(start_x, start_y)
actions.w3c_actions.pointer_action.pointer_down()
if duration > 0:
actions.w3c_actions = ActionBuilder(self, mouse=touch_input, duration=duration)
actions.w3c_actions.pointer_action.move_to_location(end_x, end_y)
actions.w3c_actions.pointer_action.release()
actions.perform()
return cast('WebDriver', self)
- 从以上看需要至少四个参数
swipe(self, start_x: int, start_y: int, end_x: int, end_y: int)
;
2.3 使用示例
- 比如坐标从(100,200)滑动到(300,400):
driver.swipe(100, 200, 300, 400)
- 再比如从(400,500)滑动到(600,700)持续3秒:
driver.swipe(400, 500, 600, 700, 3000)
3 scroll方法
scroll()
方法是从一个元素滑动到另一个元素,直到页面自动停止;
- 使用方法为:
def scroll(self, origin_el: WebElement, destination_el: WebElement, duration: Optional[int] = None) -> 'WebDriver':
"""Scrolls from one element to another
Args:
origin_el: the element from which to begin scrolling (center of element)
destination_el: the element to scroll to (center of element)
duration: defines speed of scroll action when moving from originalEl to destinationEl.
Default is 600 ms for W3C spec.
Usage:
driver.scroll(el1, el2)
user_name = driver.find_element(AppiumBy.XPATH, "//*[@text='用户名']")
user_passwd = driver.find_element(AppiumBy.XPATH, "//*[@text='密码']")
driver.scroll(user_name, user_passwd)
4 drag_and_drop方法
drag_and_drop()
方法从一个元素滑动到另一个元素,第二个元素代替第一个元素原本屏幕上的位置;
- 使用方法为:
def drag_and_drop(self, origin_el: WebElement, destination_el: WebElement) -> 'WebDriver':
"""Drag the origin element to the destination element
Args:
origin_el: the element to drag
destination_el: the element to drag to
Returns:
Union['WebDriver', 'ActionHelpers']: Self instance
"""
user_name = driver.find_element(AppiumBy.XPATH, "//*[@text='用户名']")
user_passwd = driver.find_element(AppiumBy.XPATH, "//*[@text='密码']")
driver.drag_and_drop(user_name, user_passwd)
5 TouchAction方法
TouchAction
可实现手势的操作,比如滑动、拖动、长按等操作;
- 使用方法是先需要导入
TouchAction
:
from appium.webdriver.common.touch_action import TouchAction
5.1 tap方法
tap()
方法模拟手指对某个元素或坐标按下并快速抬起;
- 使用方法为:
def tap(
self,
element: Optional['WebElement'] = None,
x: Optional[int] = None,
y: Optional[int] = None,
count: int = 1,
) -> 'TouchAction':
"""Perform a tap action on the element
Args:
element: the element to tap
x : x coordinate to tap, relative to the top left corner of the element.
y : y coordinate. If y is used, x must also be set, and vice versa
TouchAction(driver).tap(user_name).perform()
5.2 press方法
def press(
self,
el: Optional['WebElement'] = None,
x: Optional[int] = None,
y: Optional[int] = None,
pressure: Optional[float] = None,
) -> 'TouchAction':
"""Begin a chain with a press down action at a particular element or point
Args:
el: the element to press
x: x coordiate to press. If y is used, x must also be set
y: y coordiate to press. If x is used, y must also be set
TouchAction(driver).press(x=100, y=200).perform()
5.3 release方法
release()
方法是模拟手指抬起;
- 使用方法:
def release(self) -> 'TouchAction':
"""End the action by lifting the pointer off the screen
Returns:
`TouchAction`: Self instance
"""
self._add_action('release', {
})
return self
TouchAction(driver).press(x=100, y=200).release().perform()
5.4 wait方法
def wait(self, ms: int = 0) -> 'TouchAction':
"""Pause for `ms` milliseconds.
Args:
ms: The time to pause
Returns:
`TouchAction`: Self instance
"""
TouchAction(driver).press(x=100, y=200).wait(3000).release().perform()
5.5 move_to方法
move_to()
方法是模拟手指移动;
- 使用方法:
def move_to(
self, el: Optional['WebElement'] = None, x: Optional[int] = None, y: Optional[int] = None
) -> 'TouchAction':
"""Move the pointer from the previous point to the element or point specified
Args:
el: the element to be moved to
x: x coordiate to be moved to. If y is used, x must also be set
y: y coordiate to be moved to. If x is used, y must also be set
Returns:
`TouchAction`: Self instance
"""
TouchAction(driver).press(x=400, y=500).move_to(500, 600).perform()