在 Appium Inspector 中将 WebView 视为原生应用,并且无法切换到 WebView 以查找元素的问题,可以通过以下方法解决:
解决方法1:使用 Chrome DevTools Protocol
启动 Appium 服务器时,添加以下参数:
--relaxed-security
--chromedriver-executable=/path/to/chromedriver
--webview-connect-timeout=20000
在测试脚本中使用以下代码切换到 WebView:
from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy
desired_caps = {
'platformName': 'Android',
'deviceName': 'device',
'appPackage': 'your_app_package',
'appActivity': 'your_app_activity',
'automationName': 'UiAutomator2',
'chromedriverExecutable': '/path/to/chromedriver'
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# 切换到 WebView
contexts = driver.contexts
for context in contexts:
if 'WEBVIEW' in context:
driver.switch_to.context(context)
break
# 使用 Chrome DevTools Protocol 查找元素
element = driver.find_element(MobileBy.ACCESSIBILITY_ID, 'element_id')
# 切换回原生应用
driver.switch_to.context('NATIVE_APP')
解决方法2:使用 WebdriverIO
安装 WebdriverIO:
npm install webdriverio
在测试脚本中使用以下代码切换到 WebView:
const webdriverio = require('webdriverio');
const options = {
path: '/wd/hub',
port: 4723,
capabilities: {
platformName: 'Android',
deviceName: 'device',
appPackage: 'your_app_package',
appActivity: 'your_app_activity',
automationName: 'UiAutomator2',
chromedriverExecutable: '/path/to/chromedriver'
}
};
async function main() {
const client = await webdriverio.remote(options);
// 切换到 WebView
const contexts = await client.getContexts();
for (const context of contexts) {
if (context.includes('WEBVIEW')) {
await client.switchContext(context);
break;
}
}
// 使用 WebdriverIO 查找元素
const element = await client.$('~element_id');
// 切换回原生应用
await client.switchContext('NATIVE_APP');
await client.deleteSession();
}
main();
通过以上方法,你可以在 Appium Inspector 中将 WebView 视为原生应用,并且通过代码切换到 WebView 来查找元素。请注意,你需要将 /path/to/chromedriver
替换为你本地的 chromedriver 路径,并将 your_app_package
和 your_app_activity
替换为你的应用的包名和活动名。