При выполнении UI-теста для потока входа в систему пользователь может уже войти в систему. В случае, если пользователь вошел в систему, сначала необходимо выполнить выход из системы.
В этом случае мне нужно дождаться появления кнопки входа или выхода, но я не знаю, какая из них появится. Я хотел бы просто подождать, пока один или другой не появится, а затем выполнить действие, основанное на том, который возвращается первым.
Я просто добавил тихий сбой при попытке выйти из системы. Если время ожидания истекло, сценарий просто продолжает идти в журнал частично.
Попытка выхода из системы и ее сбой в случае тайм-аута:
try {
const profileIconLocator = By.css('.frontpage-menu-item-icon-profile');
await browser.wait(Until.elementIsVisible(profileIconLocator));
const profileIcon = await browser.findElement(profileIconLocator);
assert.ok(await profileIcon.isDisplayed(), 'Ordbog profile icon button is visible');
await profileIcon.click();
const logOutLinkLocator = By.css('.frontpage-menu-dropdown-tools-item:nth-child(3)');
await browser.wait(Until.elementIsVisible(logOutLinkLocator));
const logOutLink = await browser.findElement(logOutLinkLocator);
assert.ok(await logOutLink.isDisplayed(), 'Log out link is visible');
await logOutLink.click();
} catch (error) {
console.log("LogOutStep: Failed to log out before logging in", error);
}
Затем попытайтесь войти, предполагая, что тестовый пользователь вышел из системы:
let signInButtonLocator = By.css('.frontpage-menu-item-icon-signin');
await browser.wait(Until.elementIsVisible(signInButtonLocator));
const signInButton = await browser.findElement(signInButtonLocator);
assert.ok(await signInButton.isDisplayed(), 'Sign in button is visible');
await signInButton.click();
Я ожидаю, что пользователь всегда будет выходить из системы перед входом в систему, но для UI-теста не обязательно ждать тайм-аута при первой попытке выхода из системы для каждого тестового пользователя.
Идеальным результатом было бы то, что я могу дождаться возврата любого из двух асинхронных вызовов, отменить другой при возврате и затем выполнить такую функцию:
// Wait for this to execute first(log out button)
const profileIconLocator = By.css('.frontpage-menu-item-icon-profile');
await browser.wait(Until.elementIsVisible(profileIconLocator));
// or this (sign in button)
let signInButtonLocator = By.css('.frontpage-menu-item-icon-signin');
await browser.wait(Until.elementIsVisible(signInButtonLocator));
// If sign in button shows first, run login
// If sign out button shows first, perform log out, then login again.