在它期间...会做一些事情....在角度编码的网站上进行功能测试,我有一个计数器字段,当给定的作业完成其后台任务时递增。
如何让量角器等到计数器从0变为1?
我已尝试过browser.wait,onprepare和isdisplay,但时间因作业而异。
基本上,我希望测试执行以下操作: 登录网站 按照一些按钮点击提交作业 验证计数器为0,当作业完成时,等待计数器为1 然后继续其他测试操作
由于
答案 0 :(得分:1)
您可以编写自己的自定义函数来验证计数器值。此自定义函数可以传递给browser.wait
函数。
假设以下是文件:
HTML文件
<html ng-app="myApp" ng-controller="MainController">
<head>
<title>{{title}}</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.1/angular.min.js"></script>
<script src="src/app.js"></script>
</head>
<body>
<div ng-controller="MyController">
<div class="main">{{data}}</div>
<div class="counter">{{counterVal}}</div>
<button class="counter-btn" ng-click="increaseCounter()">Increase Counter</button>
</div>
</body>
</html>
JS(Angular)文件
angular.module('myApp', [])
.controller('MainController', MainController)
.controller('MyController', MyController);
function MainController($scope) {
$scope.title = 'Protractor test';
}
function MyController($scope, $timeout) {
$scope.data = 'Hi!';
$scope.counterVal = 0;
$scope.increaseCounter = function () {
// Async call, can be a network call.
$timeout(function () {
$scope.counterVal++;
}, 1000);
}
}
量角器测试文件
describe('localhost test page', function () {
it('should open webpage', function () {
browser.get('http://localhost/angularjs/index.html');
expect(element(by.css('.main')).getText()).toEqual('Hi!');
expect(element(by.css('.counter')).getText()).toEqual('0');
// Click the button.
element(by.css('.counter-btn')).click();
browser.wait(waitForCounterIncrease('1'));
// Click again
element(by.css('.counter-btn')).click();
browser.wait(waitForCounterIncrease('2'));
});
// This is the custom funtion.
// Note: If condition is not met, this function will timeout based on the settings.
function waitForCounterIncrease(val) {
return function () {
var deferred = protractor.promise.defer();
element(by.css('.counter')).getText()
.then(function (counterVal) {
console.log(counterVal)
if (counterVal === val) {
deferred.fulfill(counterVal);
}
});
return deferred.promise;
}
}
});
如果您运行上述测试,则应通过验证计数器值。
答案 1 :(得分:0)
通过使用done
处理执行流程,您可以使Protractor停止任何非浏览器操作。 @cnishina here在同一个但不同的背景下有一个美丽的答案
describe('Step 1:Log in and wait for Job to complete', function _loginTo() {
it('wait for Job to finish', function _setupStart(done) {
//Regular Protractor Commands
doLogin();
submitJob();
//Initiate the wait function. Wait till watever the state you need
waitForJobToBeFinished().then(function(){
done();
})
});
});