为啥 XCUITest 对 iOS 应用程序运行太慢?

Posted

技术标签:

【中文标题】为啥 XCUITest 对 iOS 应用程序运行太慢?【英文标题】:Why XCUITest is working too much slow for iOS app?为什么 XCUITest 对 iOS 应用程序运行太慢? 【发布时间】:2019-10-18 06:07:40 【问题描述】:

我想在 ios 原生应用中获取动态元素的值。我使用XCUITest 来获取元素的路径。路径工作正常,但获取/打印值大约需要 1 分钟。我没有使用任何等待。

我的代码是:

String El1="//XCUIElementTypeApplication[@name='appName']/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeTable/XCUIElementTypeCell[5]/XCUIElementTypeStaticText";

 System.out.println("Value: "+driver.findElementByXPath(El1).getText());

【问题讨论】:

【参考方案1】:

XCTest 是一个非常快速的框架。 尽管 Xpath 非常常见且灵活,但它并不是查找 iOS 元素的最佳选择。 您应缩短对该元素的查询并使用findElementByIosNsPredicate

IOSElement settingsCell = driver.findElementByIosNsPredicate("type == 'XCUIElementTypeCell' AND name == 'Settings'");

您可能会发现这篇文章很有帮助

http://appium.io/docs/en/writing-running-appium/ios/ios-predicate/

【讨论】:

【参考方案2】:

原因是你的 xpath 字符串很长。这往往会减慢 Appium 的速度,因为它需要遍历您的案例中的长路径。放置绝对 xpath 也是非常脆弱和糟糕的主意。 有几种获取元素的方法

类名 身份证 名称 xpath 可访问性 ID ios 谓词字符串 ios类链

请参阅元素的检查器(例如 Appium 检查器)。 如果有可访问的 id ,代码应该是

WebElement el = driver.findElement(MobileBy.AccessibilityID("foo"));

班级名称 类名应该是第二个。这特别有效,特别是如果只有 1 个唯一的类名 - 比如表单中只有 1 个按钮

List<MobileElement> elementsTwo = (List<MobileElement>) driver.findElementsByClassName("XCUIElementTypeButton");


iOS 特定的定位器策略 你可以试试 iOSClassChain。那是下一个有效的选择器。示例

String selector = "**/XCUIElementTypeCell[`name BEGINSWITH "C"`]/XCUIElementTypeButton[10]";<br>
driver.findElement(MobileBy.iOSClassChain(selector));

或者您可以尝试使用谓词选择器。

driver.findElementsByIosNsPredicate("isWDVisible == 1");

最后,如果所有这些选项都用完了,你应该使用 xpath 作为最后的手段。避免使用绝对 xpath 并使用相对 xpath。

绝对 xpath

String El1="//XCUIElementTypeApplication[@name='appName']/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeTable/XCUIElementTypeCell[5]/XCUIElementTypeStaticText";

相对 xpath

String El1 = “//XCUIElementTypeTable[name=‘Customer’]/XCUIElementTypeCell[5]/XCUIElementTypeStaticText”

【讨论】:

以上是关于为啥 XCUITest 对 iOS 应用程序运行太慢?的主要内容,如果未能解决你的问题,请参考以下文章

XCUITest - 如何在应用程序运行时禁用 Wi Fi?

由于应用重启,XCUITest 需要运行两次才能成功

运行 XCUITest 自动化后获取应用程序的控制台/文件日志和视频

iOS XCUITest 模拟指纹

使用 xcodebuildcommand 从终端运行时 XCUITEST 未运行

为啥混合不使用太多 OTP?