我遇到了非常奇怪的问题。我每天在 Jenkins 上运行一组测试,并且没有任何明显的变化,一些断言(预期)开始失败。这里奇怪的是,只有当我在 Browserstack 上执行来自 Jenkins 的测试时,它们才会失败。在本地一切都很好,在本地浏览器堆栈上一切都很好,在 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 步!所以看起来由于某种原因我落后了一步......如果我评论它阻止或只是在第一次测试中断言,第二次通过正常,但第三次失败。如果我评论 2 它会阻止,第三次通过就好了。
出于某种原因,在这种特殊情况下听起来像这样,一些魔法发生了,而且只在 Jenkins 和 Browserstack 上。顺便说一句,测试已经工作了一段时间没有任何问题,并且开始失败而没有任何更新。
我虽然出于某种原因我在控制流方面遇到了问题,但我还在等待要呈现的元素,我尝试了 browser.sleep() 反模式来更好地调查它,但它神奇地一直落后。
我不是直接寻找特定的解决方案,但任何建议都将受到高度赞赏,我不确定我应该提供哪些附加信息,希望我能充分描述问题。
@量角器2.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');
});