无法在真实设备上使用 Appium 在 iOS hyprid 应用程序自动化中识别 WEBVIEW 中的元素

Posted

技术标签:

【中文标题】无法在真实设备上使用 Appium 在 iOS hyprid 应用程序自动化中识别 WEBVIEW 中的元素【英文标题】:Not able to identify element in WEBVIEW in iOS hyprid app automation using Appium on real device 【发布时间】:2016-09-13 13:54:54 【问题描述】:

我试图使用 ionic2/Angular2 和 typescript 自动构建混合应用程序。

我正在使用 C# 编写代码。 测试在 BDD - specflow 版本: ios:9.3.1 代码:7.3 Appium:1.4.13

将 Context 切换为 WEBVIEW 后,我无法识别元素。

使用以下代码调用 IOSDriver

private IOSDriver<IOSElement> driver = null;

public IOSDriver<IOSElement> GetDriver(string platformVersion, string deviceName, string udid ,string appPath, string serverUri)

    Capabilities iosCapabilities = new Capabilities();
    DesiredCapabilities capabilities = iosCapabilities.Get(platformVersion, deviceName, udid, appPath);
    driver = new IOSDriver<IOSElement>(new Uri(serverUri), capabilities, TimeSpan.FromSeconds(Constants.DriverWaitTime));
    driver.Manage ().Timeouts ().ImplicitlyWait (TimeSpan.FromSeconds(Constants.ImplicitWaitTime));

    var contextNames = driver.Contexts;
    driver.Context = contextNames[1];

    driver.FindElement(By.Xpath(locator)).Click();


将能力设置为

private DesiredCapabilities capabilities = new DesiredCapabilities();

capabilities.SetCapability ("appium-version", Constants.AppiumVersion);
capabilities.SetCapability ("platformName", Constants.PlatformName);
capabilities.SetCapability("autoWebView", "true");
capabilities.SetCapability("browserName", "iOS");
capabilities.SetCapability ("platformVersion", Constants.PlatformVersion);
capabilities.SetCapability("deviceName", deviceName);
capabilities.SetCapability("app", appPath);
capabilities.SetCapability("udid", udid);

我是否以正确的方式设置功能?

    尝试的解决方案:
      我检查了使用 browserName 功能作为空白/野生动物园,但没有工作 另外,我在我的 mac 上安装了 ios-webkit-debug-proxy 并在后台使用终端启动代理
    问题是我无法识别 WEBVIEW 中的元素。

我在做什么

启动应用程序后,在 appium 检查器中我可以 查看所有元素,我正在尝试单击文本框输入 一些价值

文本框的 Xpath(我可以在 appium 检查器窗口中查看):"//UIAApplication1/UIAWindow1/UIAScrollView2/UIAWebView1/UIATextField1"

var contextNames = driver.Contexts

正在给我查看列表(在我的情况下为 2 个视图:NATIVE_APP、WEBVIEW_1) WebView 上下文从 1,2,3 等动态更新..

我一打电话

diver.Context=contextNames[1]; //setting context to WEBVIEW

并刷新我无法看到/识别单个元素的 appium 检查器。一切都消失了。

为什么我在切换到 webview 后无法看到/识别元素。 (注意:一旦我切换回 driver.Context="NATIVE_APP" 每个元素都会在 appium 检查器中可见,但我仍然无法点击)

显示错误为“无法使用给定的搜索参数定位元素”

当我尝试使用 appium 检查器点击或发送键时,手动操作也不允许我这样做(在使用检查器按钮手动启动 tha 应用程序之后)。这里有什么问题。非常感谢您的帮助

Appium 检查器截图:

appium窗口中显示的错误信息:

这里是 Appium(ERROR) 的完整日志

Link of Appium logs when not able to identify elements in WEBVIEW

【问题讨论】:

