我面临一个非常奇怪的问题。我有一套每天在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()块中。现在奇怪的是:
当我执行测试时,使用第一个assert块进行的测试就很好了,而在第二个测试块上,它说了assert失败了(我做了一些事情以更改值),但是手动/本地我发现一切都很好。同样在执行测试时,我看到值正在更改(我什至没有截屏并检查浏览器堆栈上的可视日志)。在第三个it块中,我执行了其他操作,然后再次断言失败,但是将其与我从第2步(而不是第1步)获得的值进行比较!因此,由于某种原因,我似乎落后了一步…如果我评论它受阻或只是在第一个测试中主张,第二个就可以通过,但第三个失败。如果我评论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'); });
我通过直接等待文本更改来解决此问题:
browser.wait(function() { return viewBookingDetailsPage.totalCostSection.depositDue.getText().then(function(text) { return text === '592.00USD'; }); }, 15000);
我确定这里有些问题,但是对我有用。如果我有空闲时间,我将尝试增强答案并进行更深入的研究。