app自动化测试(Android)– 特殊控件 Toast 识别

本文介绍了如何使用Appium自动化测试工具来捕获和测试Android应用程序中的Toast提示。通过示例代码展示了如何设置环境、操作模拟器以及定位并打印Toast信息。在测试过程中,利用XPath表达式定位Toast元素,并通过隐式等待确保能够成功获取短暂显示的Toast。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Toast 是 Android 系统中的一种消息框类型,它属于一种轻量级的消息提示,常常以小弹框的形式出现,一般出现 1 到 2 秒会自动消失,可以出现在屏幕上中下任意位置。它不同于 Dialog,它没有焦点。Toast 的设计思想是尽可能的不引人注意,同时还向用户显示信息希望他们看到。

测试 APP 下载地址:

https://github.com/appium/sample-code/raw/master/sample-code/apps/ApiDemos/bin/ApiDemos-debug.apk

首先将上面地址的 apk 包下载到本地,并安装到模拟器中;在模拟器中打开 API Demos,依次点击“Views”-“Popup Menu”-“Make a Popup”-“Search”,就会弹出消息提示框,如图:

image969×454 77.7 KB

上图中 “Clicked popup menu item Search” 就是 Toast,但它通常在页面上停留的时间只有 2 秒左右,通过 Appium Inspector 一般不容易获取到这个元素。

获取Toast

在模拟器中打开 API Demos 应用,依次点击 “Views”-“Popup Menu”-“Make a Popup”-“Search”,查看页面 Toast 元素。

示例代码如下:

# 设置 capabilities
caps = {}
caps["platformName"] = "Android"
caps["appPackage"] = "io.appium.android.apis"
caps["appActivity"] = ".ApiDemos"
#必须使用uiautomator2框架
caps["automationName"] = "uiautomator2"
caps["deviceName"] = "hogwarts"
# 与Appium Server 建立连接
driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
# 设置隐式等待
driver.implicitly_wait(5)

# 点击 Views
driver.find_element_by_accessibility_id("Views").click()
# 滑动页面
TouchAction(driver).press(380, 1150)\
  .move_to(380, 150).release().perform()
# 点击 `Popup Menu` 项目
driver.find_element_by_xpath(
  "//*[@content-desc='Popup Menu']").click()
# 点击 `Make a Popup`
driver.find_element_by_xpath(
  "//*[@content-desc='Make a Popup!']").click()
# 点击 'Search'
driver.find_element_by_xpath("//*[contains(@text,'Search')]").click()
toastXPath = "//*[@class='android.widget.Toast']"
#打印 toastXPath
print(driver.find_element_by_xpath(toastXPath))
#打印 toastXPath 获取的 text
print(driver.find_element_by_xpath(toastXPath).text)

@BeforeAll
public static void setUp() throws MalformedURLException {
    DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
    desiredCapabilities.setCapability("platformName", "Android");
    desiredCapabilities.setCapability("appPackage", "io.appium.android.apis");
    desiredCapabilities.setCapability("appActivity", ".ApiDemos");
    desiredCapabilities.setCapability("automationName", "uiautomator2");
    desiredCapabilities.setCapability("deviceName", "hogwarts");

    URL remoteUrl = new URL("http://127.0.0.1:4723/wd/hub");
    driver = new AndroidDriver(remoteUrl, desiredCapabilities);
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}

@Test
public void toastTest() {
    //点击 Views
    driver.findElement(MobileBy.AccessibilityId("Views")).click();
    //滑动页面
    TouchAction action = new TouchAction(driver);
    PointOption pressPointOne = PointOption.point(380, 1150);
    PointOption movePointOne = PointOption.point(380, 150);
    action.press(pressPointOne).moveTo(movePointOne).release();
    //点击 `Popup Menu` 项目
    driver.findElement(By.xpath("//*[@content-desc='Popup Menu']")).click();
    //点击 `Make a Popup`
    driver.findElement(By.xpath("//*[@content-desc='Make a Popup!']")).click();
    //点击 'Search'
    driver.findElement(By.xpath("//*[contains(@text,'Search')]")).click();
    By toastXPath = By.xpath("//*[@class='android.widget.Toast']");
    //打印 toastXPath
    System.out.println(driver.findElement(toastXPath));
    //打印 toastXPath 获取的 text
    System.out.println(driver.findElement(toastXPath).getText());
}

这里定位 Toast 使用了 Xpath 表达式进行定位,因为 Toast 的 class 属性比较特殊,在当前页面上一般会出现一次 class=“android.widget.Toast” 的元素,所以使用 Xpath 定位方式搭配隐式等待就可以很轻松的可以定位到。

