Выполнение пропускает обещания - PullRequest
1 голос
/ 07 мая 2019

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

несколько запутанных моментов:

  • если я не буду использовать await с обещанием обработки строки кода, например с использованием затем
  • , если я буду использовать ключевое слово async в функции then, такой как

Пример:

 await item.element(by.css("h4 a")).getText().then(async(text)=> {
            if (text == product) {
                await item.element(by.css("button[class*='btn-info']")).click();
            }

Рабочий результат:

enter image description here

Inвыше изображение результаты переменной напечатаны как 80000 и т. д.

Мой код, как показано ниже:

Первый подход:

IЯ должен заменить каждое ключевое слово функции и поставить асинхронную на толстую функцию, я также добавил ожидание везде, где это мне позволяет.также я использую await, а затем вместе

import { Given, When, Then } from "cucumber";
import { browser, element, by } from "protractor";
import { async } from "q";
import chai from "chai"

let assert = chai.assert;
async function selectItems(product) {
    //take 4 cards into list
    //go through each index in the list - and get the title= if title =desired title then in that index i will select add button
    await element.all(by.tagName("app-card")).each(async(item) => {

      await item.element(by.css("h4 a")).getText().then(async(text)=> {
            if (text == product) {
                await item.element(by.css("button[class*='btn-info']")).click();
            }
        })
    })
}
Given(':I will navigate to qaacamedy site', async () => {
   await browser.get("https://qaclickacademy.github.io/protocommerce/");
   await console.log("browser lunched");
  });

  When(': click on the shop and add all products in cart', async () => {
    await element(by.linkText("Shop")).click();
    await selectItems("Samsung Note 8");
    await selectItems("iphone X");

    await element(by.partialLinkText("Checkout")).getText().then(function(text) {
        let res = text.split("(");
        let x = res[1].trim().charAt(0);
        let y = x;
        console.log(y);
        assert.equal(res[1].trim().charAt(0),x);
    })
  });

  When(': I calculate all price', async () => {
    let value;
    let amount=new Array() ;
    let set= new Set();
    await element(by.partialLinkText("Checkout")).click();
    await element.all(by.css("td[class*='text-center']")).each(function(item){
          item.element(by.css("strong")).getText().then(function(text) {
               console.log(text);
               let res =text.split('.');
               value=Number(res[1].trim());
               amount.push(value);
               set.add(value);
               console.log("my value ="+value);
               console.log("my amounts"+amount);
        }) 
    })
        let add=0;
            // for (let i = 0; i < amount.length; i++) {
            //     await console.log("array value = "+amount[i]);
            //     add=add+amount[i];
            //  }
             for (let num of set) {

              await console.log("iterbale value of set = "+num);     //1 2 3 4 5 6
               add=add+num;
            }


             await console.log("total calculate value ="+add);
             await console.log("my amounts final"+amount);
  });

  Then(': some should be shown', async () =>  {
    await console.log("Then Statement");
  });

enter image description here

Как показано в приведенном выше результате, операторы не печатаются сейчас, но иногда я получаю результаты

Второй подход:

Я попытался также использовать функцию обещания как асинхронную:

import { Given, When, Then } from "cucumber";
import { browser, element, by } from "protractor";
import { async } from "q";
import chai from "chai"

let assert = chai.assert;
async function selectItems(product) {
    //take 4 cards into list
    //go through each index in the list - and get the title= if title =desired title then in that index i will select add button
    await element.all(by.tagName("app-card")).each(async(item) => {

      await item.element(by.css("h4 a")).getText().then(async(text)=> {
            if (text == product) {
                await item.element(by.css("button[class*='btn-info']")).click();
            }
        })
    })
}
Given(':I will navigate to qaacamedy site', async () => {
   await browser.get("https://qaclickacademy.github.io/protocommerce/");
   await console.log("browser lunched");
  });

  When(': click on the shop and add all products in cart', async () => {
    await element(by.linkText("Shop")).click();
    await selectItems("Samsung Note 8");
    await selectItems("iphone X");

    await element(by.partialLinkText("Checkout")).getText().then(async(text)=> {
        let res = text.split("(");
        let x = res[1].trim().charAt(0);
        let y = x;
        await console.log(y);
        await assert.equal(res[1].trim().charAt(0),x);
    })
  });

  When(': I calculate all price', async () => {
    let value;
    let amount=new Array() ;
    let set= new Set();
    await element(by.partialLinkText("Checkout")).click();
    await element.all(by.css("td[class*='text-center']")).each(async(item)=>{
          item.element(by.css("strong")).getText().then(async(text)=> {
               await console.log(text);
               let res =text.split('.');
               value=Number(res[1].trim());
               amount.push(value);
               set.add(value);
               await console.log("my value ="+value);
               await console.log("my amounts"+amount);
        }) 
    })
        let add=0;
            // for (let i = 0; i < amount.length; i++) {
            //     await console.log("array value = "+amount[i]);
            //     add=add+amount[i];
            //  }
             for (let num of set) {

              await console.log("iterbale value of set = "+num);     //1 2 3 4 5 6
               add=add+num;
            }


             await console.log("total calculate value ="+add);
             await console.log("my amounts final"+amount);
  });

  Then(': sum should be shown', async () =>  {
    await console.log("Then Statement");
  });

Здесь во втором подходе я также получаюта же проблема.

Также предложите, это хорошая практика для обработки функции обещания, а также ниже:

await element(by.partialLinkText("Checkout")).getText().then(async(text)=> {

В обоих вышеупомянутых подходах я использую флаг ниже:

SELENIUM_PROMISE_MANAGER: false,

Эта проблема всегда возникает, особенно если я использую режим отладки с помощью launch.json

Мой файл функций выглядит следующим образом:

Feature: I am going to validate the qaacamedy site

Scenario: practice assignment

    Given :I will navigate to qaacamedy site
    When : click on the shop and add all products in cart 
    When : I calculate all price 
    Then : sum should be shown

также попытался удалить пакеты async, async kit и protractor и установить их снова, как только это сработало, но через некоторое время снова начало показывать мне проблему.не понимая, почему одно и то же поведение кода по-разному, я не понимаю, какова основная причина проблемы, застревая много дней на одном и том же

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

1 Ответ

2 голосов
/ 08 мая 2019

Поскольку вы используете async/await, вам следует избегать традиционной обработки обещаний (например, then). Также похоже, что вы await используете методы, которые не возвращают обещание, что по сути бессмысленно. Объявление async при обратном вызове не делает вызывающий метод асинхронным.

Правильная реализация selectItems будет выглядеть примерно так:

async function selectItems(product) {
    // async functions return a promise, use 'map' so we can wait for the promises to resolve using Promise.all
    const promises = element.all(by.tagName("app-card")).map(async (item) => {
        // use await on getText() since it returns a promise
        const text = await item.element(by.css("h4 a")).getText();
        if (text == product) {
            // return the promise produced by 'click'
            return item.element(by.css("button[class*='btn-info']")).click();
        }
    });
    return Promise.all(promises);
}

Тесты также должны быть обновлены, чтобы избежать смешивания синтаксиса async/await с традиционной обработкой обещаний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...