2

我正在研究将 TestCafe 用作我的测试自动化框架,并且在使用我的 AUT 上的 Rendr 应用程序执行功能方面遇到了一些障碍。使用 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 之前添加等待不会影响 oucome)

更新 根据评论,t.eval(...)当我访问客户端功能时,不应使用该选项。

4

1 回答 1

3

我认为问题与未定义 App 变量有关。所以你应该等到它可用。您可以使用具有固定等待时间的等待操作或使用以下选择器等待页面上出现元素:

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 });

来自GitHub 评论的 UPD :

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)
于 2019-04-24T14:57:12.407 回答