如何使用在webdriverio中进行回调的第三方方法

时间:2018-08-10 17:43:29

标签: webdriver-io

我在这里需要一些帮助...我正在使用一种接受回调的第三方方法...所以现在如果我想在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一起使用。我正在使用黄瓜框架。

谢谢!

2 个答案:

答案 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);
            }
    });
});
}