我正在尝试使用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();
}

08-06 02:33