Potential Solution I think at least a little hackery is required no matter how you optimize it - protractor doesn't give you this out of the box. However would a small helper function like this suit your needs? What else do you need to speed up sides text
input
s with ng-model
s?
function setNgModelToString(element, value) {
return element.getAttribute('ng-model').then(function (ngModel) {
element.evaluate('$eval("' + ngModel + ' = '' + value + ''") && $digest()');
});
}
Solution Example:
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);
});
});
Why does the solution work?
You need to use $eval
to wrap the assignment and not just assignment as evaluate
does not evaluate side effects (a nested evaluation, though... heh). Assuming that's truthy in angular expressions then $digest()
is called from the &&
; this causes a digest to happen, which you need to update everything since you set a value from outside the digest cycle.
Thoughts about the solution:
The whole idea behind an E2E test is to "emulate" an end-user using your app. This arguably doesn't do that as well as sending the keys one-by-one, or copy-and-paste (since pasting into elements is a valid way of entering input; it's just hard to set up due to flash, etc., see below).
Other Potential Solutions:
Copy and Paste: Create an element, enter text, copy it, paste the text sending Ctrl + V to the target element. This may require doing a bunch of fancy footwork, like using Flash (exposing the system clipboard is a security risk) and having "copy it" click an invisible flash player. See executeScript
to evaluate functions on the target so that you have access to variables like window
if you need that.
Parallelizing your tests. Read the official doc here and search for "shard" and then "multiple". If you're mainly worried about the duration of your entire test collection and not individual tests, scaling out your browser count is probably the way to go. However there's a good chance you are TDD-ing or something, hence needing each test to run faster.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…