javascript - jasmine 异步回调未在指定的超时内调用
问题描述
我是量角器和 javascript 的新手。我知道有很多关于这个错误的问题和解决方案。但是没有一个解决方案让我对异步回调有一个清晰的理解,这个错误对我来说仍然存在。
我正在使用页面对象模型。请参考我自己构建的以下代码:
元素.js:
var pageElements = function(){};
pageElements.prototype = Object.create({},{
usernameField:{get: function(){return element(by.id('username'));}},
passwordField:{get: function(){return element(by.id('password'));}},
signinButton:{get: function(){return element(by.xpath("xpath"));}},
formField1:{get: function(){return element(by.xpath("xpath1"));}},
formField2:{get: function(){return element(by.xpath("xpath2"));}},
});
module.exports = pageElements;
控制.js:
var EC = protractor.ExpectedConditions;
var controls = require('../Controls/controls.js');
exports.waitForElementById = async function(id){
debugger;
var isVisible = EC.visibilityOf(id);
await browser.wait(isVisible,50000);
browser.sleep(3000);
};
exports.waitForElementByXpath = async function(xpaths){
var isVisible = EC.visibilityOf(xpaths);
await browser.wait(isVisible,50000);
browser.sleep(3000);
};
exports.sendKeysById = async function(ids, value){
controls.waitForElementById(ids);
var isVisible;
for(i = 1; i<5; i++){
isVisible = EC.visibilityOf(ids);
if(isVisible){
return await ids.sendKeys(value).then(function(){
browser.sleep(500);
}) .catch(error => {
console.log('---------Error: Element not sent by id-----------');
throw error;
});
}
}
}
exports.clickElementById = async function(id){
controls.waitForElementById(id);
var isClickable;
var processingBar;
var check;
for(i = 1; i<5; i++){
isClickable = EC.elementToBeClickable(id);
processingBar = EC.invisibilityOf(element(by.xpath("//*[contains(@id,'exterroLoader')]")));
check = EC.and(isClickable,processingBar);
if(check){
return await id.click().then(function(){
browser.sleep(500);
}) .catch(error => {
console.log('---------Error: Element not clicked by id-----------');
throw error;
});
}
}
};
formOperations.js
browser.ignoreSynchronization = true;
var controls = require('./controls.js');
var pageElements = require('./elements.js');
var e;
exports.form1 = async function(){
e = new pageElements();
browser.get("https://form.htm");
await controls.sendKeysById(e.usernameField);
await controls.sendKeysById(e.passwordField);
await controls.clickByXpath(e.signinButton);
await controls.sendKeysById(e.formField1);
};
exports.form2 = async function(){
e = new pageElements();
browser.get("https://form.htm");
await controls.sendKeysById(e.usernameField);
await controls.sendKeysById(e.passwordField);
await controls.clickByXpath(e.signinButton);
await controls.sendKeysById(e.formField2);
};
测试用例.js
var ignore = function(exp){return{it:((typeof exp==='function')?exp():exp)?function(){}:it}};
describe('Automation', function() {
var controls = require('./controls.js');
browser.ignoreSynchronization = true;
browser.get('https://prre2eauto.exterrocloud.info');
it('Form 1', async function(){
var a = require('./formOperations.js');
await a.form1();
});
it('Form 2', async function(){
var a = require('./formOperations.js');
await a.form2();
});
});
上面给出了一个示例代码,但我使用的模型完全相同。
我真正面临的是
- form1 执行成功,没有任何错误。
form2 执行成功,但出现以下错误:
Jasmine spec timed out. Resetting the WebDriver Control Flow. Message: [31m Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.[0m Stack: Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. at ontimeout (timers.js:498:11) at tryOnTimeout (timers.js:323:5) at Timer.listOnTimeout (timers.js:290:5)
请对此提供帮助,因为我需要更长的时间才能理解。
解决方案
试试下面的
var controls = require('./controls.js');
describe('Automation', function() {
beforeEach(async() =>{ //This block will be executed before every `it` block
await browser.waitForAngualrEnabled(true);
await browser.get('https://prre2eauto.exterrocloud.info');
});
it('Form 1', async function(){
var a = require('./formOperations.js');
await a.form1();
});
it('Form 2', async function(){
var b = require('./formOperations.js');
await b.form2();
});
});
希望对你有帮助
推荐阅读
- php - 判断cURL下载的文件类型
- javascript - 浏览器验证消息中的 NewLine
- javascript - 我想遍历 react.js 中的对象数组并按条件对其进行排序
- java - 如何使用 javafx 使用 DropDown Items 进行 sidenav?
- html - 媒体查询疯狂。当项目显示为无时,如果恢复为初始显示类型,如何恢复显示元素?
- python - PDFminer 从每页的标题中获取字体大小(迭代)
- sql - Find value contained in the HierarchyId at any level
- c# - OpenXML reference document parts multiple time
- java - Finding random (auto) id assigned to our document by Firestore
- sql - Adding data to existing table with primary key violates unique constraint despite being unique?