Как использовать сторонний метод, который принимает обратный вызов в webdriverio

Мне нужна помощь здесь ... Я использую сторонний метод, который принимает в нем обратный вызов ... так что теперь, если я хочу использовать его в WDIO, мне нужно обернуть этот метод внутри обещания ... Итак, я сделал следующее:

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. Я использую огуречный фреймворк.

Спасибо!!


person Naveen Thiyagarajan    schedule 10.08.2018    source источник


Ответы (2)


Хорошо .. С некоторой помощью я смог исправить проблему. Таким образом, wdioRunner (с sync:true) выполняет все команды синхронно. Итак, теперь, если вы хотите использовать асинхронный метод, который принимает обратный вызов, вам нужно использовать browser.call.

http://webdriver.io/api/utility/call.html#Usage

вот каким должен быть метод публикации:

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);
            }
    });
});
}
person Naveen Thiyagarajan    schedule 14.08.2018

Вам не хватает того, что можно вернуть из обещания.

Вам нужен ответ, просто попробуйте вернуть его.

Вы также можете вернуть массив с кодом состояния, ответом и т. Д.

Установить обещание запроса 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 } }
person Bharath Kumar S    schedule 11.08.2018
comment
Привет, Бхарат, Спасибо за помощь ... Не могли бы вы помочь мне, переписав приведенный выше код ... извините, я новичок в JS и wdio, поэтому я не понял, что вы имели в виду ... образец кода мне поможет ... заранее спасибо !!! - person Naveen Thiyagarajan; 11.08.2018
comment
Привет, Бхарат .. Спасибо за редактирование ответа .. Я пытался, но ничего не вышло .. WDIO не ждет ответа ... - person Naveen Thiyagarajan; 12.08.2018
comment
Вы можете попробовать отредактировать свой вопрос, Навин? Что вы изменили - person Bharath Kumar S; 12.08.2018
comment
Привет, вам нужно упомянуть тайм-аут для данного корнишона - person Bharath Kumar S; 12.08.2018