expect:没有得到实际值

Expect: does not get the actual value

我遇到了一个很奇怪的问题。我每天 运行 在 Jenkins 上进行了一组测试,并且没有任何明显的变化,一些断言(预期)开始失败。这里奇怪的是,只有当我在 Browserstack 上从 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() 块中。现在奇怪的是:

当我执行测试时,第一个断言块的测试通过得很好,第二个它阻止它说断言失败(我做了一些事情来改变值),但是手动/本地我看到一切都是美好的。此外,在执行测试时,我看到值正在发生变化(我什至做了屏幕截图并检查了 browserstack 上的可视日志)。在第三个它阻止我做了其他操作并断言再次失败,但它将它与我在第 2 步而不是第 1 步中预期的值进行比较!所以看起来由于某种原因我落后了一步......如果我评论它阻止或只是在第一个测试中断言,第二个通过正常,但 3 个失败。如果我评论 2 它阻止,第三次通过罚款。

在这个特殊情况下听起来像这样,出于某种原因,一些神奇的事情发生了,而且只发生在 Jenkins 上,而且只发生在 Browserstack 上。顺便说一句,测试已经运行了一段时间没有任何问题,并且在没有任何更新的情况下开始失败。

我虽然出于某种原因我在控制流方面有问题,但我等待另外呈现的元素,我也尝试了 browser.sleep() 反模式来更好地调查它,但它神奇地保持落后一步。

我不是在直接寻找特定的解决方案,但我们将不胜感激任何建议,我不确定我应该提供哪些附加信息,希望我对问题的描述足够多。

@protractor2.1.0 @jasmine2.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');
    });

此 post 暗示其中一个步骤可能被阻止等待完成:http://makandracards.com/makandra/1709-single-step-and-slow-motion-for-cucumber-scenarios-using-javascript-selenium。不确定这是否有帮助。

我通过直接等待文本更改来修复此问题:

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

我确定这里出了点问题,但它对我有用。如果我有空闲时间,我会尝试加强答案并深入调查。