sendKeys()
方法一次发送所有密钥(实际上,一次只发送一个密钥):
var elm = element(by.id("myinput"));
elm.sendKeys("test");
有没有办法减慢打字速度,以便Protractor一次发送一个字符,每个字符之间有一个小延迟?
我们可以slow down Protractor entirely,但这不会改变sendKeys()
的工作方式,它也会减慢所有内容,而我们只需要“发送密钥”部分,但仅限于特定情况。
答案 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