1. 定位方式
2. 页面操作
3. 获取界面属性、控件属性
4. 截屏
5. 打开与关闭 APP
6. 键盘事件
1. 定位方式
语法:find_element_by_定位方式(定位表达式)
通过 id 定位
两种定位表达式都可以:
driver.find_element_by_id("com.xsteach.appedu:id/rl_home_top_search") driver.find_element_by_id("rl_home_top_search")
通过 class_name 定位
取 class 的内容:
# 方式1 driver.find_element_by_class_name("android.widget.TextView") # 方式2 driver.find_elements_by_android_uiautomator(‘new UiSelector().className("android.widget.TextView")‘)[2].click()
通过 xpath 定位
driver.find_element_by_xpath("//android.widget.RadioButton[@text=‘个人中心‘]")
通过 text 定位
需要使用 uiautomator 的定位方式:
# 获取单个text元素对象 driver.find_element_by_android_uiautomator("new UiSelector().text(\"个人中心\")") # 获取多个text元素对象并使用索引 driver.find_elements_by_android_uiautomator("new UiSelector().text(\"个人中心\")")[0].click() # 部分文字匹配 driver.find_element_by_android_uiautomator(‘new UiSelector().textContains("中心")‘).click() # 正则匹配 driver.find_element_by_android_uiautomator(‘new UiSelector().textMatches(".*的课程.*")‘).click()
通过 css_selector 定位
只适用于 webview 的 html 页面,继承自 webdriver,与 pc 版本的 UI 测试一致。
driver.find_element_by_css_selector()
通过link_text定位
只适用于 webview 的 html 页面,继承自 webdriver,与 pc 版本的 UI 测试一致。
driver.find_element_by_link_text()
通过name定位
webview 容器中的 html 页面可以用 name 定位,native 并没有 name 属性。
driver.find_element_by_name()
find_element(by, value)
find_element_by_方式(value) 实际调用的都是 find_element(by,value)
需要导入这个包:from selenium.webdriver.common.by import By
# 方式一: driver.find_element_by_id("ag2”) # 方式二: driver.find_element(By.ID,"ag2") # 这个方式的好处是可以直接把操作的 by 和 value 放到一个元组里,然后调用通用方法来传参获得元素结果 cateid=(By.ID, "ag2") driver.find_element(*cateid).click()
By 操作
- By.ID 相当于 by_id
- By.CLASS_NAME 相当于 by_class_name
- By.XPATH 相当于 by_xpath
- By.NAME 相当于 by_name
- By.TAG_NAME 相当于 by_tag_name
- By.CSS_SELECTOR 相当于 by_css_selector
- By.LINK_TEXT 相当于 by_link_text
2. 页面操作
# 点击(也可以用tab实现点击操作) box = driver.find_element_by_id("com.xsteach.appedu:id/rl_home_top_search").click() # 清空 driver.find_element_by_id("editText").clear() # 上下左右滑动 ‘‘‘左滑‘‘‘ x = driver.get_window_size()[‘width‘] y = driver.get_window_size()[‘height‘] driver.swipe(x*3/4,y/4,x/4,y/4) ‘‘‘右滑‘‘‘ x = driver.get_window_size()[‘width‘] y = driver.get_window_size()[‘height‘] driver.swipe(x/4,y/4,x*3/4,y/4) ‘‘‘下滑‘‘‘ x = driver.get_window_size()[‘width‘] y = driver.get_window_size()[‘height‘] driver.swipe(x/2,y*3/4,x/2,y/4) ‘‘‘上滑‘‘‘ x = driver.get_window_size()[‘width‘] y = driver.get_window_size()[‘height‘] driver.swipe(x/2,y/4,x/2,y*3/4) # 滑动界面 from appium.webdriver.common.touch_action import TouchAction def test_scroll_down(driver): screen = driver.get_window_size() action = TouchAction(driver) action.press(x=screen[‘width‘]/2,y=screen[‘height‘]/2) action.move_to(x=0,y=-screen[‘height‘]/10) action.release() action.perform()
3. 获取界面属性、控件属性
# 获取当前Activity名称 activity = driver.current_activity # 获取屏幕宽高 creen = driver.get_window_size() # 获取控件文本 mobile_name.get_attribute(‘text‘) # 或者 mobile_name.text # 获取控件类名 mobile_name.get_attribute(‘className‘) # 判断控件是否显示 mobile_name.is_displayed() # 或者 mobile_name.get_attribute(‘displayed‘) # 获得控件位置 mobile_name.location # 获得控件大小 mobile_name.size # 查找控件子结点 parent.find_elements_by_class_name(‘android.widget.TextView‘)
同理:查找控件的方法也适用于查找子节点。对于交互后的验证,无法验证到具体的数据内容,可以验证当前的 Activity、文本,或者列表是否为空等等。
4. 截屏
与 selenium webdriver 的 API 一致:
def take_screenshot(): global DRIVER # 创建当前日期目录 dir = os.path.join(EXCEPION_PIC_PATH, get_chinese_date()) if not os.path.exists(dir): os.makedirs(dir) # 以当前时间为文件名 file_name = get_chinese_time() file_path = os.path.join(dir, file_name+".png") try: DRIVER.get_screenshot_as_file(file_path) # 返回截图文件的绝对路径 return file_path except: print("截图发生异常【{}】".format(file_path)) traceback.print_exc() return file_path
5. 打开与关闭 APP
from appium import webdriver # 配置Appium会话(Session),告诉Appium服务器需要自动化的平台和APP desired_caps = {} desired_caps[‘platformName‘] = ‘Android‘ # 手机操作系统 desired_caps[‘platformVersion‘] = ‘7.1.1‘ # 手机操作系统版本号 desired_caps[‘deviceName‘] = ‘xxxxxxxxx‘ # 设备名称(通过adb获取) desired_caps[‘appPackage‘] = ‘com.android.bbkcalculator‘ # APP包名 desired_caps[‘appActivity‘] = ‘.Calculator‘ # APP最先启动的Activity(窗体) # 打开APP,返回webdriver对象 driver = webdriver.Remote(‘http://localhost:4723/wd/hub‘, desired_caps) # 连接appium server(需先启动appium server) # 退出APP driver.quit()
6. 键盘事件
driver.press_keycode(KEYCODE)
- Appium 可以借助 PC 端 Selenium 的物理按键代码来操作
- KEYCODE 为 PC 端键盘的代号,如模拟点击返回键为 driver.press_keycode(4)
下面提供 Android keycode 参考表:
电话键
- KEYCODE_CALL 拨号键 5
- KEYCODE_ENDCALL 挂机键 6
- KEYCODE_HOME 按键Home 3
- KEYCODE_MENU 菜单键 82
- KEYCODE_BACK 返回键 4
- KEYCODE_SEARCH 搜索键 84
- KEYCODE_CAMERA 拍照键 27
- KEYCODE_FOCUS 拍照对焦键 80
- KEYCODE_POWER 电源键 26
- KEYCODE_NOTIFICATION 通知键 83
- KEYCODE_MUTE 话筒静音键 91
- KEYCODE_VOLUME_MUTE 扬声器静音键 164
- KEYCODE_VOLUME_UP 音量增加键 24
- KEYCODE_VOLUME_DOWN 音量减小键 25
控制键
- KEYCODE_ENTER 回车键 66
- KEYCODE_ESCAPE ESC键 111
- KEYCODE_DPAD_CENTER 导航键 确定键 23
- KEYCODE_DPAD_UP 导航键 向上 19
- KEYCODE_DPAD_DOWN 导航键 向下 20
- KEYCODE_DPAD_LEFT 导航键 向左 21
- KEYCODE_DPAD_RIGHT 导航键 向右 22
- KEYCODE_MOVE_HOME 光标移动到开始键 122
- KEYCODE_MOVE_END 光标移动到末尾键 123
- KEYCODE_PAGE_UP 向上翻页键 92
- KEYCODE_PAGE_DOWN 向下翻页键 93
- KEYCODE_DEL 退格键 67
- KEYCODE_FORWARD_DEL 删除键 112
- KEYCODE_INSERT 插入键 124
- KEYCODE_TAB Tab键 61
- KEYCODE_NUM_LOCK 小键盘锁 143
- KEYCODE_CAPS_LOCK 大写锁定键 115
- KEYCODE_BREAK Break/Pause键 121
- KEYCODE_SCROLL_LOCK 滚动锁定键 116
- KEYCODE_ZOOM_IN 放大键 168
- KEYCODE_ZOOM_OUT 缩小键 169
组合键
- KEYCODE_ALT_LEFT Alt+Left
- KEYCODE_ALT_RIGHT Alt+Right
- KEYCODE_CTRL_LEFT Control+Left
- KEYCODE_CTRL_RIGHT Control+Right
- KEYCODE_SHIFT_LEFT Shift+Left
- KEYCODE_SHIFT_RIGHT Shift+Right
基本
- KEYCODE_0 按键’0’ 7
- KEYCODE_1 按键’1’ 8
- KEYCODE_2 按键’2’ 9
- KEYCODE_3 按键’3’ 10
- KEYCODE_4 按键’4’ 11
- KEYCODE_5 按键’5’ 12
- KEYCODE_6 按键’6’ 13
- KEYCODE_7 按键’7’ 14
- KEYCODE_8 按键’8’ 15
- KEYCODE_9 按键’9’ 16
- KEYCODE_A 按键’A’ 29
- KEYCODE_B 按键’B’ 30
- KEYCODE_C 按键’C’ 31
- KEYCODE_D 按键’D’ 32
- KEYCODE_E 按键’E’ 33
- KEYCODE_F 按键’F’ 34
- KEYCODE_G 按键’G’ 35
- KEYCODE_H 按键’H’ 36
- KEYCODE_I 按键’I’ 37
- KEYCODE_J 按键’J’ 38
- KEYCODE_K 按键’K’ 39
- KEYCODE_L 按键’L’ 40
- KEYCODE_M 按键’M’ 41
- KEYCODE_N 按键’N’ 42
- KEYCODE_O 按键’O’ 43
- KEYCODE_P 按键’P’ 44
- KEYCODE_Q 按键’Q’ 45
- KEYCODE_R 按键’R’ 46
- KEYCODE_S 按键’S’ 47
- KEYCODE_T 按键’T’ 48
- KEYCODE_U 按键’U’ 49
- KEYCODE_V 按键’V’ 50
- KEYCODE_W 按键’W’ 51
- KEYCODE_X 按键’X’ 52
- KEYCODE_Y 按键’Y’ 53
- KEYCODE_Z 按键’Z’ 54