Appium 移动端自动化测试(Mac)
创始人
2024-01-29 01:07:16

目录

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使用

  • 通过官网下载Appium: Mobile App Automation Made Awesome.
    • 若失败,通过nodejs下载npm 这个链接
  • pip3 install appium-python-client
    • 若失败,参考这个博客。 pip3 install --upgrade pip --user

快速体验步骤

  1. 打开手机模拟器(Genymotion)
  2. 打开appium.app工具
  3. 创建Python项目 from appium import webdriver
from appium import webdriver
import timedesired_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'] = Truedriver = 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 = 0AIRPLANE_MODE = 1WIFI_ONLY = 2DATA_ONLY = 4ALL_NETWORK_ON = 6

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
平遥古城在哪 平遥古城基本现状 城垣恢宏,雉堞连云市井街巷,店肆林立四合院落,青砖瓦屋这里是平遥古城历经千年沧桑而古朴宛然,风姿依旧...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
平遥古城在哪 平遥古城基本现状 城垣恢宏,雉堞连云市井街巷,店肆林立四合院落,青砖瓦屋这里是平遥古城历经千年沧桑而古朴宛然,风姿依旧...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...