本文为霍格沃兹测试学院学员学习笔记。
本系列文章汇总了从 Appium 自动化测试从基础到框架高级实战中,所涉及到的方方面面的知识点精华内容(如下所示),希望对大家快速总结和复习有所帮助。
Appium 自动化测试从基础到框架实战
- Appium 基础 1 (环境搭建和简介)
- Appium 基础 2 (元素定位和元素常用方法)
- Appium 基础 3 (手势操作和 uiautomator 查找元素)
- Appium 基础 4 (显式等待)
- Appium 基础 5 (toast 和参数化)
- Appium 基础 6 (webview)
- Appium_ 企业微信练习 (非 PO,增加和删除联系人)
- Appium_ 企业微信练习 ( PO--增加联系人)
本文为第三篇,主要讲解 Appium Toast、参数化、WebView(附实例代码)。
Toast
含义
- 为了给当前视图显示一个浮动的显示块,与 dialog 不同它永远不会获得焦点;
- 显示时间有限,根据用户设置的显示时间后自动消失;
- 本身是个系统级别的控件,它归属系统 settings,当一个 App 发送消息的时候,不是自己造出来的这个弹框,它是发给系统,由系统统一进行弹框,这类的控件不在 App 内、需要特殊的控件识别方法;
Toast 定位
- Appium 使用 UIAutomator 底层的机制来分析抓取 toast,并且把 toast 放到控件树里面,但本身并不属于控件
- AutoMationName:UIAutomator2 这个是 Appium 本身的设置就自带的,不需要额外添加,默认就是UIAutomator2;
- getPageSource 是无法找到 Toast 的;
- 必须使用 Xpath 去查找:
- //*[@class="android.widget.Toast"]
- //*[contains(@text,"xxxxx")]
实例:Appium 自带的 App 测试 Toast
- adb shell dumpsys window | findstr mCurrent
- 这个命令可以找到当前的 activity,不知道 Android 高版本是不是还 ok,由于 API Demo 权限高,可直接跳到这个 activity 运行,其他 App 就不 ok 了;
- driver.page_source 可以打印当前的页面,可以找到 Toast 的伪控件;
- 打印 toast 的 text 出来;
driver.page_source 打印出来的东西,包含 Toast
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<hierarchy index="0" class="hierarchy" rotation="3" width="810" height="1440">
<android.widget.FrameLayout index="0" package="io.appium.android.apis" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,0][810,1440]" displayed="true">
<android.view.ViewGroup index="0" package="io.appium.android.apis" class="android.view.ViewGroup" text="" resource-id="android:id/decor_content_parent" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,0][810,1440]" displayed="true">
<android.widget.FrameLayout index="0" package="io.appium.android.apis" class="android.widget.FrameLayout" text="" resource-id="android:id/action_bar_container" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,41][810,136]" displayed="true">
<android.view.ViewGroup index="0" package="io.appium.android.apis" class="android.view.ViewGroup" text="" resource-id="android:id/action_bar" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,41][810,136]" displayed="true">
<android.widget.TextView index="0" package="io.appium.android.apis" class="android.widget.TextView" text="Views/Popup Menu" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[27,65][324,111]" displayed="true" />
</android.view.ViewGroup>
</android.widget.FrameLayout>
<android.widget.FrameLayout index="1" package="io.appium.android.apis" class="android.widget.FrameLayout" text="" resource-id="android:id/content" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,136][810,1440]" displayed="true">
<android.widget.LinearLayout index="0" package="io.appium.android.apis" class="android.widget.LinearLayout" text="" checkable="false" checked="false" clickable=