Как решать проблемы с e2e-тестами Protractor под PhantomJS

Возникла проблема.
Раньше e2e-тесты нормально отрабатывали в PhantomJS.
И в какой-то момент один из тестов перестал проходить в PhantomJS в 100% случаев.
При этом при запуске на той же машине, к примеру, в Chrome, отрабатывают корректно.
Даже если давать фантому ссылку на уже работающий сервер, который работает без ошибок, то один тест валится — и всё.
Гугление привело к очевидному выводу, что это бага PhantomJS.
Вот тут есть небольшое описание, что делать в случае, если тесты валятся с конкретной ошибкой.

No element found using locator: by.model() error

beforeEach(function() {
	ptor = protractor.getInstance();
	ptor.waitForAngular();
});

http://stackoverflow.com/questions/22949712/no-element-found-using-locator-by-model-error

Protractor times out waiting for sync with page when using $resource

beforeEach(function() {
  ptor = protractor.getInstance();
  ptor.ignoreSynchronization = true;
});

http://stackoverflow.com/questions/19741896/protractor-times-out-waiting-for-sync-with-page-when-using-resource

Protractor: How to wait for page complete after click a button?

browser.waitForAngular();

или

btnLoginEl.click().then(function() {
  // do some stuff 
}); 

Ещё ссылки:
http://stackoverflow.com/questions/21748442/protractor-how-to-wait-for-page-complete-after-click-a-button?lq=1

Ну а для меня более-менее подошло вот такое сочетание:

function setIgnoreSynchronization(val)
{
	browser.ignoreSynchronization = !! val;
	ptor && (ptor.ignoreSynchronization = !! val);
}
...
beforeEach(function() {
	ptor = protractor.getInstance();
	setIgnoreSynchronization(true);

	ptor.waitForAngular();
	browser.driver.manage().window().setSize(1280, 1024);
});
afterEach(function () {
	browser.manage().logs().get('browser').then(function(browserLogs) {
		var msg = '';
		// browserLogs is an array of objects with level and message fields
		browserLogs.forEach(function(log) {
			if (log.level.value > 900) { // it's an error log
				msg += log.message;
			}
		});

		// there can be some errors, so you could turn that off
		if (msg.length) {
			throw new Error('errors in console:\n' + msg);
		}
	});
});
...
// где надо
setIgnoreSynchronization(false);
browser.get('/');

LEAVE A COMMENT