Транспортир не в состоянии обнаружить элемент - PullRequest
0 голосов
/ 31 января 2019

У меня есть компонент, который отображается только после того, как пользователь вошел в систему ...

  <div data-e2e="profile-dd" class="profile-dropdown" [ngClass]="{'white-text': router.url.search('profile') === -1, 'black-text': router.url.search('profile') !== -1}" (click)="showProfile = !showProfile">
    <img data-e2e="profile-img" class="circular-photo" alt="person_dp" [src]="person.profile_photo" />
    <i class="cm" [ngClass]="{'cm-arrow-down': !showProfile, 'cm-arrow-up': showProfile}"></i>
  </div>

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

export class AppPage {
  ...
  ...

  async checkIfUserLoggedIn() {
    return await element(by.css('[data-e2e="profile-dd"]')).isPresent();
  }
}

В моем .e2e-spec.ts файле я написал тест, который не проходит, который регистрирует Expected false to be true.


describe('YOP Login page tests', function () {
    let loginPage: LoginPage;
    let appPage: AppPage;

    beforeEach(() => {
        loginPage = new LoginPage();
        appPage = new AppPage();
    });

    ...
    ...

    it('User should be logged in successfully', () => {
        appPage.checkIfUserLoggedIn().then(res => {
            expect<any>(res).toBe(true);
        });
    });

});

Кто-нибудь может мне помочь, если я ошибаюсь?

PS- Я написал еще один случайный тест чуть ниже.Это работает, это означает, что браузер не падает.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Похоже, вам все еще нужно ждать appPage.checkIfUserLoggedIn().Чтобы это работало, вам нужно установить SELENIUM_PROMISE_MANAGER: false в вашем файле конфигурации Protractor (как показано ниже).В дополнение к этому вы должны быть как минимум на узле 8.

it('User should be logged in successfully', async () => {
    expect(await appPage.checkIfUserLoggedIn()).toBe(true);
});

Почему вам нужно ждать ...

Итак, в вашем методе checkIfUserLoggedIn:

  1. element(by.css('[data-e2e="profile-dd"]')).isPresent() возвращает webdriver.promise.Promise<boolean>.Ожидание этого разрешает это обещание, и вы получаете логическое значение.
  2. Поскольку checkIfUserLoggedIn является асинхронной функцией, теперь она становится встроенной в Promise.Таким образом, ваш возвращаемый тип является собственным Promise<boolean>.
  3. В вашем блоке it вам нужно изменить его на async и await возвращаемые Promise<boolean> в ожидаемом.

Обновление: добавление информации для конфигурации Protractor и tsconfig.

Конфигурация транспортира

Вам потребуется отключить поток управления из файла конфигурации Protractor:

 exports.config = {
   SELENIUM_PROMIMSE_MANAGER: false,  // turns off the control flow
   // Other parts of your config including capabilities, etc.
   // Below is an example of the rest of the configuration file:
   capabilities: { browserName: 'chrome' },
   specs: [ 'e2e/**/*.e2e-spec.ts' ],
   seleniumAddress: 'http://127.0.0.1:4444/wd/hub'
 }

tsconfig.json

Просматривая комментарии и другие части этого вопроса StackOverflow, похоже, что вы используете полифилы для обещаний.Если вы обновитесь до узла 8, вы сможете использовать нативные обещания.Ваш tsconfig может быть просто:

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es2017",
    "types: ["jasmine", "jasminewd2", "node"]
    // Other parts of your tsconfig
  }
}

Примечание: в Protractor 6 поток управления удален, поэтому переход к async / await - хорошая идея для подготовки к следующей версии.Поскольку поток управления удаляется, jasminewd2 также будет удален.Это означает, что типы tsconfig будут просто ["jasmine", "node"].

0 голосов
/ 31 января 2019

Ну, вы видите, isPresent() - получить текущее состояние элемента, что, вероятно, не ваш случай.Вы хотите войти, и тогда должен появиться элемент, но мы не знаем, когда именно.Ваша проблема в том, что транспортир проверил, прежде чем Angular отобразил элемент после входа в систему.Здесь вы должны использовать ExpectedConditions.Вы ищете visibilityOf предложение.

 async checkIfUserLoggedIn() {
    var EC = protractor.ExpectedConditions;
    await browser.wait(EC.visibilityOf(element(by.css('[data-e2e="profile-dd"]'))), 5000, 'Element did not appear after login');
 }

Следующий код будет ждать 5 секунд, пока ваш элемент появится.Это будет разрешено раньше, если элемент появится или не получится с указанным сообщением в течение 5 секунд.

А вот как его использовать

it('User should be logged in successfully', async () => {
    await appPage.checkIfUserLoggedIn();
});
...