Мой тест транспортира зависает при попытке определить, присутствует ли элемент - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть тест на транспортир, который делает самые простые мыслимые вещи.Он входит в веб-приложение.Кажется, что все идет хорошо, пока я не попытаюсь оценить, был ли вход успешным или нет, ища наличие элемента на следующей странице.Я уверен, что это проблема синхронизации, но не могу понять, как ее исправить.

Что следует отметить:

  • Я довольно новичок в JavaScript (хотя и нек кодированию), поэтому предложения по улучшению кода приветствуются.
  • Функция входа в систему работает как чудо, включая ожидание.
  • Асинхронизация / Обещания / Ожидания все еще немного ломают мне голову.

Метод входа в систему

this.login = async function (repo, username, password, domain) {
    if (repo == null){ repo = REPO_UNDER_TEST; }

    browser.driver.manage().window().maximize();

    await this.openLoginPage(domain).
        then( this.selectRepo(repo) ).
        then( this.usernameTextBox.sendKeys(username) ).
        then( this.passwordTextBox.sendKeys(password) ).
        then( this.signInButton.click() ).
        then( async function() {
            console.log(`I'm starting my WAIT at ${Date().toString()}`);
            await browser.wait(
                EC.titleIs(repo), 
                32000
            );
        } )
};

Тестовый код

describe('Login Tests', function () {
it('should log you in given a good username/password', async function () {
    console.log(`I'm starting my TEST at ${Date().toString()}`);
    await loginPage.login(null, 'edwin', 'e', null);
    console.log(`I'm starting my EVAL at ${Date().toString()}`);

    var searchBox = element.all(by.model('searchQuery'));        
    expect(searchBox.isPresent()).toBe(true);
    expect(true).toBeTruthy();

    });  
});

Консольные журналы просто естьчтобы убедиться, что все происходит в правильном порядке.Если я закомментирую строку, в которой я ожидаю присутствия searchBox, тест выполняется до конца и правильно вычисляет простое ожидание (true) .toBeTruthy ().Если я пытаюсь запустить ожидание для searchBox, тест просто зависает, пока я не выключу его вручную.Затем консоль скажет мне, что ожидание не удалось, потому что элемент не существует, даже если он ясно виден на экране до console.log о том, что eval запускается.

Вывод журнала

[10:22:42] I/hosted - Using the selenium server at http://localhost:4444/wd/hub

Started

I'm starting my TEST at Wed Feb 27 2019 10:22:45 GMT-0800 (Pacific Standard Time)

I'm starting my WAIT at Wed Feb 27 2019 10:22:46 GMT-0800 (Pacific Standard Time)

I'm starting my EVAL at Wed Feb 27 2019 10:23:06 GMT-0800 (Pacific Standard Time)

F

Failures:

1) Login Tests should log you in given a good username/password

  Message:
    Expected false to be true.

  Stack:
    Error: Failed expectation
        at UserContext.<anonymous> 

(C:\GIT\TestFramework_POCs\protract\TESTS\login-spec.js:15:39)
        at process._tickCallback (internal/process/next_tick.js:68:7)


1 spec, 1 failure

Finished in 37.295 seconds


[10:23:22] I/launcher - 0 instance(s) of WebDriver still running

[10:23:22] I/launcher - chrome #01 failed 1 test(s)

[10:23:22] I/launcher - overall: 1 failed spec(s)

[10:23:22] E/launcher - Process exited with error code 1

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Две проблемы в вашем следующем коде:

1) element.all() не имеет isPresent()

2) вы пропустили await в следующем коде

var searchBox = element.all(by.model('searchQuery'));        
expect(await searchBox.get(0).isPresent()).toBe(true);

// or 
var searchBox = element(by.model('searchQuery'));        
expect(await searchBox.isPresent()).toBe(true);

Пожалуйста, подтвердите, как найти окно поиска

0 голосов
/ 28 февраля 2019

Как вы подозреваете, это, скорее всего, результат асинхронных проблем.Несмотря на то, что ваша функция входа в систему работает нормально, я бы лично написал ее, используя все await вместо .then(), например

this.login = async function (repo, username, password, domain) {
if (repo == null){ repo = REPO_UNDER_TEST; }

  await browser.driver.manage().window().maximize();

  await this.openLoginPage(domain);
  await this.selectRepo(repo);
  await this.usernameTextBox.sendKeys(username);
  await this.passwordTextBox.sendKeys(password);
  await this.signInButton.click();
  console.log(`I'm starting my WAIT at ${Date().toString()}`);
  await browser.wait(EC.titleIs(repo), 32000);
};

Хотя .then () работает, я считаю, что это намного лучше / прощеиспользуйте await везде.await ждет завершения следующего действия, прежде чем перейти к следующей строке кода, что аналогично множеству .then(), но вы избегаете назойливых функций рождественской елки, которые могут стать кратными .then().

Я не вижу ничего плохого в самом тесте, хотя проверка isPresent() на element.all потенциально может вызвать проблемы, и я думаю, что проблема в этом.element и element.all не будут обрабатывать ни одного элемента, находящегося там.Например:

element.all(by.css('NothingHere'); // will return array with length of 0
element(by.css('NothingHere'); //will return an ElementFinder object

По сути, 0 является допустимым ответом, в то время как пустой ElementFinder выдаст ошибку, поэтому, если ваша первая проверка включена element.all(), если что-то еще не загружено, оно с радостью вернет 0. Однакоelement() увидит, что ничего еще нет, и подождет, пока элемент станет видимым, пока не истечет время ожидания. Если бы вы могли найти уникальный элемент внутри element.all(by.model('searchQuery')); и нацелить его вместо этого, я ожидаю, что он пройдет.

Также при использовании async / await вам нужно иметь SELENIUM_PROMISE_MANAGER = false; внутри вашего файла конфигурации

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