量角器:Ctrl点击

时间:2017-09-29 08:26:53

标签: javascript angularjs protractor

我正在尝试使用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单击。

在六个元素上调用此函数的结果如下,选择以下元素:

  • 第一个元素
  • 第二个
  • 第三个
  • 仅第四个
  • 第五名与第四名
  • 仅第六次

换句话说,它最多选择两个元素,然后取消选择all并再次选择最多两个元素。 知道那里发生了什么吗?

其他问题:是否可以将这些操作直接发送到元素(而不是使用browser.actions())?似乎只有键盘键或鼠标操作可以发送到元素,但不能同时发送(如sendKeys()。click())。

1 个答案:

答案 0 :(得分:3)

问题是,您正在通过调用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();
}