Использование для цикла и, если еще в кипарисе - PullRequest
1 голос
/ 08 ноября 2019

Я нахожусь в ситуации, когда мне нужно использовать цикл, и если еще блок в кипарис

Сценарий : после входа в приложение, мне нужночитать текст элемента, округленный на скриншоте ниже. enter image description here

Этот элемент появится через 20-90 секунд после того, как я войду в систему, когда обновлю экран. поэтому мне нужно написать что-то вроде этого, дождаться элемента, если он появляется, читает текст и возвращает значение, если не ждать 10 секунд, перезагрузить страницу и повторить процесс.

     function waitAndreload() {
    for (let i = 0; i < 10; i++) {
      cy.get("#ele").then(ele => {
        if (ele.text()) {
          return ele.text();
        } else {
          cy.wait(10000);
          cy.reload();
        }
      });
    }
  }

Как написать это на кипарисе, так как кипарис не будет поддерживать циклы if-else или for

Ответы [ 3 ]

0 голосов
/ 08 ноября 2019

Я бы сказал, что использование цикла for для чего-то подобного, а обновление - это анти-паттерн. Похоже, вы ожидаете, что текст появится в элементе, а не в самом элементе.

Если да, можете ли вы заглушить ответ серверу, чтобы он сразу вернулся? Если это не сработает, просто сделайте cy.wait('@<whatever you aliased your response as>'), пока вызов не будет завершен

0 голосов
/ 09 ноября 2019

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

Добавление к комментарию @dwelle, кажется, что то, что вы пытаетесь сделать, не самое лучшее. Практика с точки зрения дизайна теста. Тесты должны быть детерминированными и контролировать все соответствующие входные данные, которые могут повлиять на ожидаемый результат.

Более конкретно, является ли этот текст тем, что должен видеть и использовать реальный пользователь, или только тем, для чего разработчики ставятцели отладки или тестирования? Если это для реального пользователя, то что определяет, должен ли он появиться или нет? (Является ли это чисто случайным ?, Если это так, см. Ниже), если это для целей тестирования или отладки, поговорите с разработчиками и придумайте лучшее решение, в котором вы можете контролировать, появляется ли этот текст напрямую или нет. Если это что-то, что пользователь должен видеть, и это не случайно, то подумайте, какие условия должны быть выполнены для того, чтобы текст появился, и спроектируйте тест таким образом, чтобы это условие выполнялось, контролируя фактические необходимые предварительные условия илииспользуя насмешки для имитации этого условия. Опять же, я рекомендую вам проконсультироваться с разработчиками, чтобы помочь вам найти лучший подход.

В случае, если это «чисто» случайный случай, попросите разработчиков предоставить способ указать seed генератора случайных чисел, и тогда вы тоже сможете им управлять.

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

function getEnvironment() {
   function getEnvironmentInternal(retires) {
        if (retires == 0)
            throw "text didn't appear after the specified retires";
        return ele.text().then(text => {
            if(text)
                return cy.wrap(text);

           cy.wait(10000);
           cy.reload();
           return getEnvironmentInternal(retires-1);
        });
    )};

    return getEnvironmentInternal(10);
}

// usage:
getEnvironment().then(text => {
    // do something with text...
}
0 голосов
/ 08 ноября 2019

Так что, кажется, вы просто хотите дождаться появления этого элемента и затем принять текстовое значение. Таким образом, что-то вроде cy.get('#ele', {timeout: 60000}).should('exist').invoke('text').then(text => ...work with text value)

Утверждения в Cypress имеют встроенный механизм повторных попыток, поэтому, если он завершится неудачно до истечения времени ожидания, он повторит предыдущую команду.

...