Могу ли я использовать локальные переменные в testCafe? - PullRequest
2 голосов
/ 23 апреля 2020

Я заявляю, что использую testCafe в течение одной недели, и мне нужно протестировать одну страницу с разными логинами / профилями.

Когда я запускаю тест только с одним логином (без для l oop), оно работает. но когда я пытаюсь использовать для l oop для изменения имени входа, он говорит, что нет пользовательского текста:

import 'testcafe';
import { Selector, ClientFunction } from 'testcafe';

var user = ['admin','sales.test'];
var pass = ['admin','Test@123'];
var role = ['Admin','Sales'];
var x;

for ( x=0; x < user.length; x++)
{

    fixture('Compass - Main page - Profile: ' + role[x])
        .page('http://localhost:3000/')
        .beforeEach(async t => {

            //login
            await t.typeText(Selector('input').withAttribute('name','username'),  user[x], {
                paste: true,
                replace: true,
            });
            await t.typeText(Selector('input').withAttribute('name','password'), pass[x], {
                paste: true,
                replace: true,
            });
            await t.click(Selector('button').withAttribute('tabindex','0'));
        })
        .afterEach(async t => {
            //logout
                await t.click(Selector('#logoutBtn'));
        });


        test('Check if the Main page is loading (button debug).', async t => {
            await t.expect(
                Selector('#toggleNotifier').exists,
            ).ok();
        });

        test('Check if the Organization page is loading...', async t => {
            await t.click(Selector('a').withAttribute('href','#organizations'));

            await t.expect(
                Selector('a').withAttribute('href','/#/organizations/new').exists,
            ).ok();
        });
}

Команда, которую я использовал: testcafe edge .\roles_spec.ts

результат, который я получил:

PS C:\ThinkOn\Compass_Test\Test1> testcafe edge .\roles_spec.ts
Using locally installed version of TestCafe.
 Running tests in:
 - Microsoft Edge 17.17133 / Windows 10

 Compass - Main page - Profile: Admin
 × Check if the Main page is loading (button debug).

   1) - Error in fixture.beforeEach hook -
      The "text" argument is expected to be a non-empty string, but it was undefined.

      Browser: Microsoft Edge 17.17133 / Windows 10

         12 |    fixture('Compass - Main page - Profile: ' + role[x])
         13 |        .page('http://localhost:3000/')
         14 |        .beforeEach(async t => {
         15 |
         16 |            //login
       > 17 |            await t.typeText(Selector('input').withAttribute('name','username'),  user[x], {
         18 |                paste: true,
         19 |                replace: true,
         20 |            });
         21 |            await t.typeText(Selector('input').withAttribute('name','password'), pass[x], {
         22 |                paste: true,

         at <anonymous> (C:\ThinkOn\Compass_Test\Test1\roles_spec.ts:17:21)
         at <anonymous> (C:\ThinkOn\Compass_Test\Test1\roles_spec.ts:8:71)
         at __awaiter (C:\ThinkOn\Compass_Test\Test1\roles_spec.ts:4:12)
         at fixture.page.beforeEach (C:\ThinkOn\Compass_Test\Test1\roles_spec.ts:14:31)
         at <anonymous> (C:\ThinkOn\Compass_Test\Test1\node_modules\testcafe\src\api\wrap-test-function.js:17:28)
         at TestRun._executeTestFn (C:\ThinkOn\Compass_Test\Test1\node_modules\testcafe\src\test-run\index.js:295:19)
         at TestRun._runBeforeHook (C:\ThinkOn\Compass_Test\Test1\node_modules\testcafe\src\test-run\index.js:316:31)
         at TestRun.start (C:\ThinkOn\Compass_Test\Test1\node_modules\testcafe\src\test-run\index.js:344:24)

1 Ответ

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

Это проблема с областью действия переменной. В вашем коде переменная x объявлена ​​с использованием оператора var и имеет глобальную область видимости. Поскольку каждый хук перед выполнением выполняется асинхронно, он использует значение, которое будет иметь x после завершения цикла for, и выражение user [x] будет неопределенным.

Чтобы избежать этого, используйте оператор let в для блока:

for(let x = 0; x++; x< users.length)

Для получения дополнительной информации, пожалуйста, обратитесь к https://www.typescriptlang.org/docs/handbook/variable-declarations.html#block -scoping

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...