我正在尝试使用ctrl单击连续元素来选择页面上的多个元素。
手动完成此功能后效果很好,但是我在使用量角器进行自动化时遇到了一些麻烦。
这是我的ptor函数:
this.selectElements = function (names) {
for(var i = 0; i < names.length; i++){
var parentElement = element(by.xpath('//div[@aria-label="select group ' + names[i] + '"]'));
browser.wait(EC.presenceOf(parentElement), DEFAULT_WAIT_TIMEOUT);
browser.actions()
.mouseMove(parentElement).perform();
browser.sleep(500);
browser.actions().keyDown(protractor.Key.CONTROL)
.click()
.perform();
}
因此,对于名称中的每个值,它获取DOM中的元素,将鼠标移到该元素上,休眠,然后按ctrl单击。
在六个元素上调用此函数的结果如下,选择了以下元素:
仅第一个要素
第二个
第三与第二
第四个人
第五与第四
第六个
换句话说,它最多选择两个元素,然后取消所有选择并最多再次选择两个。
知道那里发生了什么吗?
另一个问题:是否可以将这些操作直接发送到元素(而不是使用browser.actions())?似乎只能将键盘键或鼠标操作发送到元素,但不能一次发送到两个元素(类似于sendKeys()。click())。
最佳答案
问题是,您正在通过调用perform()
方法为每个循环执行动作序列。相反,您需要在循环中链接所有动作序列,然后最后执行它。请尝试以下示例,
this.selectElements = function (names) {
var actionSequence = browser.actions().keyDown(protractor.Key.CONTROL);
for(var i = 0; i < names.length; i++){
var parentElement = element(by.xpath('//div[@aria-label="select group ' + names[i] + '"]'));
actionSequence = actionSequence.mouseMove(parentElement).click();
}
actionSequence.perform();
}