我在这里需要一些帮助...我正在使用一种接受回调的第三方方法...所以现在如果我想在WDIO中使用该方法,则需要将该方法包装在promise中...所以我做了以下:
post(env, userAccount, canonical, isItQuery){
let options = { ..... };
return new Promise(function(resolve, reject){
request.post(options,function(error, response){
logger.info('In to the callback of request post');
if(!error){
resolve(response);
}
else{
reject(error);
}
});
});
}
我试图像这样在stepDefinition内部调用此方法:
rm.post(env,userAccountID,payloadName,true).then(function(resp) {
console.log('Response: ' + resp);
})
.catch(function(error){
console.log("ERROR: " + error);
})
在执行过程中,脚本没有等待request.post
方法的响应...并且执行没有响应就完成了...请帮助我,我如何才能完成这项工作...
我使用request-promise
npm-module尝试了同样的操作,该模块返回promise
而不是进行回调并出现相同的问题:
这是示例代码:
import {defineSupportCode} from 'cucumber';
import request from 'request-promise';
import config from 'config';
import fs from 'fs';
require('request-promise').debug = true;
defineSupportCode(function({Given, When, Then}){
Given(/^Run the "([^"]*)" with user_session of "([^"]*)"$/, (canonical, user_session) => {
.......
.......
const payload = fs.readFileSync(path,{encoding:'utf8'});
let options = {
...........
...........
};
request(options)
.then(function ($) {
console.log($);
})
.catch(function (err) {
console.log('error');
});
});
});
我正在将wdioRunner与sync:true
一起使用。我正在使用黄瓜框架。
谢谢!
答案 0 :(得分:0)
您错过了诺言的回报。
您需要一个响应,只需尝试将其返回即可。
您还可以返回包含状态代码和响应等的数组。
安装请求承诺 npm install-保存请求承诺
var rp = require('request-promise');
var cheerio = require('cheerio');
var options = {
uri: 'http://www.google.com',
transform: function (body) {
return cheerio.load(body);
}
};
rp(options)
.then(function ($) {
console.log($);
})
.catch(function (err) {
console.log('error');
});
响应正文看起来像
{ [Function: initialize]
fn:
initialize {
constructor: [Circular],
_originalRoot:
{ type: 'root',
name: 'root',
namespace: 'http://www.w3.org/1999/xhtml',
attribs: {},
'x-attribsNamespace': {},
'x-attribsPrefix': {},
children: [Array],
parent: null,
prev: null,
next: null } },
load: [Function],
html: [Function],
xml: [Function],
text: [Function],
parseHTML: [Function],
root: [Function],
contains: [Function],
merge: [Function],
_root:
{ type: 'root',
name: 'root',
namespace: 'http://www.w3.org/1999/xhtml',
attribs: {},
'x-attribsNamespace': {},
'x-attribsPrefix': {},
children: [ [Object], [Object] ],
parent: null,
prev: null,
next: null },
_options:
{ withDomLvl1: true,
normalizeWhitespace: false,
xml: false,
decodeEntities: true } }
答案 1 :(得分:0)
好的。在一些帮助下,我得以解决此问题。因此,wdioRunner(带有sync:true
)将同步运行每个命令。因此,现在,如果您要使用需要回调的异步方法,则需要使用browser.call
。
http://webdriver.io/api/utility/call.html#Usage
这就是post方法应该的样子:
post(env, userAccount, canonical, isItQuery){
let options = { ..... };
browser.call(() => {
return new Promise(function(resolve, reject){
request.post(options,function(error, response, resp){
console.log('Inside the callback!!!!!');
jsonResponse = resp;
if(!error){
console.log('NO Error: ' + resp);
resolve(resp);
}
else{
console.log('Error: ' + error);
reject(error);
}
});
});
}