【问题标题】:How to make appium tests run faster on iOS?如何让 appium 测试在 iOS 上运行得更快?
【发布时间】:2016-08-05 01:57:08
【问题描述】:

目前,我正在使用 appium 进行 iOS 应用程序测试,并且我已经在 mac mini 机器上用 Java 编写了测试。我正在使用 Jenkins CI 运行我的测试。我想更快地运行我的测试,因为目前它在 iOS 模拟器上相当慢。例如,如果我通过 sendkeys() 函数(如“testdata”)在文本字段中输入任何值,那么在模拟器中的输入速度很慢。它首先从模拟器的键盘上写字符't'然后'e'然后's'等等。

以下是我的问题,

  1. 有什么方法可以让我在模拟器上更快地执行测试 通过 sendkeys() 函数输入文本字段时?
  2. 有没有什么方法可以在没有模拟器的情况下以无头方式运行测试?

【问题讨论】:

    标签: java ios jenkins appium


    【解决方案1】:

    不要在 iOS 上使用发送键

    实际上,您不应该在 iOS 上使用 sendKeys,因为它速度慢且不稳定。

    您应该为 Java 库使用 setValue,为 ruby​​ 库使用 type

    设置值使用

    setValue 在 Java 库 here 中定义。

    它应该在 WebElement 上调用。

    driver.find_element(By.locator(value)).setValue("foo")
    

    使用 iOS 模拟器是运行测试的最佳选择

    Instruments 需要实时模拟器或真实设备* 才能与您的应用程序交互。您可以遵循一些最佳实践来改进您的测试代码,这可能会使测试更快。

    其他优化最佳实践

    1. 不要使用“睡眠”来尝试等待元素 - 而是不断轮询驱动程序以了解该元素是否显示且可点击。
    2. 使用setValue而不是sendKeys
    3. 停止使用 Xpath 定位器策略。它在 iOS 上很不稳定而且很慢。使用 UIAutomation 或 AccessibilityId 定位器策略。
    4. 仅在需要与元素交互时获取元素

    *不建议使用适用于 iOS 的真实设备(当性能很重要时)

    自动化真实设备在每个动作之间都有一秒的内置延迟。

    无论 Appium 服务器有多快,或者您的测试脚本有多快,Appium 将“执行”命令推送到仪器工作队列与在设备上执行之间存在延迟。

    【讨论】:

    • 在哪个库中可以找到 setValue() 函数?目前,我正在使用这样的 webs.findElement(By.xpath("//xpath")).sendKeys(String);其中 'webs' 是 webdriver 对象。如何用 setValue 替换这个 sendkeys()?我在 WebDriver 库中没有找到像 setValue() 这样的函数。
    • setValue 定义为here
    • 对于 appium 的 ruby_lib,该方法称为 type,而不是 set_value
    • You're actually not supposed to use sendKeys on iOS source?
    • 原帖在底部。在应用程序中执行或获取某些内容的每个请求都来自您的客户端,通过 Appium 服务器,最后到达 Instruments 内部的 UIAutomation。当时,setValue 会向 UIAutomation 发出 2 个请求,以在 UITextField 上设置“Hello world”。 1 请求获取文本字段元素。 1 请求设置整个值。 sendKeys 将为文本字段元素生成 12. 1。 “Hello world”中的每个字母 1。 (discuss.appium.io/t/how-to-make-appium-tests-run-faster-on-ios/…)
    【解决方案2】:

    我在哪里可以找到有关此建议的更多信息(我使用的是 ruby​​ 而不是 java)并且我经常使用 xpath,我猜这可能是脚本执行时间过长的原因之一。

    “停止使用 Xpath 定位器策略。它在 iOS 上是不稳定且缓慢的。使用 UIAutomation 或 AccessibilityId 定位器策略。”

    【讨论】:

    • 定位器策略在 Appium 中的问题与在 Selenium 自动化中的问题相同。 xpath 定位器策略在设计上是古怪的。如果 UI 的结构发生变化,您的测试就会中断。它很慢,因为它需要遍历 DOM 来查找元素,而不是查找唯一 ID(AccessibilityID)。 sqa.stackexchange.com/a/17664/8116 和(跳到本帖底部github.com/appium/appium/issues/2639
    【解决方案3】:

    您可以将 iOS 的 sendKeyStrategy 功能设置为 setValue 而不是默认的 OneByOne。

    【讨论】:

    • 我确实尝试过使用 sendKeyStrategy 但它似乎不起作用。我做了什么 capabilities.setCapability("sendKeyStrategy", "grouped");但它没有用,appium 继续写 oneByone。有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 2012-02-15
    • 2013-10-31
    • 2018-02-11
    • 2015-05-27
    • 2010-11-06
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多