九、UI自动化APP交互操作

交互操作

发送键

  • driver.press_keycode(code)
from appium import webdriver
import time


dict1 = {"platformName":"Android",
         "platformVersion":"7.1",
         "deviceName":"127.0.0.1:5555", # 随便填一个值, 但不能空
         "unicodeKeyboard":True, # 中文支持
        "resetKeyboard":True, # 中文支持
         "appPackage":"com.android.settings", # 启动的包名
         "appActivity":".Settings" # 界面名
         }
driver = webdriver.Remote("http://localhost:4723/wd/hub", dict1)
# driver.press_keycode(3) # 按home键
driver.find_element_by_id("dashboard_tile").click()
driver.press_keycode(4) # 按返回键
time.sleep(5)
driver.quit()

发送键对应的编号

	电话键
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

得到元素信息

  • 获取文本
    • element.text
  • 获取位置
    • element.location
  • 获取大小
    • element.size
  • 获取属性值
    • element.get_attribute(属性名)
    • 获取属性值对应的属性名和实际UIAutoMatorViewer显式的不一定一致
from appium import webdriver
import time


dict1 = {"platformName":"Android",
         "platformVersion":"7.1",
         "deviceName":"127.0.0.1:5555", # 随便填一个值, 但不能空
         "unicodeKeyboard":True, # 中文支持
        "resetKeyboard":True, # 中文支持
         "appPackage":"com.android.settings", # 启动的包名
         "appActivity":".Settings" # 界面名
         }
driver = webdriver.Remote("http://localhost:4723/wd/hub", dict1)
element = driver.find_element_by_id("dashboard_tile")
print(element.text)  # 显示元素表面文字
print(element.size)  # 显示元素大小
print(element.location) # 显示元素的位置
print(element.get_attribute("package")) # 显示元素属性package的值
time.sleep(5)
driver.quit()

滑动和拖拽

swipe滑动

  • 左右为x
  • 上下为y
  • swipe(开始x, 开始y, 结束x, 结束y, duration=None) # duration越大, 滑动惯性越大, 单位ms
driver.swipe(400, 900, 400, 200, duration=1000)

拖拽

  • driver.drag_and_drop(src, desc) # src为原元素, desc为目标元素
from appium import webdriver
import time
dict1 = {"platformName":"Android",
         "platformVersion":"7.1",
         "deviceName":"127.0.0.1:5555", # 随便填一个值, 但不能空
         "unicodeKeyboard":True, # 中文支持
        "resetKeyboard":True, # 中文支持
         "appPackage":"com.android.settings",
         "appActivity":".Settings"}
driver = webdriver.Remote("http://localhost:4723/wd/hub", dict1)
driver.implicitly_wait(10)
elements = driver.find_elements_by_id("title")
for n in elements:
    # print(n.text)
    if n.text == '更多':
        desc = n
    if n.text == '建议':
        src = n
# # 从建议拖拽到更多
driver.drag_and_drop(src, desc)
time.sleep(5)
driver.quit()

手势

手指轻敲

  • tap
from appium.webdriver.common.touch_action import TouchAction
# 设置中id等于title的元素很多, 轻敲第一个元素
element = driver.find_element_by_id("title")
action = TouchAction(driver)
action.tap(element)
action.perform()

手指按下和抬起

  • press 按下
  • release 抬起
# 设置中id等于title的元素, 按下2秒后抬起
element = driver.find_element_by_id("title")
action = TouchAction(driver)
action.press(element)
action.perform()
time.sleep(2)
action.release()
action.perform()

手指长按

  • long_press
# 设置中id等于title的元素很多, 第一个元素长按1秒
element = driver.find_element_by_id("title")
action = TouchAction(driver)
action.long_press(element, duration=1000)
action.perform()

手机操作

获取手机分辨率

  • driver.get_window_size()

截图

  • driver.get_screenshot_as_file("图片文件路径")

获取和设置手机网络

  • 获取手机网络
    • driver.network_connection
  • 设置手机网络
    • driver.set_network_connection(connectionType)
  • connectionType网络类型
    • 0(无)
    • 1(飞行模式)
    • 2(仅限wifi)
    • 4(仅限数据)
    • 6(所有网络)

打开通知栏

  • driver.open_notifications()
  • appium官方并没有为我们提供关闭通知的api,那么现实生活中怎么关闭,就怎样操作就行,比如,手指从下往上滑动,或者,按返回键

案例-移动端-系统-文件管理器

  • 打开系统 文件管理器, 点击列表中的第三个项, 用pytest框架, 并且断言用例是否成功
from appium import webdriver
import time
dict1 = {"platformName":"Android",
         "platformVersion":"7.1",
         "deviceName":"127.0.0.1:5555", # 随便填一个值, 但不能空
         "unicodeKeyboard":True, # 中文支持
        "resetKeyboard":True, # 中文支持
         "appPackage":"com.cyanogenmod.filemanager",
         "appActivity":".activities.NavigationActivity"}
driver = webdriver.Remote("http://localhost:4723/wd/hub", dict1)
driver.implicitly_wait(10)
time.sleep(2)
driver.find_elements_by_id("navigation_view_item_icon")[2].click()
assert "config" == driver.find_elements_by_id("breadcrumb_item")[1].text
time.sleep(5)
driver.quit()

Monkey

指定包名

adb shell monkey -p 包名 次数
adb shell monkey -p com.android.settings 100 # 随机测试100次
adb shell monkey -p com.tencent.news 1000

日志级别

  • -v 缺省值
  • -v -v 中级
  • -v -v -v最高级
adb shell monkey -p com.android.settings -v -v -v 100
adb shell monkey -p com.android.settings -v -v -v 100 > a.txt # 把日志重定向到指定的文件中

随机种子

  • -s (随机数种子) 用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同
adb shell monkey -p com.android.settings -s 10 100

事件间隔事件

  • --throttle 毫秒
adb shell monkey -p com.android.settings --throttle 3000 100 # 间隔3000毫秒, 一共随机操作100个事件, 每个时间间隔3000毫秒(3秒)

总结

image

posted @ 2022-05-27 19:30  鬼谷仙生  阅读(153)  评论(0编辑  收藏  举报