Подтвердить что ты не робот

Тайм-аут транспортировщика

Я разрабатываю автоматические тесты в Protractor довольно долгое время, и, как и многие из вас, я столкнулся с пробелами, которые можно пересечь только с помощью browser.sleep() -bridge. Я не поклонник жесткого кодирования таких вещей, как это, но если это необходимо, я буду.

Те тесты, которые я разработал, привели меня к точке, где каждый browser.sleep(1000) оказывает большое влияние на мое время выполнения. Тесты в настоящее время тестируют разрешения для разных учетных записей (точно 128), и это включает в себя вход и выход, проверяя, что каждая учетная запись имеет и не получила доступа.

Веб-сайт, который я тестирую, представляет собой чистое приложение AngularJS, которое, на мой взгляд, должно сделать browser.sleep() устаревшим методом, поскольку существует метод browser.waitForAngular(), который точно ждет, пока страница будет полностью загружена по сравнению с browser.sleep() который ждет определенное количество времени, и если ваш сайт не загружен в течение этого времени (это происходит), у вас будет непоследовательный тест (никто не любит несоответствие).

Исследования привели меня к мысли, что browser.waitForAngular() не учитывает анимацию и связанные с ней трудоемкие функции, поскольку они не связаны с AngularJS, но это не реализовано на нашем веб-сайте. Также waitForAngular() в основном ждет $digest, $http и $timeout.

То, о чем я спрашиваю, это то, что считается приемлемой потерей, поскольку Транспортер в целом хорош или есть что-то, что я здесь не замечаю?

TL; ДР: Существуют ли решения, позволяющие нам не соглашаться на browser.sleep()?

Источники: Протоколы тайм-аута трактатора, Timeout-spec.js(документы транспортира), Issue909, Issue279, Issue92, StackQuestion1

4b9b3361

Ответ 1

Если вы можете разработать какой-то тест, чтобы определить, завершилось ли все, что вы ожидаете, вы можете использовать browser.wait. Принимая идеи от http://docsplendid.com/archives/209, вы можете передать функцию, которая возвращает обещание, которое разрешает true или false, например, тот, который использует isPresent

browser.wait(function() {
  return element(by.id('some-element')).isPresent();
}, 1000);

или если у вас есть более сложное условие, вы можете использовать цепочку обещаний:

browser.wait(function() {
  return element(by.id('some-element')).isPresent().then(function(isPresent) {
    return !isPresent;
  });
}, 1000);

и поток команд будет ждать, повторно называя функцию, переданную в wait, до тех пор, пока обещание, которое оно возвращает, не перейдет в true.

Ответ 2

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

    element(by.id).isPresent().then(function(result) {
            if (result) {
                nextButton.click();
            }
            else{
                browser.wait(function () {
                    return browser.isElementPresent(element(by.id));
                },50000);
            }
        }).then(function () {
            nextButton.click();
        });

    },