我有类似的代码:
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是基于承诺的.我可以例如使用AngularJS $q同时发出所有的sendKey,然后使用$q来等待他们完成?
潜在的解决方案我认为至少有一点黑客需要,无论你如何优化它 – 量角器不给你这个开箱即用.然而,这样的小帮手功能是否适合您的需要?您还需要加快文字输入与ng模型的加速?
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来包装作业,而不仅仅是赋值,因为评估不会评估副作用(一个嵌套的评估,虽然… heh).假设在角度表达式中是真实的,那么$digest()从& amp ;;这会导致摘要发生,您需要更新所有内容,因为您从摘要循环之外设置值.
关于解决方案的想法:
E2E测试背后的整个想法是使用您的应用程序“模拟”最终用户.这可能不会这样做,也可以一个一个地发送密钥,也可以复制粘贴(因为粘贴到元素中是输入输入的有效方式;因为闪存等而难以设置),见下文).
其他潜在解决方案:
>复制和粘贴:创建一个元素,输入文本,复制它,将发送Ctrl V的文本粘贴到目标元素.这可能需要做一些花哨的步法,例如使用Flash(暴露系统剪贴板是一个安全风险),并且“复制”点击一个看不见的Flash播放器.请参阅executeScript
以评估目标上的功能,以便您可以访问诸如窗口之类的变量(如果需要).
>并行化你的测试.阅读官方文档here,搜索“碎片”,然后搜索“多个”.如果您主要担心整个测试集合的持续时间,而不是单独的测试,则扩展浏览器数量可能是要走的路.然而,有一个很好的机会是TDD或某些东西,因此需要每个测试运行得更快.