一尘不染

有没有什么方法可以优化/加快使用量角器向UI的数据发送?

angularjs

我有与此类似的代码:

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);
};

这是page.sendKeys函数。请注意,目前这并没有做任何承诺的回报或类似的事情。如果函数的编码不正确,那么我欢迎您发表评论:

// page.sendkeys function
sendKeys(id: string, text: string) {
    element(by.id(id)).sendKeys(text);
}

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

有什么方法可以优化此结果,还是我必须等待一个字段填充另一个字段,并且必须忍受耗时较长的测试?

我认为sendKeys是基于Promise的。例如,我可以使用 AngularJS $ q 同时发布所有sendKeys,然后使用$
q等待它们完成吗?


阅读 146

收藏
2020-07-04

共1个答案

一尘不染

潜在的解决方案 我认为,无论您如何优化,至少都需要一点骇客-
量角器不会立即为您提供这些。但是,这样的小助手功能是否适合您的需求?您还需要什么其他来加快text inputs ng-model的边?

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

解决方案示例:

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);
  });
});

为什么解决方案有效?

您需要使用$eval包装来包装赋值,而不仅仅是赋值,因为evaluate它不会评估副作用(不过是嵌套的评估,……)。假设在角度表达式中$digest()是真实的,则从中调用&&;这会导致发生摘要,由于您在摘要周期之外设置了值,因此您需要更新所有内容。

关于解决方案的想法:

E2E测试背后的整个想法是使用您的应用“模拟”最终用户。可以说这并没有做到一个接一个地发送键,或者复制并粘贴(因为粘贴到元素中是输入的有效方法;由于闪存等原因很难设置)。
, 见下文)。

其他潜在解决方案:

  • 复制和粘贴: 创建一个元素,输入文本,将其复制,然后将发送Ctrl + V的文本粘贴到目标元素。这可能需要花哨的步法,例如使用Flash(暴露系统剪贴板有安全风险),然后“复制”单击一个不可见的Flash播放器。请参见executeScript评估目标上的函数,以便您可以访问变量(如window需要)。

  • 并行测试。此处阅读官方文档然后搜索“碎片”,然后搜索“多个”。如果您主要担心整个测试集合的持续时间,而不是单个测试的持续时间,那么扩展浏览器数量可能是解决之道。但是,很有可能您正在TDD或其他方面,因此需要每个测试运行得更快。

2020-07-04