appium测试app时如何切换到webview

本文详细介绍如何使用Appium在移动应用测试中处理WebView元素,包括进入和退出WebView,以及在多个窗口间切换的方法,为自动化测试提供实用的代码示例。

文章目录


在这里插入图片描述

前言

很多 app 都会存在 webview 控件,我们使用 appium 在测试 app 难免会遇到 webview,我们可以直接使用 uiautomatorviewer 去硬抓取,当然我们推荐使用 pc 的 chrome 去抓,因为这样更稳定一些

代码

进入 webview

getContextHandles 这个方法我们可以发现一般有如下的 context

  • NATIVE_APP
  • WEBVIEW_com.example.testap

我们需要进入的是第二个

driver.getContextHandles().forEach((context) -> {
    if (context.toString().contains("WEBVIEW")) {
        driver.context(context.toString());
    }
});

在 webview 中找到指定窗口

在 webview 中往往会有多窗口,我们需要切换到指定的窗口我们才能点击按钮,这个切换窗口实际就和 selenium 很类似了,如下代码所示我们可以通过输出窗口中的信息才检查那个窗口才是我们需要的,最后我们发现我们需要的就是第一个窗口

// 用来调试定位所需要点击的控件在 webview 的哪一个窗口中
driver.getWindowHandles().forEach((window) -> {
    driver.switchTo().window(window);
    System.out.println("==标题==");
    System.out.println(driver.getTitle());
    System.out.println("==全文==");
    System.out.println(driver.getPageSource());
});

// 切换窗口(经测试发现在第一个窗口中)
Set<String> set = driver.getWindowHandles();
Object[] arr = set.toArray();
driver.switchTo().window(arr[0].toString());

退出 webview

退出 webview 实际就是进入 NATIVE_APP,所以和进入 webview 操作一致

driver.getContextHandles().forEach((context) -> {
    if (context.toString().contains("NATIVE_APP")) {
        driver.context(context.toString());
    }
});
在使用 Appium 进行 Android 混合应用自动化测试,识别并切换WebView 上下文是常见的操作。以下是识别和切换WebView 上下文的方法: ### 获取当前设备的上下文列表 Appium 提供了 `contexts` 方法来获取当前应用的所有可用上下文。这些上下文包括原生(NATIVE_APP)和 WebView 上下文[^4]。 ```python # 获取所有可用的上下文 contexts = driver.contexts print(contexts) # 输出类似 ['NATIVE_APP', 'WEBVIEW_com.example.app'] ``` ### 切换WebView 上下文 通过获取到的上下文列表,可以使用 `switch_to.context()` 方法切换到目标 WebView 上下文[^2]。 ```python # 切换WebView 上下文 driver.switch_to.context(contexts[1]) # 假设 WebView 是列表中的第二个上下文 ``` ### 验证当前上下文 为了确保已经成功切换WebView 上下文,可以通过 `current_context` 属性进行验证[^4]。 ```python # 获取当前上下文以确认是否切换成功 current_context = driver.current_context print(current_context) # 应输出类似 WEBVIEW_com.example.app ``` ### 切换回原生上下文 完成 WebView 操作后,可以通过相同的方式切换回原生上下文[^3]。 ```python # 切换回原生上下文 driver.switch_to.context(contexts[0]) ``` ### 注意事项 1. **等待 WebView 加载完成**:在切换WebView 上下文之前,需要确保 WebView 已经加载完成,否则可能无法找到页面元素。可以通过显式等待或添加适当的延迟来解决此问题[^1]。 2. **确认上下文名称**:不同应用的 WebView 上下文名称可能不同,例如微信小程序的上下文可能是 `WEBVIEW_com.tencent.mm:appbrand0`。因此,在编写脚本需要根据实际情况调整上下文名称[^5]。 ### 示例代码 以下是一个完整的示例代码,展示如何识别并切换WebView 上下文: ```python from appium import webdriver import time desired_caps = { 'platformName': 'Android', 'deviceName': 'emulator-5554', 'platformVersion': '10', 'appPackage': 'com.example.app', 'appActivity': 'com.example.app.MainActivity' } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) time.sleep(10) # 等待应用启动 # 获取所有可用的上下文 contexts = driver.contexts print(contexts) # 输出类似 ['NATIVE_APP', 'WEBVIEW_com.example.app'] # 切换WebView 上下文 driver.switch_to.context(contexts[1]) # 获取当前上下文以确认是否切换成功 current_context = driver.current_context print(current_context) # 应输出类似 WEBVIEW_com.example.app # 在 WebView 中执行操作,例如查找元素 element = driver.find_element_by_id("example-element-id") element.click() # 切换回原生上下文 driver.switch_to.context(contexts[0]) # 关闭应用 driver.quit() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

abcnull

您的打赏是我创作的动力之一

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值