Немногие строки кода не выполняются периодически в Protractor - PullRequest
0 голосов
/ 14 мая 2018

Я вызываю функцию из моего теста, которая выполняет вызов службы API и возвращает значение. Я могу напечатать значение переменной из моего теста, который возвращается каждый раз. Однако строки кода после этого не выполняются. Это происходит периодически.

Основная функция:

it('Test1', function () {
  element(by.xpath("xpath of the element1")).click();
  response = homepo.getValuefromAPI();
  response.then(function(value){
    console.log("**********value inside Main*****************");
    console.log((value)); 
    element(by.xpath("xpath of the element2")).sendKeys(value);
    browser.sleep(3000);
    element(by.xpath("xpath of button']")).click();
    expect(value).toBe("expected value");
  });
});

Функция, которая возвращает обещание:

getValuefromAPI(){
var deffered = protractor.promise.defer();
var options = {
  method: 'POST',
  url: 'url',
  headers:
    {'Content-Type': 'application/json'},
  body:
    {json body},
};
request(options, function (error, response, body) {
  let responseData = JSON.stringify(body);
  console.log("**********responseData inside function*****************");
  console.log(responseData);
  console.log("*******************Id*****************");
  console.log(body.content[0].data.section.class.repository[0].period.points[0].id);
  deffered.fulfill(body.content[0].data.section.class.repository[0].period.points[0].id);
});
return deffered.promise;
}

Выход:

**********responseData inside function*****************
ABCDFEGHIJKLMNOPQRSTUVWXYZ
*******************Id*****************
ABCDFEGHIJKLMNOPQRSTUVWXYZ
**********value inside Main*****************
ABCDFEGHIJKLMNOPQRSTUVWXYZ
x Test1
  - Expected 'ABCDFEGHIJKLMNOPQRSTUVWXYZ' to be 'expected value'.

Действие sendKeys и действие click после этого (в основном тесте) пропускаются большую часть времени, и элемент управления непосредственно переходит к выражению ожидаемого. Иногда эти операторы выполняются без проблем.

Что-то не так с тем, как я справляюсь с обещанием?

Обновление : Теперь я также попытался выполнить вызов API внутри блока 'it' вместо возврата значения. Однако строки по-прежнему не выполняются.

it('Test1', function () {
var options = {
  method: 'POST',
  url: 'url',
  headers:
    { 
    'Content-Type': 'application/json'
    },
  body:
    { 
    json body
    },
};
request(options, function (error, response, body) {
    let responseData = JSON.stringify(body);
    console.log("**********responseData inside function*****************");
    console.log(responseData);
    console.log("*******************Id*****************");
    console.log(body.content[0].data.section.class.repository[0].period.points[0].id); 
    element(by.xpath("xpath of the element1")).click();
    console.log("**********value inside Main*****************");
    console.log((value)); 
    browser.sleep(2000);   //This line is not getitng executed
    element(by.xpath("xpath of the element2")).sendKeys(value);   //This line is not getitng executed
    browser.sleep(2000);   //This line is not getitng executed
    element(by.xpath("xpath of button']")).click();   //This line is not getitng executed
    browser.sleep(2000);   //This line is not getitng executed
    expect(value).toBe("expected value");
});
});

Ответы [ 4 ]

0 голосов
/ 21 мая 2018

Проблема устранена для меня добавлением оператора ожидания и возврата, как указано ниже:

getValuefromAPI(){
  var deffered = protractor.promise.defer();
  return browser.wait(function() {
    var options = {
    method: 'POST',
    url: 'url',
    headers:
      {'Content-Type': 'application/json'},
    body:
      {json body},
  };
  request(options, function (error, response, body) {
    let responseData = JSON.stringify(body);
    console.log("**********responseData inside function*****************");
    console.log(responseData);
    console.log("*******************Id*****************");
    var id = body.content[0].data.section.class.repository[0].period.points[0].id;
    console.log(id);  
    deffered.fulfill(id);
  });
  return deffered.promise;
  }, 10000).then(function(){
    return id;
});
0 голосов
/ 16 мая 2018

Значение возвращаемого обещания, которое вы сохраняете в «value», не изменяется. Итак, даже после следующих действий

element(by.xpath("xpath of the element2")).sendKeys(value);
browser.sleep(3000);
element(by.xpath("xpath of button']")).click();

оно останется таким же. Так что не имеет значения, куда вы положили expect(value).toBe("expected value"); Попробуйте поставить expect(value).toBe("expected value"); прямо в начале обещания:

response.then(function(value){
    expect(value).toBe("expected value");
    console.log("**********value inside Main*****************");
    console.log((value)); 
    element(by.xpath("xpath of the element2")).sendKeys(value);
    browser.sleep(3000);
    element(by.xpath("xpath of button']")).click();
  });
0 голосов
/ 18 мая 2018

Хорошо, попробуйте это. Вместо того, чтобы использовать возврат из функции API, попробуйте использовать обратный вызов, как показано:

getValuefromAPI(callback){
var deffered = protractor.promise.defer();
var options = {
  method: 'POST',
  url: 'url',
  headers:
    {'Content-Type': 'application/json'},
  body:
    {json body},
};
request(options, function (error, response, body) {
  let responseData = JSON.stringify(body);
  console.log("**********responseData inside function*****************");
  console.log(responseData);
  console.log("*******************Id*****************");
  console.log(body.content[0].data.section.class.repository[0].period.points[0].id);
  deffered.fulfill(body.content[0].data.section.class.repository[0].period.points[0].id);
});
callback (deffered.promise);
}

Ваша вызывающая функция будет выглядеть примерно так:

  it('Test1', function () {
          element(by.xpath("xpath of the element1")).click();
          homepo.getValuefromAPI(function(response){
            response.then(function(value){
                 console.log("**********value inside Main*****************");
                 console.log((value)); 
                 element(by.xpath("xpath of the element2")).sendKeys(value);
                 browser.sleep(3000);
                 element(by.xpath("xpath of button']")).click();
                expect(value).toBe("expected value");
               });
          });   
    });
0 голосов
/ 14 мая 2018
it('Test1', function () {
  element(by.xpath("xpath of the element1")).click();
  response = homepo.getValuefromAPI();
//it will only execute when the value is set
    if(!!response){
          response.then(function(value){
            element(by.xpath("xpath of the element2")).sendKeys(value);
            browser.sleep(3000);
            element(by.xpath("xpath of button']")).click();
            expect(value).toBe("expected value");
           });
    }
});
...