有没有办法优化/加速使用Protractor将数据发送到UI?

Sam*_*tar 13 webdriver angularjs selenium-webdriver protractor chrome-web-driver

我有类似这样的代码:

ExamPage.prototype.enterDetailsInputData = function (modifier) {
    page.sendKeys(this.modalExamName, 'Test Exam ' + modifier);
    page.sendKeys(this.modalExamVersionId, 'Test exam version ' + modifier);
    page.sendKeys(this.modalExamProductVersionId, 'Test exam product version ' + modifier);
    page.sendKeys(this.modalExamAudienceId, 'Test exam audience ' + modifier);
    page.sendKeys(this.modalExamPublishedId, '2014-06-1' + modifier);
    page.sendKeys(this.modalExamPriceId, '100' + modifier);
    page.sendKeys(this.modalExamDurationId, '6' + modifier);
};
Run Code Online (Sandbox Code Playgroud)

这是page.sendKeys函数.请注意,目前这不是任何承诺或类似的回报.如果函数编码不好,那么欢迎评论:

// page.sendkeys function
sendKeys(id: string, text: string) {
    element(by.id(id)).sendKeys(text);
} 
Run Code Online (Sandbox Code Playgroud)

我看着它慢慢填满我屏幕上的每个字段,然后在接下来的更多测试中一次又一次地重复它.

有没有什么方法可以优化这个或者我必须等待一个字段接一个填充并且必须忍受需要很长时间才能运行的测试?

我认为sendKeys是基于承诺的.我可以使用AngularJS $ q同时发出所有sendKeys然后使用$ q等待它们完成吗?

Wor*_*red 10

潜在的解决方案我认为无论你如何优化它都至少需要一点hackery - 量角器不会让你开箱即用.然而,像这样的小帮手功能是否适合您的需求?你还需要什么来加速text inputng-models的关系?

function setNgModelToString(element, value) {
    return element.getAttribute('ng-model').then(function (ngModel) {
        element.evaluate('$eval("' + ngModel + ' = \'' + value + '\'") && $digest()');
    });
}
Run Code Online (Sandbox Code Playgroud)

解决案例:

describe('angularjs homepage', function() {
  it('should have a title', function() {
    browser.get('http://juliemr.github.io/protractor-demo/');

    var inputString1 = '';
    var inputString2 = '';
    for (var i = 0; i < 1000; i++) {
        inputString1 += '1';
        inputString2 += '2';
    }

    /* Uncomment this to see it runs much much slower when you enter each key. */
    //element(by.model('second')).sendKeys(inputString1);   

    setNgModelToString(element(by.model('second')), inputString2);

    expect(element(by.model('second')).getAttribute('value')).toEqual(inputString2);
  });
});
Run Code Online (Sandbox Code Playgroud)

为什么解决方案有效?

您需要使用$eval包装赋值而不仅仅是赋值,因为evaluate不评估副作用(嵌套评估,但是......嘿).假设角度表达式中的truthy然后$digest()&&; 这会导致摘要发生,您需要更新所有内容,因为您从摘要周期之外设置了一个值.

关于解决方案的想法:

E2E测试背后的整个想法是使用您的应用"模仿"最终用户.这可以说不是那么做,而是一个一个地发送密钥,或者复制粘贴(因为粘贴到元素中是输入输入的有效方式;由于闪存等原因很难设置) , 见下文).

其他潜在解决方案

  • 复制并粘贴:创建元素,输入文本,复制文本,将发送Ctrl + V的文本粘贴到目标元素.这可能需要做一些花哨的步法,比如使用Flash(暴露系统剪贴板是一种安全风险)并且"复制它"点击一个看不见的flash播放器.请参阅executeScript评估目标上的函数,以便您可以访问变量,window如果需要的话.

  • 并行化测试.这里阅读官方文档并搜索"shard"然后"multiple".如果您主要担心整个测试集合的持续时间而不是单独的测试,那么扩展浏览器数量可能就好了.然而,你很有可能是TDD-ing或其他东西,因此需要每个测试运行得更快.