Добавить условие для двух кнопок, когда одна из них отображается, чтобы нажать на нее? - PullRequest
0 голосов
/ 06 июня 2019

У меня проблема с условием if (.isDisplayed ()) else if (.isDisplayed ()).

Функция isDisplayed () не работает для этого условия, она всегда входит в первый, если блок, даже элемент powderRinseStartButton отсутствует в DOM.

if (powderRinseStartButton != null && powderRinseStartButton.isDisplayed() && powderRinseStartButton.ispresent()) {
  powderRinseStartButton.click();
} else if (brewerRinseStartButton != null && brewerRinseStartButton.isDisplayed() && brewerRinseStartButton.ispresent()) {
  brewerRinseStartButton.click();
} else {
  fn.click();
}

если я поставлю первый или второй кусок кода, он отлично работает

browser.wait(() => {
      return brewerRinseStartButton.isDisplayed().then(() => {
      browser.wait(EC.visibilityOf(brewerRinseStartButton), delay).then(() =>
      {
          browser.wait(EC.elementToBeClickable(brewerRinseStartButton), delay).then(() =>
          {
              expect(EC.elementToBeClickable(brewerRinseStartButton)).toBeTruthy();

                brewerRinseStartButton.click().then(() =>
                {
                   browser.wait(EC.visibilityOf(maintenanceText), 240000,
                                               'The Maintenance Text should be visible within 240s');
                   expect(maintenanceText.isDisplayed()).toBeTruthy();
               });
           });
       });
    });

  // return powderRinseStartButton.isDisplayed().then(() => 
  // {
  //     browser.wait(EC.visibilityOf(powderRinseStartButton), delay).then(() =>
  //     {
  //         browser.wait(EC.elementToBeClickable(powderRinseStartButton), delay).then(() =>
  //         {
  //             expect(EC.elementToBeClickable(powderRinseStartButton)).toBeTruthy();

  //              powderRinseStartButton.click().then(() =>
  //              {
  //                  browser.wait(EC.visibilityOf(maintenanceText), 240000,
  //                                              'The Maintenance Text should be visible within 240s');
  //                  expect(maintenanceText.isDisplayed()).toBeTruthy();
  //              });
  //          });
  //      });
  //  });

}, 5000)
  .then(() => {
    console.log('return true')
    return true;
  }, () => {
    console.log('false');
    browser.wait(EC.visibilityOf(fn), delay).then(() => {
      browser.wait(EC.elementToBeClickable(fn), delay).then(() => {
        expect(EC.elementToBeClickable(fn)).toBeTruthy();
        fn.click();
      });
    });
  });

Я хочу сделать условие, если brewerRinseStartButton будет показан, чем щелкнуть по brewerRinseStartButton, иначе, если будет отображаться powderRinseStartButton, чем щелкнуть по кнопке powderRinseStartButton, еще что-нибудь.

Я решил эту проблему. IsDisplayed () @вернуть Обещание, которое будет решено с тем, будет ли этот элемент в настоящее время видимым на странице. Подождите, пока все обещания будут выполнены, или любые обещания будут отклонены.

       let failHandler = ()=>
        {
            browser.wait(EC.visibilityOf(fn), delay).then(() =>
            {
                browser.wait(EC.elementToBeClickable(fn), delay).then(() =>
                {
                    expect(fn.isDisplayed()).toBeTruthy();
                    expect(EC.elementToBeClickable(fn)).toBeTruthy();
                    fn.click();
                });
            }); 
        };



        brewerRinseStartButton.isDisplayed().then(()=>
        {                               
            fnBrewer();

        },()=>
        {
            powderRinseStartButton.isDisplayed().then(()=>
            {                                  
                fnPowder();
            },()=>
            { 
                failHandler();
            });
        });

Ответы [ 5 ]

0 голосов
/ 10 июня 2019

Попробуйте следующее.Это определенно должно работать для вас.

