相关疑难解决方法(0)

从ElementFinder数组中创建ElementArrayFinder

当条件评估为true(扩展ElementArrayFinder)主题和@ cvakiitho的答案时,这是Take元素的后续问题.

问题:

执行以下代码后:

var i = 0;
var el = element.all(by.css('ul li a'));
var tableItems = [];
(function loop() {
    el.get(i).getText().then(function(text){
        if(text){
            tableItems.push(el.get(i));
            i+=1;
            loop();
        }
    });
}());
Run Code Online (Sandbox Code Playgroud)

tableItems将包含一个ElementFinder实例数组- 或者,简单地说 - 一个web元素数组.

问题:

是否可以将ElementFinders 数组转换为ElementArrayFinder实例?

动机:

我想这样做的原因是让所有的方便ElementArrayFinder功能的实用程序,如map(),each(),reduce()并可以调用getText()它生产这将分解为元素的文本数组的承诺.

javascript testing selenium selenium-webdriver protractor

11
推荐指数
1
解决办法
1800
查看次数

在Protractor中传播承诺

q有这个简洁的功能来解析和传播多个promises到单独的参数:

如果你有一个数组的承诺,你可以使用spread作为替代.扩展函数将值"扩展"到履行处理程序的参数上.

return getUsername()
    .then(function (username) {
        return [username, getUser(username)];
    })
    .spread(function (username, user) {

    });
Run Code Online (Sandbox Code Playgroud)

在量角器中,我们正在尝试使用内置的protractor.promise来自WebDriverJS.

问题:

是否可以使用"传播"功能protractor.promise

用例示例:

我们已经实现了一个自定义的jasmine matcher来检查元素是否被聚焦.在这里,我们需要在进行相等比较之前解决两个promise.目前,我们正在使用protractor.promise.all()then():

protractor.promise.all([
    elm.getId(),
    browser.driver.switchTo().activeElement().getId()
]).then(function (values) {
    jasmine.matchersUtil.equals(values[0], values[1]);
});
Run Code Online (Sandbox Code Playgroud)

理想情况下,我们希望处于更易读的状态:

protractor.promise.all([
    elm.getId(),
    browser.driver.switchTo().activeElement().getId()
]).spread(function (currentElementID, activeElementID) {
    return jasmine.matchersUtil.equals(currentElementID, activeElementID);
})
Run Code Online (Sandbox Code Playgroud)

javascript promise angularjs selenium-webdriver protractor

10
推荐指数
1
解决办法
1154
查看次数

如何在ProtractorJS中扩展ElementFinder对象?

在使用protractorJS进行一些实验时,我注意到没有简单的方法可以从Protractor扩展(继承)ElementFinder对象以添加自己的功能。

例如,我要创建对象Checkbox,该对象将具有其他方法-check()-应根据isSelected()的结果切换复选框。

我想出了代码-

var ElementFinder = require('protractor/lib/element.js').ElementFinder;
var ElementArrayFinder = require('protractor/lib/element.js').ElementArrayFinder;

class CheckBox extends ElementFinder {
    constructor(loc) {
      var getWebElements = function () {
        var ptor = browser;
        var locator = loc;
        return ptor.waitForAngular().then(function() {
          if (locator.findElementsOverride) {
            return locator.findElementsOverride(ptor.driver, null, ptor.rootEl);
          } else {
            return ptor.driver.findElements(locator);
          }
        });
      }
  var ArrayFinderFull = new ElementArrayFinder(browser, getWebElements, loc);
  super(browser, ArrayFinderFull);
}

    check() {
    return this.isSelected().then(selected => selected? this.click() : null)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是getWebElements是从protractor / element.js复制粘贴-https: //github.com/angular/protractor/blob/3.1.0/lib/element.js#L131

这种复制粘贴使我沮丧。我认为应该有更适当的方法来扩展ElementFinder。

有人在protractorJS中继承了ElementFinder吗?

javascript angularjs protractor

5
推荐指数
2
解决办法
1217
查看次数