【问题标题】:Simulate slow typing in Protractor在 Protractor 中模拟慢速打字
【发布时间】:2016-11-06 08:25:29
【问题描述】:

sendKeys() 方法会一次性发送所有密钥(实际上,一次一个,但非常快):

var elm = element(by.id("myinput"));
elm.sendKeys("test");

有没有办法减慢打字速度,以便 Protractor 一次发送 一个字符,每个字符之间会有一点延迟?

我们可以slow down Protractor entirely,但这不会改变sendKeys() 的工作方式,而且它还会减慢一切,而我们只需要“发送密钥”部分并且仅在特定情况下。

【问题讨论】:

    标签: javascript angularjs selenium testing protractor


    【解决方案1】:

    这个想法是使用browser.actions() 并构造一系列“发送键”命令——一个字符串中的每个字符。在每个“发送密钥”命令之后,我们通过引入 custom sleep action 添加延迟。最后,这是我们提出的可重用函数:

    function slowType(elm, keys, delay) {
        var action = browser.actions().mouseMove(elm).click();
    
        for (var i = 0; i < keys.length; i++) {
            action = action.sendKeys(keys[i]).sleep(delay);
        }
    
        return action.perform();
    }
    

    用法:

    slowType(elm, "some text", 100);
    

    【讨论】:

    • 基本上,这与我们使用的方法相同。但是,单击元素时存在风险。有时该元素被编程为突出显示所有存在的值。在发送任何值之前尝试发送 END 键。在清除所有存在的价值的情况下,我们可能需要其他方法。
    • @NguyenVuHoang 啊,好点子。我记得一旦我们有了它并发送 ctrl/command + A 来选择现有文本然后输入。请看看你提供你的实现是否有意义——它可能比我们的更好。谢谢!
    • 但是为什么要模拟慢速打字呢?它不会减慢您的测试速度吗?只是想了解!
    • @igniteram1 当然。对于电话号码和日期等动态格式化和验证的输入,我们不得不多次使用它。事实证明,这适用于主流浏览器,而常规的“发送密钥”在 IE 中存在问题,并且在其他浏览器中随机出现问题,因为动作发生“太快”。最后可能是我们的应用程序问题,但我希望这会对类似情况的人有所帮助。好问题,谢谢!
    • 是的,这实际上对有项目特定要求的人有所帮助,伟大的工作人员!
    【解决方案2】:

    如果您不想创建自定义 sleep() 操作,则此方法有效:

    slowType: function(elm, keys, delay) {
        elm.click();
    
        for (var i =0; i < keys.length;i++) {
            browser.actions().sendKeys(keys[i]).perform();
            browser.sleep(delay);
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      前面描述的方法不适用于异步/等待函数。这是可以替代使用的方法,因为 Protractor 不推荐使用控制流

      /**
      * @param {ElementFinder} $element
      * @param {string} keys string to type
      * @param {number} [delay=200] delay between characters
      * @param {number} [timeout=timeouts.ms1000] timeout for waiting for an element to be interactable
      */
      slowType: ($element, keys, delay = 200, timeout = 1000) => browser
          .wait(
              // waits for element to be interactable for 'timeout' ms,
              // otherwise throws an error with passed element locator
              ExpectedConditions.elementToBeClickable($element),
              timeout,
              "waitThenSendKeys to " + $element.locator()
          ).then(() => $element.click())
          .then(() => $element.clear())
          .then( async () => {
              for (let i = 0; i < keys.length; i++) {
                  await $element.sendKeys(keys[i]);
                  await browser.sleep(delay);
              }
          })
      

      然后在您的测试中只需导入此方法(即 const {slowType} = require("actions/element-actions");

      并使用如下方法

      await slowType($searchInput, "my search string", 500);

      【讨论】:

      • 但是不使用 .then 使用旧的控制流吗?
      • @AdamCarr AFAIK 不,它是可以针对 promise 调用的 js 方法,它会返回另一个 promise。它本身与控制流无关
      【解决方案4】:

      如果一次在输入框中输入整个字符串(以量角器的速度),我的自动完成器会产生不一致的结果,请使用以下解决方案修复它。

      var elm = element(by.id("myinput"));
      elm.sendKeys("tes");  // input all except last character
      browser.sleep(1000);  // add delay of 1 second
      elm.sendKeys("t");    // input last character
      

      【讨论】:

        猜你喜欢
        • 2023-01-25
        • 1970-01-01
        • 2010-09-20
        • 2011-01-02
        • 1970-01-01
        • 2011-02-05
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多