请将其拆分为子部分,似乎太长无法一次回答或格式正确以了解您的查询 从默认上下文切换到“WEBVIEW”后,我基本上试图识别 webview 中存在的元素(我的应用程序是混合的),但无法这样做 【参考方案1】:
    从这里继续:How to enable and use WebView for iOS Automation in Appium

尝试使用以下代码来切换上下文:

var contextNames = driver.GetContexts(); //correction to your code 
driver.SetContext(contextNames[1]);

    在使用 appium 时,您不一定需要以下能力:

    capabilities.SetCapability("browserName", "iOS"); //can be removed from code as well
    

    我猜您可能正在尝试使用 Appium Inspector 来运行/调试您的测试。在这种情况下,您可能无法同时使用这两个实例。有关详细信息,请查看 appium 服务器日志。

【讨论】:

1.对于 C#,我研究并发现 driver.GetContexts() 的实现已更改。现在是 driver.Contexts 和 driver.Context 2。我也试过了,但没有进展 3。没听懂你想说的。 “Appium Inspector 以及运行/调试测试”是什么意思 @SurajGupta :好的,我希望您一开始就成功更改了上下文,我的意思是您一次只能使用 appium serve 运行一个会话,可以是 Appium Inspector 或您的测试使用 dot-net-client。 是的,使用 IOSdriver 我能够成功更改上下文。元素识别时面临问题。 @SurajGupta 请分享您用于选择元素的代码以及相同的 appium 检查器屏幕截图。也请把它添加到问题本身,更有意义。 找到了解决方法。 Appium 无法识别//ion-input[@name='abc'] 标签,而是我使用了一步一步的过程,其中 1. 使用属性获取属性值 2. 使用该属性尝试单击元素【参考方案2】:

我认为你必须在 Appium 中设置 UICatalog

    将此链接复制到 xcode 中:https://github.com/appium/ios-uicatalog

    搜索我们安装了 UICatalog.app 的存储库 用户/库/开发人员/Xcode/DerivedData/UICatalog-bhmtevqhmgarbcgnqybxttbkqfvn/Build/Products/Debug-iphonesimulator/UICatalog.app

    将其复制到 Appium ios 设置中的应用路径中

【讨论】:

@@Emna 你的意思是here 那么我应该把我的混合应用程序的.ipa 文件路径放在哪里?? 在我的情况下,我这样做是因为它是一个混合站点,用于测试而不是应用程序,它对我来说很好。 那么appium如何知道要打开哪个混合.ipa应用 我告诉过你我用一个站点进行测试,所以我只将我的测试中的 url 提供给我的站点;)可能与我的情况不同!【参考方案3】:

1) 在访问ios webview时——使用getcontextHandles我们可以实现

设置 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);
    sleepfor(1000);
    idriver.findElementByName("Open").click();
    Reporter.log("Clicking Open to naviagte to Native APP", true);
  
  else
    Reporter.log("Not found", true);
  

2) 如果上述上下文不起作用 -- 尝试运行 iproxy 在终端中运行它——ios_webkit_debug_proxy -c deviceID:27753 -d deviceID -- 获取设备ID(instruments -s devices)

【讨论】:

感谢您的回答。这不是解决办法。我在我的问题本身中提到了您的解决方案。解决方案:由于应用程序是在 ionic2/angular2 中构建的,我不得不将所有离子特定元素封装到普通标签中,因为 webview 无法理解离子特定元素,因此无法对其执行任何操作。示例: 标签到

以上是关于无法在真实设备上使用 Appium 在 iOS hyprid 应用程序自动化中识别 WEBVIEW 中的元素的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Appium 在真实设备上自动化 3rd 方 ios 应用程序

monkey命令 appium 自动化吗

将真实 iOS 设备与 Appium 服务器连接时出错

我需要付费 ios 开发者帐户来使用 appium 自动化真实设备和模拟器吗

iOS安全区域无法在真实设备上运行

Appium 无法识别屏幕上的元素,即使它们是使用 initElements 初始化的