CodeceptJS / Puppeteer не распознает оператор if

не очень знаком с js / node.js. использование codeceptjs / puppeteer для некоторых автоматизированных тестов. щас пытаюсь отредактировать описание в тесте. но иногда описания нет - поэтому нет кнопки «изменить описание» - вместо этого есть кнопка «добавить описание». поэтому я написал оператор if, в котором указывается. но код просто зашкаливает. не имеет значения, что это за инструкция, она просто переходит на следующую строку. в настоящее время if (desc) и if(!desc) выполняют одну и ту же функцию - переход к следующей строке в операторе if. это вызывает ошибку, потому что описание уже есть, и поэтому кнопка «добавить описание» недоступна. Я не уверен, что происходит.

Scenario('test something', (I, userLoginPage, FBPagePage) => {


    userLoginPage.validate();


    I.click('//*[@id="card_611"]');
       // clicks the card

    var desc = '//*[@id="show_card_description"]/section/button';
    // add description button
    // tried 'Add description' but the result was the same

    if (desc){
     // this is where the error happens. it simply looks for the add description button
     // no matter what button is there it decides to click the 'add description' button

        I.click('//*[@id="show_card_description"]/section/button');
    // click add desc button

        I.fillField('//*[@id="description_editor_container"]/div[2]/div[1]',
        'not admin user created this description thanks to automated testing');
    // types this stuff 
        I.click('//*[@id="description_editor_container"]/button[1]');
    // saves it 
        I.wait(1);
}

    I.click('//*[@id="show_card_description"]/section/h5/a');
    // click edit desc button if a description already exists
    I.fillField('//*[@id="description_editor_container"]/div[2]/div[1]', 'not admin user edited this description thanks to automated testing');
    I.click('//*[@id="description_editor_container"]/button[1]');


I.say('success!')
});

person amnmustafa15    schedule 18.10.2019    source источник


Ответы (2)


Чтобы дать вам правильный контекст: вы задаете вопрос Node.js, а не CodeceptJS или Puppeteer в первую очередь.

desc всегда true, потому что вы объявляете его как строку, поэтому, как вы уже выяснили, независимо от того, какой код внутри if будет выполняться.

Вы можете использовать что-то вроде:

const numOfElements = await I.grabNumberOfVisibleElements('#show_card_description section button'); // Use CSS locator instead of Xpath for easier readability

console.log(numOfElements); // Debug

if(numOfElements === 1) {
   …
}

См. Также https://codecept.io/helpers/Puppeteer#grabnumberofvisibleelements.

person Paul Vincent Beigang    schedule 21.10.2019

Сопровождающие не поддерживают оператор if, используя обычные файлы функций в функциях сценария, ссылаясь на это как на плохую практику для тестирования из-за неожиданных результатов, вместо этого вы должны выполнять их внутри пользовательских вспомогательных файлов, например:

   /**
   * Checks the specified locator for existance, if it exists, return true
   * If it is not found log a warning and return false.
   */

  async checkElement(locator) 
  {
    let driver = this.helpers["Appium"].browser;
    let elementResult = await driver.$$(locator);
    if (elementResult === undefined || elementResult.length == 0) 
    {
      //console.log("Locator: " + locator + " Not Found");
      return false;
    } 
    else if (elementResult[0].elementId) 
    {
      //console.log("Locator: " + locator + " Found");
      return true;
    }
  }

ссылка - https://codecept.io/helpers/

person Community    schedule 03.12.2019