要使用 Appium 连接并自动化微信中的 H5 页面(即微信内置的 Webview),你需要处理一个混合应用(native + webview)的自动化场景。这通常涉及到切换到 WebView 上下文来执行针对 Web 页面的操作。
以下是一个基本的示例,展示了如何使用 Appium 的 Python 客户端来连接到微信应用,并切换到 WebView 上下文以自动化 H5 页面:
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 配置参数
desired_caps = {
"platformName": "Android", # 或者 "iOS"
"deviceName": "Android Emulator", # 或者你的设备名称
"appPackage": "com.tencent.mm", # 微信应用的包名
"appActivity": ".ui.LauncherUI", # 微信应用的启动 Activity
"unicodeKeyboard": True, # 使用 Unicode 编码发送字符串
"resetKeyboard": True, # 发送键盘操作后隐藏键盘
# 对于 iOS,你可能需要添加 "automationName": "XCUITest"
# 对于 Android,如果你需要启用 WebView 调试,确保已经设置了系统属性
# 例如:adb shell setprop debug.webview.inspecting.enabled true
}
# 连接 Appium 服务器
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# 等待微信应用启动完成
driver.implicitly_wait(10) # 设置隐式等待时间
# 切换到 WebView 上下文(这取决于你的设备和 WebView 是否已启用调试)
contexts = driver.contexts
webview_context = None
for context in contexts:
if "WEBVIEW" in context:
webview_context = context
break
if webview_context:
driver.switch_to.context(webview_context)
else:
print("WebView context not found!")
driver.quit()
exit()
# 现在你可以像在普通浏览器中一样使用 driver 对象来自动化 H5 页面
# 例如,找到页面上的一个元素并点击它
try:
element = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "some_element_id"))
element.click()
except Exception as e:
print(f"Failed to click on element: {e}")
# ... 执行其他针对 H5 页面的操作 ...
# 最后,关闭 driver 和会话
driver.quit()
在上面的代码中,我们首先设置了连接 Appium 服务器所需的 desired_caps
。然后,我们连接到服务器并等待微信应用启动。接下来,我们获取所有可用的上下文(contexts),并查找包含 "WEBVIEW" 的上下文,以切换到 WebView。一旦切换到 WebView 上下文,我们就可以像操作普通网页一样使用 Selenium 的 API 来自动化 H5 页面。
请注意,为了使 Appium 能够与 WebView 交互,你需要确保 WebView 调试已经启用。对于 Android 设备,你可以使用 adb
命令来启用 WebView 调试。对于 iOS 设备,确保你的应用配置允许 WebView 调试。
此外,由于微信的内部实现和 WebView 的具体行为可能会随着版本的更新而发生变化,因此你可能需要根据实际情况调整代码和元素定位策略。如果微信应用的 WebView 没有启用调试,或者 Appium 无法识别 WebView 上下文,那么自动化 WebView 内的内容将会非常困难。在这种情况下,你可能需要寻求其他方法或工具来实现你的自动化需求。