我有与此类似的代码:
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等待它们完成吗?
潜在的解决方案 我认为,无论您如何优化,至少都需要一点骇客- 量角器不会立即为您提供这些。但是,这样的小助手功能是否适合您的需求?您还需要什么其他来加快text inputs ng-model的边?
text
input
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()是真实的,则从中调用&&;这会导致发生摘要,由于您在摘要周期之外设置了值,因此您需要更新所有内容。
$eval
evaluate
$digest()
&&
关于解决方案的想法:
E2E测试背后的整个想法是使用您的应用“模拟”最终用户。可以说这并没有做到一个接一个地发送键,或者复制并粘贴(因为粘贴到元素中是输入的有效方法;由于闪存等原因很难设置)。 , 见下文)。
其他潜在解决方案:
复制和粘贴: 创建一个元素,输入文本,将其复制,然后将发送Ctrl + V的文本粘贴到目标元素。这可能需要花哨的步法,例如使用Flash(暴露系统剪贴板有安全风险),然后“复制”单击一个不可见的Flash播放器。请参见executeScript评估目标上的函数,以便您可以访问变量(如window需要)。
executeScript
window
并行测试。 在此处阅读官方文档,然后搜索“碎片”,然后搜索“多个”。如果您主要担心整个测试集合的持续时间,而不是单个测试的持续时间,那么扩展浏览器数量可能是解决之道。但是,很有可能您正在TDD或其他方面,因此需要每个测试运行得更快。