Выполнить функцию в зависимости от того, какой асинхронный вызов возвращается первым - PullRequest
0 голосов
/ 23 апреля 2019

При выполнении 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.

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

В итоге я решил ее по-другому, используя селектор множественных запросов, который ожидает первый экземпляр того или иного класса CSS.Поэтому здесь я жду, когда сначала появится кнопка входа или выхода из системы, а затем действую в зависимости от класса появившегося элемента:

    const profileIconOrSignInButtonLocator = By.css('.frontpage-menu-item-icon-profile, .frontpage-menu-item-icon-signin');
    await browser.wait(Until.elementIsVisible(profileIconOrSignInButtonLocator));
    const loginOrLogoutButton = await browser.findElement(profileIconOrSignInButtonLocator);
    var elementClass = await loginOrLogoutButton.getAttribute('class');

    if (elementClass === 'frontpage-menu-item-icon frontpage-menu-item-icon-signin') {
        console.log("Simply log in");
        await loginFrontPage(browser);
    } else { // If this happens we're already logged in, and need to log out first.
        console.log("Log out and then log in");
        await logoutFrontPage(browser);
        await loginFrontPage(browser);
    }
0 голосов
/ 23 апреля 2019

Возможно, я пытаюсь упростить проблему, но мне кажется, что вы могли бы использовать подобный шаблон, условно воздействуя на результат каждой асинхронной функции, только если другая асинхронная функция еще не разрешена:

// Set flags
let firstPromiseResolved = false;
let secondPromiseResolved = false;    

// Start asynchronous functions
firstPromise(resolve, reject).then(function(firstResult){
  if(secondPromiseResolved === false){
    // Maybe we want to use firstResult for some purpose here?
    firstPromiseResolved = true; // Set flag so the other function won't log us out
    login(); // Do the thing
  }
}
secondPromise(resolve, reject).then(function(secondResult){
  if(firstPromiseResolved === false){
    // Maybe we want to use secondResult for some purpose here?
    secondPromiseResolved = true; // Set flag so the other function won't log us in
    logoutAndlogin(); // Do the other thing
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...