Appium 移动端自动化测试(Mac)

目录

adb调试工具(Android Debug Bridge)

 adb常用命令

Appium使用

快速体验步骤

Appium常用方法

UIAutomatorViewer 获取元素

元素等待(在指定时间内一直等待

元素操作

Swipe 滑动和拖拽事件(Scroll、drag_and_drop)

手势操作TouchAction

手机操作API(分辨率、按钮、截图、网络、通知栏)

网络补充:


0. 环境基础

  • Java(jdk 1.8)
  • Android SDK(adb)
  • Android模拟器(Genymotion、VirtualBox)

adb调试工具(Android Debug Bridge)

adb包含三个部分:

  1. Client端:运行在开发电脑上,负责发送adb命令
  2. Daemon守护进程:运行在手机(或模拟器),负责接收和执行adb命令
  3. Server端:运行在开发电脑上,负责管理Client端和手机Daemon之间的通信

adb工作原理:

  1. Client端将命令发送给Server端
  2. Server端将命令发送给Daemon端
  3. Daemon端执行
  4. Daemon端将执行结果,返回给Server端
  5. Server端将结果再返回给Client端

 adb常用命令

获取当前包名界面名(告诉手机测试哪个应用程序的哪个一个界面

  • 包名(package):一个应用程序的唯一ID
  • 界面名(activity):一个界面名对应一个界面

adb shell dumpsys window | grep mFocusedApp

        返回结果中,“/” 前的为包名,“/” 后的为界面名

 文件传输

从电脑发送文件到手机: adb push 电脑文件路径 手机的文件夹路径

从手机中拉取文件:adb pull 手机文件路径 电脑的文件夹路径

获取app启动时间

adb shell am start -w 包名/启动名

  • ThisTime:该界面(activity)启动耗时(毫秒)
  • TotalTime:应用自身启动耗时 = ThisTime + 应用application等资源启动时间(毫秒)
  • WaitTime:系统启动应用耗时 = TotalTime + 系统资源启动时间(毫秒)

点击图标 -> 系统资源调度 -> application程序启动 -> activity界面加载 -> 界面展示完成

获取手机日志

adb logcat

找日志中at……前面 第一个字符为 "E" 的均为错误信息

  • 安装app到手机                                adb install 路径/xx.apk
  • 卸载手机上的app                             adb uninstall 包名
  • 获取当前电脑已经连接的设备          adb devices
  • 进入到安卓手机内部的Linux            adb shell     exit退出Linux

# 重启adb服务

  • 启动adb服务器                                adb start-server
  • 停止adb服务器                                adb kill-server
  • 查看adb帮助                                    adb --help

Appium使用

快速体验步骤

  1. 打开手机模拟器(Genymotion)
  2. 打开appium.app工具
  3. 创建Python项目 from appium import webdriver
from appium import webdriver
import time

desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '10'
# 设备名,按默认,主要用于限制iOS
desired_caps['deviceName'] = '192.168.56.101:5555'
# 包名
desired_caps['appPackage'] = 'com.android.settings'
# 界面名
desired_caps['appActivity'] = '.Settings'

# 解决中文输入问题
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(5)
driver.quit()

原理:

  • appium实际上在本机上使用4723端口开启了一个服务
  • Python代码通过访问本机的服务器,获取driver对象
  • appium将我们的driver对象调用的方法转化成POST请求,提交给appium服务器
  • appium通过接收到的POST请求发送给手机,再由手机进行执行

Appium常用方法

# 打开指定包指定界面
driver.start_activity(“appPackage包名”, “appActivity界面名”)

# 获取包名
driver.current_package
# 获取界面名
driver.current_activity

# ——————关——————闭——————
# 关闭当前app,不关闭驱动对象
driver.close_app()
# 关闭驱动对象,同时关闭所有关联的app
driver.quit()

# ——————安装卸载及是否安装——————
# 安装app
driver.install_app("app_path apk安装包路径")
# 卸载app
driver.remove_app("app_id 包名")
# 判断app是否已经安装
driver.is_app_installed("app_id 包名")

# ——————将应用置于后台——————
driver.background_app(seconds 秒数)

UIAutomatorViewer 获取元素

启动该程序使用Device Screenshot工具获取元素特征信息

# 通过id定位(resource id)
driver.find_element_by_id("id-value").click() #并点击
# 通过class_name定位
driver.find_element_by_class_name("class-value").send_keys("hello") #并输入hello
# 通过xpath定位 # 包含则使用://*[contains(@变量名,'xx')]
driver.find_element_by_xpath("xpath-value表达式://*[@变量名='xx']")

# 定位一组元素 by_id / by_class_name / by_xpath
driver.find_elements_by_id("xxxx")

元素等待(在指定时间内一直等待

# 隐式等待(秒),全局有效
driver.implicitly_wait(20)

# 显式等待,对单个元素有效
from selenium.webdriver.support.wait import WebDriverWait
wait = WebDriverWait(driver, 5)
# 仅对修饰元素有效
back_button = wait.until(lambda x: x.find_element_by_xpath("xxxx"))
back_button.click()

元素操作

element.click()
element.send_keys("xxx")
# 清空输入框内容
element.clear()
# 获取元素内容
element.text
element.location
element.size

# 获取元素属性 如:name(content-desc / text)、resourceId、className、enabled、clickable")
element.get_arribute("属性名")

Swipe 滑动和拖拽事件(Scroll、drag_and_drop)

# Swipe 从一个坐标滑动到另一个坐标,duration 滑动持续时间长短,单位:ms
driver.swipe(start_x, start_y, end_x, end_y, duration=None)

# scroll 从一个元素滑动到另一个元素,直到页面惯性结束自动停止
button1 = driver.find_element_by_id("xxx")
button2 = driver.find_element_by_id("xxxx")
driver.scroll(button1, button2)

# drag_and_drop 从一个元素滑动到另一个,第二个元素代替第一个元素的位置
driver.drag_and_drop(button1, button2)

手势操作TouchAction

# 创建TouchAction对象
touch_action = TouchAction(driver)
# 轻敲
touch_action = touch_action.tap(element=元素, x=xxx, y=xxx, count=次数)
# 执行
touch.perform()
  1. 创建TouchAction对象
  2. 通过对象调用执行手势
  3. perform() 执行动作

轻点tap、按下press、抬起release、等待wait、长按long_press、移动move_to

# 轻敲 tap(element,x,y,count)
TouchAction(driver).tap(element=元素, x=xxx, y=xxx, count=次数).perform()
# 按下和抬起 press、release
TouchAction(driver).press(x=xxx, y=xxx).release().press()..release().perform()
# 等待 wait (单位:ms)
TouchAction(driver).press(x=xxx, y=xxx).wait(2000).release().perform()
# 长按 long_press
TouchAction(driver).long_press(element, x=坐标, y=坐标, duration=持续时间).perform()
# 移动 move_to
TouchAction(driver).press(x=坐标, y=坐标).move_to(x=坐标, y=坐标).release().perform()

手机操作API(分辨率、按钮、截图、网络、通知栏)

Android KeyCode:Android KeyCode列表_51CTO博客_event.keycode

# 获取手机分辨率
driver.get_window_size()
# 截图
driver.get_screenshot_as_file("path.filename")

# 获取网络
print(driver.network_connection)
# 设置网络
driver.set_network_connection(数字0-6)

# 发送键到设备 Android Keycode
driver.press_keycode("keycode", metastate=None)
# 打开通知栏
driver.open_notifications()
# 返回键
driver.press_keycode(4)

网络补充:

from appium.webdriver.connectiontype import ConnectionType

class ConnectionType:
    NO_CONNECTION = 0
    AIRPLANE_MODE = 1
    WIFI_ONLY = 2
    DATA_ONLY = 4
    ALL_NETWORK_ON = 6

猜你喜欢

转载自blog.csdn.net/qq_52057693/article/details/127882383