WebdriverIO混合应用跳转手机浏览器后无法获取URL该如何解决
问题根因
driver.getUrl()是Web上下文专属方法,你当前拿到的上下文为NATIVE_APP,说明driver仍处于原生应用层,未切换到跳转后打开的浏览器对应的上下文,因此调用该方法会触发未实现错误。
解决方案
方法1:切换到浏览器WEBVIEW上下文
这是最通用的实现方案,操作步骤如下:
- 调用
driver.getContextHandles()获取当前设备所有可用上下文,返回结果中除了原有NATIVE_APP,还会出现跳转后浏览器对应的WEBVIEW上下文(安卓Chrome对应值为WEBVIEW_com.android.chrome,不同浏览器、设备的返回值会有差异) - 调用
driver.context("替换为你拿到的浏览器WEBVIEW上下文名称")完成上下文切换 - 切换完成后调用
driver.getCurrentUrl()即可获取当前页面的目标URL - 验证完成后如果需要回到原混合应用操作,调用
driver.context("NATIVE_APP")切回原生上下文即可
注意:安卓需要提前开启webview调试权限,iOS需要开启Safari的Web检查器设置,否则可能无法获取到浏览器的WEBVIEW上下文
方法2:切换driver控制目标到浏览器应用
如果无法获取到浏览器的WEBVIEW上下文,可以直接将driver的控制对象切换到已启动的浏览器应用,再读取URL:
- 安卓端(以Chrome为例)示例代码:
# 启动Chrome应用 driver.startActivity("com.android.chrome", "com.google.android.apps.chrome.Main") # 获取当前页面URL target_url = driver.getCurrentUrl()
- iOS端(以Safari为例)示例代码:
# 激活已打开的Safari应用 driver.activateApp("com.apple.mobilesafari") # 读取地址栏元素的文本内容即为目标URL target_url = driver.find_element_by_xpath("//XCUIElementTypeTextField[@name='URL']").text
方法3:前置拦截/剪切板读取(备选方案)
如果不需要验证跳转后的实际加载地址,只需要验证App触发跳转的链接是否正确,可以用更简单的方案:
- 直接定位原生页面上触发跳转的元素,读取其
href或绑定的跳转属性值,直接和测试数据比对 - 如果点击链接后App会先将链接复制到系统剪切板,可以直接调用
driver.getClipboardText()获取剪切板内的URL完成验证
内容的提问来源于stack exchange,提问作者user3690888
相关产品推荐
相关产品推荐

