06. Appium拓展
2024年10月28日大约 8 分钟
06. Appium拓展
1. Toast获取
1. 认识Toast和环境搭建
类似如下图短暂提示信息,不能直接定位,但又需要测试提示信息是否正确
需要安装appium uiautomator2 driver环境
安装
- pip install uiautomator2
注意
- 安装需要管理员权限
2. 获取Toast并验证
在初始化配置中添加下面配置代码
- desired_caps['automationName'] = 'Uiautomator2'
获取toast信息
def find_toast(driver, message, timeout=3): # 定义定位toast元素xpath表达式字符串 message = "//*[contains(@text,'" + message + "')]" # 通过显示等待方式定位 element = WebDriverWait(driver, timeout, 0.1).until(lambda x: x.find_element(By.XPATH, message)) return element.text
演练
需求: 1、获取网易新闻未同意协议进行登录 --> toast消息
from time import sleep from appium import webdriver # 定义字典变量 from appium.webdriver.common.appiumby import AppiumBy desired_caps = {} # 字典追加启动参数 desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.2" desired_caps["deviceName"] = "127.0.0.1:52001" desired_caps["appPackage"] = "com.netease.newsreader.activity" desired_caps["appActivity"] = "com.netease.nr.phone.main.MainActivity" # 获取toast desired_caps['automationName'] = 'Uiautomator2' # 设置中文 desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True # 获取driver / driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps) driver.implicitly_wait(10) """ # 点击未登录 driver.find_element(AppiumBy.XPATH, "//*[@text='同意并继续']").click() driver.find_element(AppiumBy.XPATH, "//*[@text='未登录']").click() # 点击登录 driver.find_element(AppiumBy.XPATH, "//*[@text='登录']").click() # 点击微信登录 driver.find_element(AppiumBy.XPATH, "//*[@text='微信登录']").click() # 获取toast消息 msg = driver.find_element(AppiumBy.XPATH, "//*[contains(@text,'请先勾选同意')]").text print("toast消息为:", msg) sleep(3) driver.quit()
2. WebviewApp测试
1. 环境搭建
WebView App:通过手机浏览器访问的项目
特点
- 项目页面上的元素不能直接通过UiAutoMatorView查看元素
- 不能直接进行定位
- 打开项目需要先操作Native App(浏览器)网址的输入框
- 需要浏览器驱动环境才能实现
环境安装
- 查看手机/模拟器内置浏览器版本
- 根据手机端浏览器版本进行下载,查看浏览器版本号方式:设置-> 应用->全部应用->Android System WebView,查看版本号
- 下载和浏览器版本相匹配的浏览器驱动程序
- 在:http://npm.taobao.org/mirrors/chromedriver/下载和webview版本相匹配浏览器驱动
- 配置Appium工具驱动配置项
- 在appium启动时配置Chromedriver Binary Path,直接填入下载的浏览器驱动程序的完整文件路径名,在启动即可
- 查看手机/模拟器内置浏览器版本
提示
- 另外的查看方式,在PC端CMD命令行中输入:adb shell am start -a android.intent.action.VIEW -d https://liulanmi.com/labs/core.html 并回车,查看模拟器中显示的版本号
- 一般手机浏览器版本比PC端浏览器版本要低的多
2. 查看webView App元素
- 查看元素信息
- 在手机浏览器中打开要测试的网址,通产会跳转到该项目手机端网址
- 拷贝手机端网址,直接到PC端浏览器返回,通过web浏览器开发者工具即可查看
3. WebView App自动化测试实现
实现步骤
前置代码和之前相同,需要打开浏览器应用
获取驱动对象的所有上下文
- driver.contexts # ['NATIVE_APP', 'WEBVIEW_chrome', 'WEBVIEW_com.android.browser']
切换上下文<不切换无法定位>
- driver.switch_to.context("环境名称")
后续操作和web自动化编写过程一致
上下文
- webview app是在原生态Native App类 型的浏览器中访问H5类型的web项目。技术层面来讲识别和编码形式都不一样,通过上下文可以区分两种实现形式。
演练
from time import sleep from appium import webdriver # 定义字典变量 from appium.webdriver.common.appiumby import AppiumBy desired_caps = {} # 字典追加启动参数 com.tencent.news/.activity.SplashActivity desired_caps["platformName"] = "Android" desired_caps["platformVersion"] = "7.1.2" desired_caps["deviceName"] = "127.0.0.1:62001" desired_caps["appPackage"] = "com.android.browser" desired_caps["appActivity"] = ".BrowserActivity" # 设置支持中文输入, 不设置输入中文没反应 s desired_caps["unicodeKeyboard"] = True desired_caps["resetKeyboard"] = True # 获取driver / driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps) driver.implicitly_wait(10) # 最后默认页设置空白页 sleep(5) # 避免输入框获取不到焦点,导致回车键失效,这里模拟点击获取焦点。 driver.find_element(AppiumBy.XPATH, "//*[@resource-id='com.android.browser:id/url']").click() sleep(1) driver.find_element(AppiumBy.XPATH, "//*[@resource-id='com.android.browser:id/url']").send_keys("https://m.baidu.com/") sleep(1) # 输入回车 driver.press_keycode(66) sleep(3) # 获取当前所有的环境 NATIVE_APP:原生应用, WEBVIEW_xxx 表示H5页面 print(driver.contexts) # ['NATIVE_APP', 'WEBVIEW_chrome', 'WEBVIEW_com.android.browser'] # 切换到H5环境 driver.switch_to.context("WEBVIEW_com.android.browser") # 定位元素操作,使用selenium的方式 driver.find_element(AppiumBy.XPATH, "//*[@id='index-kw']").send_keys("helloworld") sleep(3) # 切换到Nativeapp原生环境 driver.switch_to.context("NATIVE_APP") sleep(3) driver.find_element(AppiumBy.XPATH, "//*[@resource-id='com.android.browser:id/url']").send_keys("https://m.taobao.com/") sleep(3) driver.quit()
问题
1. 根据提示下载对应系统、版本的驱动程序 下载地址:http://chromedriver.storage.googleapis.com/index.html 2. 指定chomedriver的路径 # 指定浏览器和驱动地址 desired_caps['broserName'] = 'Chrome' # 选配 desired_caps['chromedriverExecutable'] = 'C:\\Users\\lxtao\\Desktop\\chromedriver.exe'
from time import sleep
from appium import webdriver
# 定义字典变量
from appium.webdriver.common.appiumby import AppiumBy
desired_caps = {}
# 字典追加启动参数 com.tencent.news/.activity.SplashActivity
desired_caps["platformName"] = "Android"
desired_caps["platformVersion"] = "7.1.2"
desired_caps["deviceName"] = "127.0.0.1:62001"
desired_caps["appPackage"] = "com.android.browser"
desired_caps["appActivity"] = ".BrowserActivity"
# 指定浏览器和驱动地址
desired_caps['broserName'] = 'Chrome' # 选配
desired_caps['chromedriverExecutable'] = 'C:\\Users\\lxtao\\Desktop\\chromedriver.exe'
# 设置支持中文输入, 不设置输入中文没反应 s
desired_caps["unicodeKeyboard"] = True
desired_caps["resetKeyboard"] = True
# 获取driver /
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
driver.implicitly_wait(10)
# 最后默认页设置空白页
sleep(5)
# 避免输入框获取不到焦点,导致回车键失效,这里模拟点击获取焦点。
driver.find_element(AppiumBy.XPATH, "//*[@resource-id='com.android.browser:id/url']").click()
sleep(1)
# 获取元素,发送文本
driver.find_element(AppiumBy.XPATH, "//*[@resource-id='com.android.browser:id/url']").send_keys("https://m.baidu.com/")
sleep(1)
# 输入回车
driver.press_keycode(66)
sleep(3)
# 获取当前所有的环境 NATIVE_APP:原生应用, WEBVIEW_xxx 表示H5页面
print(driver.contexts) # ['NATIVE_APP', 'WEBVIEW_chrome', 'WEBVIEW_com.android.browser']
# 切换到H5环境
driver.switch_to.context("WEBVIEW_com.android.browser")
# 定位元素操作,使用selenium的方式
# 发送搜索关键字
driver.find_element(AppiumBy.XPATH, "//*[@id='index-kw']").send_keys("helloworld")
# 点击搜索
driver.find_element(AppiumBy.XPATH, "//*[@id='index-bn']").click()
sleep(3)
# 切换到Nativeapp原生环境
driver.switch_to.context("NATIVE_APP")
sleep(3)
# 操作原生应用
driver.find_element(AppiumBy.XPATH, "//*[@resource-id='com.android.browser:id/url']").click()
driver.find_element(AppiumBy.XPATH, "//*[@resource-id='com.android.browser:id/url']").send_keys("https://m.taobao.com/")
driver.press_keycode(66)
sleep(3)
driver.quit()
3. Money
1. 认识monkey
monkey:主要用于Android 的压力测试自动的一个压力测试小工具, 主要目的就是为了测试app是否会Crash.
安装
不需要安装,Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar;
启动方式
- 可以通过PC机CMD窗口中执行
- adb shell monkey {+命令参数}来进行Monkey测试;
- 在PC上adb shell 进入Android系统,通过执行 monkey {+命令参数}来进行Monkey 测试;
- 使用monkey测试包随机事件100次输入日志文件
- adb shell monkey -p cn.goapk.market 100 > 路径/log.txt
- 使用monkey测试包随机事件100次输入日志文件
- 可以通过PC机CMD窗口中执行
2. monkey指令
指定app包
- -p
- 用此参数指定一个或多个包。指定包之后,monkey将只允许系统启动指定的app。
- 如果不指定包列表, monkey将允许系统启动设备中的所有app。
- adb shell monkey -p fishjoy.control.menu –p cn.goapk.market 100
- -p
日志级别
- -v 通过多个-v的个数来指定查看日志级别,次数放到 -v后边。
- -v :缺省值,仅提供启动提示、测试完成和最终结果等少量 信息
- -v -v :提供较为详细的日志,包括每个发送到Activity的事 件信息
- -v -v -v:最详细的日志,包括了测试中选中/未选中的 Activity信息
- adb shell monkey -p cn.goapk.market -v -v 100
- -v 通过多个-v的个数来指定查看日志级别,次数放到 -v后边。
随机种子数
- -s (随机数种子) 用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同,一般用于复现bug
- monkey测试1:adb shell monkey -p cn.goapk.market –s 10 100
- monkey测试2:adb shell monkey -p cn.goapk.market –s 10 100
事件间隔时间
- --throttle <毫秒>
- adb shell monkey -p cn.goapk.market --throttle 3000 100
参数 -s:
用于指定伪随机数生成器的seed值
命令:adb shell monkey -p 包名 –s seed值 执行次数
作用:如果seed值相同,则两次Monkey测试所产生的事件序列也相同的。
示例:
测试1:adb shell monkey -p com.qq –s 15888 100
测试2:adb shell monkey -p com.qq –s 15888 100
说明:
两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。(也就是说,重复执行上次的随机操作)
操作序列虽然是随机生成的,但是只要我们指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随机的;
其他了解指令
3. monkey日志分析
执行
- 一般在功能测试完毕之后
- 执行方式:
- 多次小批量事件测试 ≤10W次事件
- 大批量随机性测试
- 执行方式:
- 一般在功能测试完毕之后
正常情况
- 如果Monkey测试顺利执行完成,在log的最后,会打印出当前执行事件的次数和所花费的时间; //Monkey finished 代表执行完成
异常情况
- 执行过程中出现无响应、崩溃或异常退出后,打开日志进行分析
- 程序无响应的问题: 在日志中搜索 “ANR” (可能仅仅是因为卡)
- 崩溃问题:在日志中搜索 “Exception” (如果出现空指针, NullPointerException) 肯定是有bug Monkey执行中断,在log最后也能看到当前执行次数
- 执行过程中出现无响应、崩溃或异常退出后,打开日志进行分析
4. Monkey测试时禁止下拉状态栏
adb shell monkey -p com.xiaoduo.mydagong.mywork.sit --ignore-crashes --ignore-timeouts --pct-touch 100 --throttle 200 -s 200 -v -v -v 1000 > a.log
Monkey 测试,随机点击。会下拉状态栏,关闭WiFi,打开GPS,打开蓝牙,打开飞行模式等一系列操作,严重干扰程序的测试,尤其是对网络状态下的耗电量测试。
下面的命令可以禁止 Monkey测试下,手机操作状态栏。
adb shell settings put global policy_control immersive.full=* 关闭手机的状态栏
adb shell settings put global policy_control null 开启手机状态栏
然而 WiFi还是会被关闭,下拉滑动比较大时,还是会滑出状态栏。
解决办法是,monkey测试时,用命令控制,Monkey测试的比例,将 touch 比例设置为100%,就会自动禁止掉滑动操作,就不会拉出操作栏,关闭WiFi,修改系统设置了。