Могу ли я использовать Testcafe для выполнения функции приложения Rendr? - PullRequest
2 голосов
/ 23 апреля 2019

Я исследую TestCafe для использования в качестве моей инфраструктуры автоматизации тестирования, и я столкнулся с небольшим камнем преткновения в отношении выполнения функции с использованием приложения Rendr на моем AUT.С Cypress.io, Protractor, Puppeteer и т. Д. Я могу выполнить одну и ту же команду ... поэтому я не совсем уверен, где я ошибаюсь с TestCafe.

По сути то, что я пытаюсьВыполнить это: window.App.get('currentUser').set('login_state', 'someLoginState');

Кипарис

  cy.window().then((win) => {
    win.App.get('currentUser').set('login_state', 'someState');
  });

Транспортир

  function changeUserState() {
    App.get('currentUser').set('login_state', 'someState');
  }

  browser.executeScript(changeUserState);

Кукольник

  function changeUserState() {
    window.App.get('currentUser').set('login_state', 'someState');
  }

  await page.evaluate(changeUserState);

Для TestCafe я пытался использовать:

const changeUserState = ClientFunction((desiredState) => {
    return App.get('currentUser').set('login_state', desiredState);
});

fixture `User states`
    .page(url)
    .afterEach( async t => {
        await t
            logout();
    });

test('Change a users log in state', async t => {

    await loginForm.loginViaUrl(userEmail, userPassword);
    await changeUserState('SomeState');
    await checkUserState('SomeState');  // Just an example of what I would do next
}

При запуске это выдает ошибку ReferenceError: App is not defined.

(Я также попытался использовать вышеуказанные опции, используя 'window.App.get ...': TypeError: Cannot read property 'get' of undefined - Добавление ожидания перед вызовом ClientFunction не влияет на результат)

ОБНОВЛЕНИЕ Исходя из комментариев, опция t.eval(...) не должна использоваться, поскольку я получаю доступ к функциональности на стороне клиента.

1 Ответ

3 голосов
/ 24 апреля 2019

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

await Selector('element that tells us that App exists')

UPD: Изучив предоставленный вами тестовый примерв вашей проблеме Github мы нашли решение для вас.Необходимо дождаться появления переменной App.Добавьте следующий код перед вызовом функции changeUserState:

// first case
const getPageUrl = ClientFunction(() => location.toString());

await t.expect(getPageUrl()).eql('https://www.change.org/', { timeout: 5000 });
// second case
const isAppExists = ClientFunction(() => !!window.App);

await t.expect(isAppExists()).ok({ timeout: 5000 });

UPD из комментария GitHub :

import { Selector, ClientFunction } from 'testcafe';

fixture`Change User State`.page('www.change.org');

const isAppExists = ClientFunction(() => !!window.App);

const changeUserState = ClientFunction((desiredState) => {
    const initialState = App.get('currentUser').get('login_state');
    App.get('currentUser').set('login_state', desiredState);
    const currentState = App.get('currentUser').get('login_state');
    return { initialState, currentState };
});

test
    ('Start from homepage', async t => {
        await t
            .maximizeWindow()
            .navigateTo('/login_or_join')
            .typeText(Selector('#content input[type="email"]'), '*****')
            .typeText(Selector('#content input[type="password"]'), '*****')
            .click(Selector('#content input[type="submit"]'))
            .expect(isAppExists()).ok(); // wait for App

        console.log(await changeUserState('guest'));
});

Результат:

Running tests in:
- Chrome 74.0.3729 / Windows 10.0.0

Change User State
{ initialState: 'authenticated', currentState: 'guest' }
 √ Start from homepage


 1 passed (15s)
...