阅读 127

Appium 常用API

 

 

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

 

原文:https://www.cnblogs.com/juno3550/p/14648908.html

文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