查看执行结果

<think>好的,用户想在安卓系统中使用EasyClick编写的应用打开淘宝的应用管理界面。我需要根据提供的引用内容来回答这个问题。首先,我需要回忆一下EasyClick的基本功能和操作方法。 根据引用[1],EasyClick是一个基于Xposed框架的自动化工具,适合初学者,支持点击、滑动等操作。引用[3]提到它支持JavaScript编程,并且有OpenAPI和实时投屏功能。引用[4]则指出在更新UI时需要使用特定的方法,比如在浮窗中用findViewWithTag,其他界面用findViewByTag,并且UI更新要在ui.run函数中处理。 首先,用户需要打开淘宝的应用管理界面。通常,这需要进入手机的设置,找到应用管理或应用列表,然后找到淘宝应用。但具体步骤可能因手机品牌和系统版本不同而有所差异。使用EasyClick的话,可能需要模拟点击操作来导航到该界面。 接下来,我需要考虑如何用EasyClick的API来实现这些步骤。可能的步骤包括启动设置应用,模拟点击进入应用管理,再找到淘宝应用。但引用中没有直接提到如何打开特定应用的应用管理界面,所以可能需要组合多个操作,比如启动系统设置,然后通过控件查找来进入应用管理部分,再查找淘宝应用。 另外,引用[2]提到了需要配置环境和使用Android Studio,但用户的问题是关于编写脚本的方法,所以重点应该在脚本的编写上,比如使用findViewByTag或类似的方法来定位控件,然后执行点击操作。同时,引用[4]提到更新UI必须在ui.run函数中,所以在编写脚本时需要注意这一点,确保UI操作在正确的线程中执行。 可能的代码结构包括使用launchApp启动设置应用,然后通过控件查找进入应用管理列表,再通过文本匹配找到淘宝应用。例如,使用textContains("应用")来找到应用管理的入口,然后继续查找包含“淘宝”的控件并点击。 需要注意的是,不同手机的设置界面可能不同,可能需要调整控件的属性或使用图像识别(如引用[3]提到的OpenCV图色识别)来定位元素。此外,可能需要处理权限问题,比如允许EasyClick辅助功能权限,确保自动化操作可行。 最后,需要提醒用户在实际操作中可能需要调试脚本,使用实时投屏功能查看控件信息,并处理可能的异常情况,如控件未找到或界面跳转延迟。</think>### 如何通过EasyClick打开淘宝应用管理界面 #### 步骤分析 1. **启动系统应用管理界面** 通过`launchApp`或控件操作进入系统设置中的应用管理模块。部分设备可直接通过包名启动: ```javascript // 示例:启动系统设置 launchApp("系统设置包名"); // 需替换为具体设备设置包名,如"com.android.settings" ``` 2. **定位并进入应用列表** 使用控件属性匹配(如`textContains`)查找“应用管理”或“应用列表”入口: ```javascript // 查找包含“应用”文本的控件并点击 let appEntry = findViewByTextContains("应用", 5000); if (appEntry) { click(appEntry); } ``` 3. **搜索并进入淘宝应用详情页** 在应用列表中通过文本匹配或控件层级定位淘宝应用: ```javascript // 通过滚动查找或直接搜索 let taobaoApp = findViewByText("淘宝", 8000); if (taobaoApp) { click(taobaoApp); } ``` 4. **处理界面动态加载** 使用`ui.run()`确保UI操作在正确线程执行(参考引用[4]): ```javascript ui.run(function() { let btn = findViewByTag("detail_button"); if (btn) click(btn); }); ``` #### 完整代码示例 ```javascript // 启动系统设置 launchApp("com.android.settings"); // 进入应用管理 let appEntry = waitForViewByTextContains("应用管理", 10000); if (appEntry) { click(appEntry); sleep(2000); // 等待加载 // 查找淘宝应用 let taobao = scrollFindViewByText("淘宝", 10); // 最多滚动10次 if (taobao) { click(taobao); toast("已打开淘宝应用详情"); } } else { toast("未找到应用管理入口"); } ``` #### 注意事项 - **设备兼容性**:不同厂商设置界面控件属性可能不同,需通过IDE的“控件分析”功能获取实际属性[^2]。 - **权限要求**:需确保EasyClick已获取无障碍权限和悬浮窗权限[^3]。 - **延迟处理**:关键操作后添加`sleep`避免界面未响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值