在Protractor

时间:2016-07-04 14:53:17

标签: javascript angularjs selenium testing protractor

sendKeys()方法一次发送所有密钥(实际上,一次只发送一个密钥):

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

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

我们可以slow down Protractor entirely,但这不会改变sendKeys()的工作方式,它也会减慢所有内容,而我们只需要“发送密钥”部分,但仅限于特定情况。

4 个答案:

答案 0 :(得分:6)

这个想法是使用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);

答案 1 :(得分: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);
    }

}

答案 2 :(得分:1)

前面所述的方法不起作用与异步/等待功能一起使用。因为量角器不赞成使用控制流,所以这里可以使用这种方法

/**
* @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);

答案 3 :(得分:1)

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

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