如何在 Appium 中为 iOS 自动化启用和使用 WebView
Posted
技术标签:
【中文标题】如何在 Appium 中为 iOS 自动化启用和使用 WebView【英文标题】:How to enable and use WebView for iOS Automation in Appium 【发布时间】:2016-09-10 15:02:27 【问题描述】:我正在尝试使用由 Ionic2/Angular2/Typescript 开发的 Appium 来自动化混合应用程序。
当我尝试识别元素时,我可以在 Appium Inspector 的 WebView 中看到元素,但是当我尝试使用脚本识别它们时,它会抛出错误。
An element could not be identified using given search parameter.
error: Invalid locator strategy: partial link text
我正在尝试通过 Xpath、名称、linkText 识别 elemnet,但我无法这样做。
我还通过添加启用 webview 功能
capabilities.SetCapability("autoWebView", "true");
我正在使用 C# 进行自动化。谁能提供解决方案?
当我使用 Xpath 时,它显示处理命令时发生未知服务器端错误(原始错误:连接 ECONNREFUSED)
设置上述能力后调用var contextNames= driver.Contexts;
时显示上述错误。我是否还需要为浏览器设置功能???
【问题讨论】:
【参考方案1】:两件事:
1。确保 setWebContentsDebuggingEnabled
在您的 webview 代码中设置为 true。
2。在访问 webview 上的元素之前,请在操作后切换上下文并返回。类似于以下 Java 中用于切换到 WEBVIEW 的代码:
Set<String> contextNames = driver.getContextHandles();
String setContext = contextNames.toArray()[1].toString();
driver.context(setContext);// set context to WEBVIEW_com.my.package
请为What exactly do autoWebview does?阅读以下内容
对于 dot-net 客户端,类似的代码如下:
var contextNames = driver.GetContexts(); //correction to your code
driver.SetContext(contextNames[1]); // for webview_1, for native_view 0
【讨论】:
@@nullpointer 我需要在哪里设置这个 'setWebContentsDebuggingEnabled' 属性。我需要让我的开发人员在他们的代码中设置它然后构建 ipa/apk 吗?? @SurajGupta :是的,这已设置到应用程序代码中。 我在开发代码中检查了它,它已经设置为true。你能评论一下为什么我在尝试使用var contextNames=driver.Contexts;
检索所有上下文时遇到错误,错误是 处理命令时发生未知的服务器端错误(原始错误:连接 ECONNREFUSED)
@SurajGupta :可能您需要更改代码,在答案中编辑
另外,当我浏览 dot net 客户端时,您可以直接设置上下文,例如:driver = new androidDriver... driver.Context = "NATIVE_APP";
【参考方案2】:
1) 第一个选项
以下代码将有助于处理 Native 应用程序到 webview
public void acceptalert()
Set<String> contextNames = idriver.getContextHandles();
System.out.println(contextNames);
for (String contextName : contextNames)
if (contextName.contains("NATIVE_APP"))
Reporter.log("Reaching to Native App", true);
idriver.context(contextName);
idriver.findElementByName("Open").click();
Reporter.log("Clicking Open to naviagte to Native APP", true);
else
Reporter.log("Not found", true);
2) 第二种选择:
try
//idriver.context("WEBVIEW_2");
Set<String> contextNames1 = idriver.getContextHandles();
for (String winHandle : idriver.getWindowHandles())
if (winHandle.contains("WEBVIEW_24"))
((AppiumDriver) idriver).context(winHandle);
System.out.println("Switched to " + winHandle);
idriver.switchTo().window(winHandle);
idriver.findElementByName("Open").click();
else if (winHandle.contains("NATIVE_APP"))
((AppiumDriver) idriver).context(winHandle);
idriver.switchTo().window(winHandle);
System.out.println("Switched to " + winHandle);
catch (Exception e)
【讨论】:
【参考方案3】:即使在使用之后
capabilities.SetCapability("autoWebView", "true");
我们需要访问代理来处理webview
Set<String> contextNames = idriver.getContextHandles();
System.out.println(contextNames);
for (String contextName : contextNames)
if (contextName.contains("NATIVE_APP"))
Reporter.log("Reaching to Native App", true);
idriver.context(contextName);
idriver.findElementByName("Open").click();
Reporter.log("Clicking Open to naviagte to Native APP", true);
else
Reporter.log("Not found", true);
或尝试使用 ru 代理来处理 webview -- 只是一个 hack
终端下方的Ru
ios_webkit_debug_proxy -c abad62540cbfc9f2af5c154985420a856e:27753 -d
【讨论】:
以上是关于如何在 Appium 中为 iOS 自动化启用和使用 WebView的主要内容,如果未能解决你的问题,请参考以下文章
如何在 VS Code 中为 .jsx 文件启用自动更漂亮的格式?
如何在 Eclipse 中为 PHP 核心函数启用自动完成/语法高亮?
如何使用 Appium 在真实设备上自动化 3rd 方 ios 应用程序
如何在 Eclipse 中为 Appium Server 修复 URL 定义