定义
测试手机程序
测试内容
java sdk
Android SDK:
下载:https://pan.baidu.com/s/1YxRMwETjE2wVRqw5JO4aSw&passwd=79i0(参考https://blog.csdn.net/qq_36662150/article/details/115181924)
解压:将Andriod_SDK解压后,将build-tools、platform-tools和tools这几个文件夹复制到到D:\software\app_test目录下。
配置ANDROID_HOME,将platform-tools、tools的路径添加到系统变量PATH。
虚拟机安装
下载夜神模拟器
默认安装到C盘,安装好后可以将整个文件夹剪切到D:\software\app_test目录下,这样便于管理。需要将夜神模拟器中的adb.exe和nox_adb.exe用platform-tools目录下的adb.exe替换。
下载并安装Appium
定义:db的全称为Android Debug Bridge,就是起到调试桥的作用。既包含ADB服务,也包含了与服务对应的Client。ADB是一个Server-Client程序,其中客户端是用来操作的电脑,服务端是android设备。
adb是android sdk里的一个工具,可以用来直接操作管理android模拟器或真实的android设备,它的主要功能有:
运行设备的shell(命令行)
管理模拟器或设备的端口映射
计算机和设备之间的文件传输
将本地apk软件安装至模拟器或android设备
常用命令
adb kill-server
adb start-server
adb devices
adb shell
adb shell getprop ro.build.version.release 获取手机android版本
adb shell dumpsys window windows | findstr mFocusedApp 获取手机当前运行的程序和界面的名称
adb push 电脑上的文件 手机上的位置
adb pull 手机上的文件 电脑上的位置
adb install 电脑上的apk文件路径 安装应用
adb uninstall 应用的包名
adb shell am start -W 包名/.启动名
adb shell am start -W com.android.settings/.Settings
运行上面这条命令,会打开设置页面。
"""
入门案例
1.自动化测试工具
选取Appium---支持的语言多、支持的平台多
坏境搭建:
1.安装appium的程序
2.在puthon中安装Appium-Python-Client
pip install Appium-Python-Client
"""
# 1.连接设备
# 组装一个字典,注明平台、系统版本、名称
# 注明要打开的应用和界面的名称
import time
from appium import webdriver
# server 启动参数
desired_caps = {}
# 1.安卓系统
desired_caps['platformName'] = 'Android'
# 2.系统的版本号
desired_caps['platformVersion'] = '7.1'
# 3.手机名称,可通过命令:adb devices获取
desired_caps['deviceName'] = '127.0.0.1:62001'
# 4.应用程序的包名,也是app的包名,在手机中,包名是app的唯一标识
# 获取手机当前运行的程序和界面的名称
# adb shell dumpsys window windows | findstr mFocusedApp
desired_caps['appPackage'] = 'com.android.settings'
# 5.当前app里面的界面内容
desired_caps['appActivity'] = '.Settings'
# 从appium库里面导入driver对象
# driver = webdriver.Remomte('appium程序的地址','一个字典,要获取设置的要求')
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
# 2.执行操作
# driver.xxx
# element = driver.find_element_by_xx()
# element.xxx
# 打开设置页面,5秒后关闭
time.sleep(5)
# 3.退出
# 退出app包
driver.close_app()
# 关闭连接对象
driver.quit()
基础API
基础操作之app安装与卸载:
# 1.连接设备
# 组装一个字典,注明平台、系统版本、名称
# 注明要打开的应用和界面的名称
import time
from appium import webdriver
# server 启动参数
desired_caps = {}
# 1.安卓系统
desired_caps['platformName'] = 'Android'
# 2.系统的版本号
desired_caps['platformVersion'] = '7.1'
# 3.手机名称,可通过命令:adb devices获取
desired_caps['deviceName'] = '127.0.0.1:62001'
# 从appium库里面导入driver对象
# driver = webdriver.Remomte('appium程序的地址','一个字典,要获取设置的要求')
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
# 2.执行操作
# 安装app应用,如哔哩哔哩(32位),apk路径使用绝对路径
# driver.install_app('D:\\software\\iBiliPlayer-bili.apk')
# 打开哔哩哔哩,获取应用信息--包名等
# adb shell dumpsys window windows | findstr mFocusedApp
# mFocusedApp=AppWindowToken{5787627 token=Token{8867341 ActivityRecord{d48ca28 u0 tv.danmaku.bili/.MainActivityV2 t18}}}
# app卸载
# driver.remove_app('tv.danmaku.bili')
# 判断应用是否已安装
if driver.is_app_installed('tv.danmaku.bili'):
# 存在则卸载应用
driver.remove_app('tv.danmaku.bili')
else:
# 不存在则安装
driver.install_app('D:\\software\\iBiliPlayer-bili.apk')
time.sleep(5)
# 3.退出
# 退出app包
driver.close_app()
# 关闭连接对象
driver.quit()
send_keys(文本内容)
可以输入文字,但对于中文,在连接设备时,要加上配置:
desired_caps['unicodeKeyboard'] = True # unicode设置(允许中文输入)
desired_caps['resetKeyboard'] = True # 键盘设置(允许中文输入)
如果对于同一个元素,多次调用此方法,会先逐个删除原有内容,再输入。
clear():清空文本框中的内容
# 1.连接设备
# 组装一个字典,注明平台、系统版本、名称
# 注明要打开的应用和界面的名称
import time
from appium import webdriver
# server 启动参数
from appium.webdriver.common.appiumby import AppiumBy
desired_caps = {}
# 1.安卓系统
desired_caps['platformName'] = 'Android'
# 2.系统的版本号
desired_caps['platformVersion'] = '7.1'
# 3.手机名称,可通过命令:adb devices获取
desired_caps['deviceName'] = '127.0.0.1:62001'
# 4.应用程序的包名,也是app的包名,在手机中,包名是app的唯一标识
# 获取手机当前运行的程序和界面的名称
# adb shell dumpsys window windows | findstr mFocusedApp
desired_caps['appPackage'] = 'com.android.settings'
# 5.当前app里面的界面内容
desired_caps['appActivity'] = '.Settings'
desired_caps['unicodeKeyboard'] = True # unicode设置(允许中文输入)
desired_caps['resetKeyboard'] = True # 键盘设置(允许中文输入
# 从appium库里面导入driver对象
# driver = webdriver.Remomte('appium程序的地址','一个字典,要获取设置的要求')
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
# 2.执行操作
# with open("aaa.xml", "w", encoding="utf-8") as f:
# # page_source 获取界面xml源码
# f.write(driver.page_source)
# 点击操作
time.sleep(2)
# driver.find_element_by_xpath("//android.widget.TextView[@resource-id='com.android.settings:id/search']").click()
# AttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'
# https://ask.csdn.net/questions/7752813
# 根据xpath查找元素,并点击
# driver.find_element(by=AppiumBy.XPATH, value="//android.widget.TextView[@resource-id='com.android.settings:id/search']").click()
driver.find_element(by=AppiumBy.XPATH, value="//*[@resource-id='com.android.settings:id/search']").click()
time.sleep(2)
driver.find_element(by=AppiumBy.XPATH, value="//*[@resource-id='android:id/search_src_text']").send_keys('WLAN')
time.sleep(2)
# 清空文本框中的内容
driver.find_element(by=AppiumBy.XPATH, value="//*[@resource-id='android:id/search_src_text']").clear()
time.sleep(2)
driver.find_element(by=AppiumBy.XPATH, value="//*[@resource-id='android:id/search_src_text']").send_keys('显示')
# 使用文本定位
# 打开设置,点击“显示”
# 使用文本定位
# driver.find_element(by=AppiumBy.XPATH, value="//*[@text='显示']").click()
# 打开设置页面,5秒后关闭
time.sleep(5)
# 3.退出
# 退出app包
driver.close_app()
# 关闭连接对象
driver.quit()
swipe(self, start_x: int, start_y: int, end_x: int, end_y: int, duration: int=0)
双击运行,点击如下图所示的按钮,就可以将模拟器的当前界面截屏。
用鼠标在界面截图上移动,右边会显示追踪到的鼠标的大概位置。
切换到设置页面,再进行界面截屏。将鼠标移动到目标元素,即可查看坐标等信息。
# 1.连接设备
# 组装一个字典,注明平台、系统版本、名称
# 注明要打开的应用和界面的名称
import time
from appium import webdriver
# server 启动参数
desired_caps = {}
# 1.安卓系统
desired_caps['platformName'] = 'Android'
# 2.系统的版本号
desired_caps['platformVersion'] = '7.1'
# 3.手机名称,可通过命令:adb devices获取
desired_caps['deviceName'] = '127.0.0.1:62001'
# 4.应用程序的包名,也是app的包名,在手机中,包名是app的唯一标识
# 获取手机当前运行的程序和界面的名称
# adb shell dumpsys window windows | findstr mFocusedApp
desired_caps['appPackage'] = 'com.android.settings'
# 5.当前app里面的界面内容
desired_caps['appActivity'] = '.Settings'
# 从appium库里面导入driver对象
# driver = webdriver.Remomte('appium程序的地址','一个字典,要获取设置的要求')
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
# 2.执行操作
# 添加滚动操作
# driver.swipe(start_x=270, start_y=720, end_x=270, end_y=240)
# driver.swipe(start_x=270, start_y=720, end_x=270, end_y=100)
driver.swipe(start_x=300, start_y=2400, end_x=300, end_y=1400)
time.sleep(5)
# 3.退出
# 退出app包
driver.close_app()
# 关闭连接对象
driver.quit()
scroll(origin_el, destination_el, duration)
# 1.连接设备
# 组装一个字典,注明平台、系统版本、名称
# 注明要打开的应用和界面的名称
import time
from appium import webdriver
# server 启动参数
from appium.webdriver.common.appiumby import AppiumBy
desired_caps = {}
# 1.安卓系统
desired_caps['platformName'] = 'Android'
# 2.系统的版本号
desired_caps['platformVersion'] = '7.1'
# 3.手机名称,可通过命令:adb devices获取
desired_caps['deviceName'] = '127.0.0.1:62001'
# 4.应用程序的包名,也是app的包名,在手机中,包名是app的唯一标识
# 获取手机当前运行的程序和界面的名称
# adb shell dumpsys window windows | findstr mFocusedApp
desired_caps['appPackage'] = 'com.android.settings'
# 5.当前app里面的界面内容
desired_caps['appActivity'] = '.Settings'
desired_caps['automationName'] = 'uiautomator2'
# 从appium库里面导入driver对象
# driver = webdriver.Remomte('appium程序的地址','一个字典,要获取设置的要求')
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
# 2.执行操作
# 添加滚动操作
# 定位元素(标签)
el1 = driver.find_element(by=AppiumBy.XPATH, value="//*[@text='更换壁纸']")
print(el1)
el2 = driver.find_element(by=AppiumBy.XPATH, value="//*[@text='显示']")
print(el2)
# scroll(origin_el, destination_el, duration)
driver.scroll(el2, el1, duration=600)
time.sleep(3)
driver.find_element(by=AppiumBy.XPATH, value="//*[@text='声音']").click()
time.sleep(5)
# 3.退出
# 退出app包
driver.close_app()
# 关闭连接对象
driver.quit()
在安卓中,拖拽=按下 等待一定时间–>移动–>松手
drag_and_drop(origin_el, destination_el)
press(self, el, x, y, pressure)
"""
如果传递了el参数,x,y可以不传;
如果el为None,则需要传递x,y;
pressure是ios专用的
"""
long_press(self, el, x, y, duration=1000)
"""
如果传递了el参数,x,y可以不传;
如果el为None,则需要传递x,y
"""
move_to(self, el, x, y)
"""
如果传递了el参数,x,y可以不传;
如果el为None,则需要传递x,y
"""
wait(self, ms) # ms:等待时间,单位为毫秒
release()
tap(self, element, x, y, count=1)
"""
tap和click的区别:
click有延迟触发效果(为了校验是不是双击)
通过tap(el,count=2)可以模拟双击
"""
# 1.连接设备
# 组装一个字典,注明平台、系统版本、名称
# 注明要打开的应用和界面的名称
import time
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from appium.webdriver.common.touch_action import TouchAction
# server 启动参数
desired_caps = {}
# 1.安卓系统
desired_caps['platformName'] = 'Android'
# 2.系统的版本号
desired_caps['platformVersion'] = '7.1'
# 3.手机名称,可通过命令:adb devices获取
desired_caps['deviceName'] = '127.0.0.1:62001'
# 4.应用程序的包名,也是app的包名,在手机中,包名是app的唯一标识
# 获取手机当前运行的程序和界面的名称
# adb shell dumpsys window windows | findstr mFocusedApp
desired_caps['appPackage'] = 'com.android.settings'
# 5.当前app里面的界面内容
desired_caps['appActivity'] = '.Settings'
# 从appium库里面导入driver对象
# driver = webdriver.Remomte('appium程序的地址','一个字典,要获取设置的要求')
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
# 2.执行操作
el1 = driver.find_element(by=AppiumBy.XPATH, value="//*[@text='通知']")
el2 = driver.find_element(by=AppiumBy.XPATH, value="//*[@text='WLAN']")
# 实例化一个动作类对象
# 创建TouchAction对象,需要把driver作为参数传递
action = TouchAction(driver)
# press 可以通过标签(元素)定位,也可以使用坐标x,y
# action.press(el1).wait(300).move_to(el2)
# 长按
# action.long_press(el1)
# 轻敲
action.tap(el2)
# 松开按键(松手)
action.release()
# 执行操作
action.perform()
time.sleep(5)
# 3.退出
# 退出app包
driver.close_app()
# 关闭连接对象
driver.quit()
# 1.连接设备
# 组装一个字典,注明平台、系统版本、名称
# 注明要打开的应用和界面的名称
import time
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from appium.webdriver.common.touch_action import TouchAction
# server 启动参数
desired_caps = {}
# 1.安卓系统
desired_caps['platformName'] = 'Android'
# 2.系统的版本号
desired_caps['platformVersion'] = '7.1'
# 3.手机名称,可通过命令:adb devices获取
desired_caps['deviceName'] = '127.0.0.1:62001'
# 4.应用程序的包名,也是app的包名,在手机中,包名是app的唯一标识
# 获取手机当前运行的程序和界面的名称
# adb shell dumpsys window windows | findstr mFocusedApp
desired_caps['appPackage'] = 'com.android.settings'
# 5.当前app里面的界面内容
desired_caps['appActivity'] = '.Settings'
# 从appium库里面导入driver对象
# driver = webdriver.Remomte('appium程序的地址','一个字典,要获取设置的要求')
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
# 2.执行操作
el1 = driver.find_element(by=AppiumBy.XPATH, value="//*[@text='通知']")
el2 = driver.find_element(by=AppiumBy.XPATH, value="//*[@text='WLAN']")
# 创建TouchAction对象,需要把driver作为参数传递
action = TouchAction(driver)
action.press(el1).wait(300).move_to(el2)
action.release()
# 事件进行提交
action.perform()
time.sleep(2)
# 点击“安全”
driver.find_element(by=AppiumBy.XPATH, value="//*[@text='安全']").click()
time.sleep(2)
# 点击“屏幕锁定”
driver.find_element(by=AppiumBy.XPATH, value="//*[@text='屏幕锁定']").click()
time.sleep(2)
# 点击“图案”
driver.find_element(by=AppiumBy.XPATH, value="//*[@text='图案']").click()
time.sleep(2)
# x=180,770 x=449, x=702
# x=182,1037
# x=180,1314
# 设置图案--“Z”字型
action.press(x=180, y=770).wait(200).move_to(x=449, y=770).wait(200).move_to(x=702, y=770)\
.wait(200).move_to(x=449, y=1037).wait(200).move_to(x=180, y=1314)\
.wait(200).move_to(x=449, y=1314).wait(200).move_to(x=702, y=1314)
action.release()
action.perform()
time.sleep(5)
# 3.退出
# 退出app包
driver.close_app()
# 关闭连接对象
driver.quit()
.device_time:获取手机时间
.get_window_size():获取屏幕大小
.network_connection:获取手机网络信息
.set_network_connection(网络模式数字):设置手机网络信息
.keyevent(按键数字):点击按键
get_screenshot_as_file/save_screenshot(图片路径):截屏
.open_notifications():打开通知栏
# 1.连接设备
# 组装一个字典,注明平台、系统版本、名称
# 注明要打开的应用和界面的名称
import time
from appium import webdriver
# server 启动参数
desired_caps = {}
# 1.安卓系统
desired_caps['platformName'] = 'Android'
# 2.系统的版本号
desired_caps['platformVersion'] = '7.1'
# 3.手机名称,可通过命令:adb devices获取
desired_caps['deviceName'] = '127.0.0.1:62001'
# 4.应用程序的包名,也是app的包名,在手机中,包名是app的唯一标识
# 获取手机当前运行的程序和界面的名称
# adb shell dumpsys window windows | findstr mFocusedApp
desired_caps['appPackage'] = 'com.android.settings'
# 5.当前app里面的界面内容
desired_caps['appActivity'] = '.Settings'
# 从appium库里面导入driver对象
# driver = webdriver.Remomte('appium程序的地址','一个字典,要获取设置的要求')
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
# 2.执行操作
# 获取当前时间
device_time = driver.device_time
print(device_time)
# 获取当前界面大小
window_size = driver.get_window_size()
print(window_size)
# 获取手机网络信息
# 1--飞行模式;2--wifi;4.移动数据 6=2+4
network_info = driver.network_connection
print(network_info)
# 截屏
"""
get_screenshot_as_file():将当前窗口的截屏保存为png图片,文件名使用绝对路径
get_screenshot_as_png():获取当前窗口截屏的二进制数据
get_screenshot_as_base64():获取截屏的base64编码数据,常用于在HTML中的嵌入图像
save_screenshot():将当前窗口的屏幕截图保存为PNG图像文件。如果存在任何IOError,则返回False,否则返回True。在文件名中使用完整路径。
"""
# 将当前窗口的截屏保存为png图片,文件名使用绝对路径
driver.get_screenshot_as_file('设置界面.png')
# 打开通知栏
driver.open_notifications()
time.sleep(5)
# 3.退出
# 退出app包
driver.close_app()
# 关闭连接对象
driver.quit()