我遇到了一个非常奇怪的问题。我有一组测试,我每天在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上的可视化日志)。在第3块它阻止我做了其他动作并且断言再次失败,但它将它与我从第2步预期的值进行比较,而不是第1步!因为某种原因,我看起来落后一步......如果我评论它阻止或只是在第一次测试中断言,第二次传递正常,但是3次失败。如果我评论2阻止,第3次传球罚款。
在这种特殊情况下听起来像是出于某种原因发生了一些魔法并且只在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');
});
答案 0 :(得分:1)
我通过直接等待文本更改来解决此问题:
browser.wait(function() {
return viewBookingDetailsPage.totalCostSection.depositDue.getText().then(function(text) {
return text === '592.00USD';
});
}, 15000);
我确信这里出了问题,但它对我有用。如果我有空闲时间,我会尝试加强答案并深入调查。
答案 1 :(得分:0)
这篇文章提示,其中一个步骤可能会被阻止等待完成:http://makandracards.com/makandra/1709-single-step-and-slow-motion-for-cucumber-scenarios-using-javascript-selenium。不确定这是否有帮助。