Ожидайте: не получает фактического значения

Я столкнулся с очень странной проблемой. У меня был набор тестов, которые я провожу ежедневно на Jenkins, и без каких-либо заметных изменений некоторые утверждения (ожидаемые) начали терпеть неудачу. Странно то, что они терпят неудачу ТОЛЬКО, если я выполняю тесты от Jenkins в Browserstack. Локально все нормально, локально в браузере все нормально, на saucelabs все нормально. У меня есть 3 блока it () с похожими ожиданиями:

value1 = $('.someclass');
value2 = ..
value3 = ..
expect(value1.getText()).toContain('tratata');
expect(value2.getText()).toContain('uhuhuhu');
expect(value3.getText()).toContain('ahahaha');

все они расположены в разных блоках it (). Теперь странная вещь:

Когда я выполняю тесты, тест с 1-м блоком assert проходит нормально, на 2-м блоке он говорит, что assert терпит неудачу (я делаю кое-что, чтобы изменить значения), но вручную / локально я вижу, что все в порядке. Кроме того, пока выполняется тест, я вижу, что значения меняются (я даже делал скриншоты и проверял визуальный журнал в браузере). В 3-м блоке я выполнил другое действие и снова завершился ошибкой assert, НО сравнил его со значением, которое я ожидал с шага 2, а не с шага 1 !! Похоже, что по какой-то причине я на шаг позади ... Если я прокомментирую его блок или просто утверждаю в 1-м тесте, 2-й проходит нормально, а 3 - нет. Если я прокомментирую 2, это блок, 3-й пройдет нормально.

Похоже, что в этом конкретном случае по какой-то причине происходит какое-то волшебство и только на Jenkins и только на Browserstack. Кстати тесты какое-то время работали без проблем и запускались без обновлений.

Я подумал, что по какой-то причине у меня проблемы с потоком управления, Я ЖДУ, чтобы элементы были представлены дополнительно, я пробовал анти-шаблон browser.sleep () также, чтобы лучше его исследовать, но он волшебным образом продолжает отставать.

Я не ищу конкретного решения напрямую, но любые предложения будут приняты с благодарностью, я не уверен, какую дополнительную информацию мне следует предоставить, надеюсь, я достаточно описал проблему.

@ protractor2.1.0 @ жасмин2.3.2

browser.ignoreSynchronization = false



  it('', function () {
        expect(viewBookingDetailsPage.totalCostSection.depositDue.getText()).toContain('542.00');
        expect(viewBookingDetailsPage.totalCostSection.remainingBalance.getText()).toContain('4,878.00');
        expect(viewBookingDetailsPage.totalCostSection.totalDepositAmount.getText()).toContain('5,420.00');
    });


it('', function () {
        $(viewBookingDetailsPage.eventAndItemsSection.addItemsBtn).click();
        helper.waitElementToBeVisisble(viewBookingDetailsPage.addItemsModal.modalOpen);

        viewBookingDetailsPage.addonItemAttribute(0, viewBookingDetailsPage.addItemsModal.events).click();

        helper.waitElementToBeVisisble(viewBookingDetailsPage.addItemsModal.eventSelectionPopup);

        viewBookingDetailsPage.addItemsModal.availableEvents.then(function (events) {
            //Morning event
            events[3].$('i').click();
            viewBookingDetailsPage.addonItemAttribute(0, viewBookingDetailsPage.addItemsModal.selectItem).click();
            viewBookingDetailsPage.addonItemAttribute(1, viewBookingDetailsPage.addItemsModal.selectItem).click();
            viewBookingDetailsPage.addItemsModal.addButton.click();

            helper.waitElementToDisappear(viewBookingDetailsPage.addItemsModal.modalOpen);
            helper.waitElementToBeVisible(viewBookingDetailsPage.addonItemDetail(0, 0, 0, viewBookingDetailsPage.eventAndItemsSection.itemName));

            expect(viewBookingDetailsPage.totalCostSection.depositDue.getText()).toContain('592.00');
            expect(viewBookingDetailsPage.totalCostSection.remainingBalance.getText()).toContain('5,328.00');
            expect(viewBookingDetailsPage.totalCostSection.totalDepositAmount.getText()).toContain('5,920.00');
        });
    });

     it('', function () {

        viewBookingDetailsPage.addonItemDetail(0, 0, 0, viewBookingDetailsPage.eventAndItemsSection.removeItem).click();  ----- method just returns element into multiple internal repeaters

        expect(viewBookingDetailsPage.totalCostSection.depositDue.getText()).toContain('580.00');
        expect(viewBookingDetailsPage.totalCostSection.remainingBalance.getText()).toContain('5,220.00');
        expect(viewBookingDetailsPage.totalCostSection.totalDepositAmount.getText()).toContain('5,800.00');
    });

person Sergey Teplyakov    schedule 31.08.2015    source источник
comment
Вы случайно не используете какие-либо циклы внутри своих тестов или вне блоков it? Кроме того, было бы полезно, если бы вы разместили более подробный пример кода, который не работает.   -  person finspin    schedule 31.08.2015
comment
Я добавил точный код. У меня нет петель или чего-то подобного   -  person Sergey Teplyakov    schedule 31.08.2015


Ответы (2)


Я исправил это, просто ожидая изменения текста:

browser.wait(function() {
    return viewBookingDetailsPage.totalCostSection.depositDue.getText().then(function(text) {
        return text === '592.00USD';
    });
}, 15000);

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

person Sergey Teplyakov    schedule 02.09.2015

Этот пост намекает на тот факт, что один из шагов может быть заблокирован в ожидании завершения: http://makandracards.com/makandra/1709-single-step-and-slow-motion-for-cucumber-scenarios-using-javascript-selenium . Не уверен, что это вообще помогает.

person CJW    schedule 31.08.2015