如何在 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 定义

如何在 android 中以编程方式在小米手机安全应用程序中为我的应用程序启用自动启动选项

如何在 Mac OS 上设置 Appium 以在 Android 和 iOS 设备上运行来自 JAVA 类的自动化测试