const powderRinseStartButton= element(by.id('start_powder_rinse'); 
const brewerRinseStartButton = element(by.id('start_brewer_rinse');

if (await powderRinseStartButton.ispresent()) {
  await powderRinseStartButton.click();
} else if (await brewerRinseStartButton.ispresent()) {
  await brewerRinseStartButton.click();
} else {
 await fn.click();
}

, если для загрузки кнопки требуется некоторое время.попробуйте добавить sleep до if.

Надеюсь, это вам поможет.Пожалуйста, поделитесь ошибкой, если подход не удался.

0 голосов
/ 07 июня 2019

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

async WaitForElement(element, timeout = 30000) {
        try {
            await browser.wait(function () {
                return element.isDisplayed()
                    .then((isDisplayed) => isDisplayed, () => false);
            }, timeout);
            await browser.wait(function () {
                return element.isPresent()
                    .then((isPresent) => isPresent, () => false);
            }, timeout);
            return true;
        }
        catch (e) {
            console.log(e.message);
            return false;
        }
    }




async clickStartButton() {
        // powderRinseStartButton  = element(define locator)
        //brewerRinseStartButton =  element(define locator)

        if (await this.WaitForElement(this.powderRinseStartButton)) {
            await powderRinseStartButton.click();
        } else if (await this.WaitForElement(this.brewerRinseStartButton)) {
            await brewerRinseStartButton.click();
        } else {
            //await fn.click();
        }
    }

Объяснение:

Функция first element.isDisplayed () возвращает объект Promise, поэтому, если мы поместим его вЕсли условие, то оно всегда будет возвращать true, поэтому оно всегда будет проходить через первый цикл If.

Второй момент заключается в том, что browser.wait понимает истину / ложь, поэтому нам нужно разрешить обещание element.isDiplayed, чтобы оно никогда не проходило через исключение, и мы могли ждать до истечения времени ожидания.

0 голосов
/ 06 июня 2019

Возможно, я бы попытался сделать это, используя функциональность или , доступную в локаторах xpath. Логика заключается в том, что вы предоставляете один локатор, который содержит локаторы, необходимые для определения местоположения обоих объектов. Если будет найден первый локатор, он будет использован, если будет найден второй, он будет использован. Если ни того, ни другого не найдено, вы можете использовать ele.isDisplayed() проверку и запустить для нее условие else.

let requiredEle = element(by.xpath('//button[@class="locator1" or @class="locator2"]');

requiredEle.isDisplayed().then(function(wasDisplayed){
    if(wasDisplayed){
      requiredEle.click();
    } else {
      //Your else actions
    }
})
* not tested

Я бы также посоветовал использовать isPresent вместо isDisplayed, если вы можете, поскольку isDisplayed выдает исключение, если элемент отсутствует, и я не совсем уверен, как это будет вести себя в приведенном выше операторе if.

0 голосов
/ 07 июня 2019

Один из способов, который вы можете попробовать в этом сценарии, - использовать цепочку обещаний .then () .catch (), а не if else.Таким образом, в этом случае вы пытаетесь нажать кнопку первого элемента. И в catch () вы не отклоняете и не выкидываете ошибку, а вместо этого нажимаете кнопку второго элемента.Так что в функции вы можете вернуться, как показано ниже:

return brewerRinseStartButton.isDisplayed()
  .then(() => brewerRinseStartButton.click())
  .catch(() => { 
    return powderRinseStartButton.isDisplayed()
     .then(() => powderRinseStartButton.click());
  });
Note: I've also used my mobile keypad for typing so please ignore the code identation. Also I assumed that first you want to try clicking (if found) on brewerRinseStartButton and then you want to try clicking on powderRinseStartButton.

0 голосов
/ 06 июня 2019

Функция IsDisplayed () возвращает обещание, поэтому есть два способа справиться с этим. Один, который вы также пытались использовать при возврате объекта обещания и впоследствии выполнить действие. Второй - самый правильный и чистый способ использования async / await для обработки обещаний

async clickStartButton() {
     if(powderRinseStartButton != null && await 
      powderRinseStartButton.isDisplayed() && await 
    powderRinseStartButton.ispresent())
  {
       await   powderRinseStartButton.click();
    }
   else if(brewerRinseStartButton != null && await 
   brewerRinseStartButton.isDisplayed() && await 
    brewerRinseStartButton.ispresent())
     {
     await   brewerRinseStartButton.click();
    }
    else
   {
       await fn.click();
       {}
     }

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

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