Как я могу утверждать, что элемент сфокусирован?

Я пытаюсь проверить, установлен ли выбранный элемент при загрузке страницы в качестве одного из моих тестов.

Кажется, это работает, и я могу проверить это с помощью проводника элементов, но Jasmine matchers не справляются с этим.

Вот мой код:

var LoginPage = function () {
    this.basePath = browser.params.baseUrl;
    this.loginPart = "/#/login";
    this.usernameInput = element(by.model('username'));

    this.get = function () { ... }
}

it('should focus on the username field on load', function () {
     loginPage.get();
     expect(loginPage.usernameInput).toBe(browser.driver.switchTo().activeElement());
});

Само поле правильно получает фокус при загрузке страницы (и проводник элементов правильно позволяет мне запросить это через browser.driver.switchTo().activeElement(), так что я думаю, что этот тест должен пройти, но это не так.

Вместо этого я получаю огромную трассировку стека, которая не предлагает никакой полезной информации.

3 ответа

Решение

Я думаю, что нашел обходной путь:

поскольку expect ожидает вызова с обещанием, вы можете сравнить некоторые атрибуты двух элементов webElements (ваш ввод и текущий activeElement):

it('should focus on the username field on load', function () {
     loginPage.get();
     expect(loginPage.usernameInput.getAttribute('id')).toEqual(browser.driver.switchTo().activeElement().getAttribute('id'));
});

Мне удалось найти способ сравнить элемент с целевым, не связываясь ни с какими атрибутами:

element(by.css('div.my-class')).equals(browser.driver.switchTo().activeElement())
    .then(equals => expect(equals).toBe(true));

Я закончил тем, что использовал эту милую простую функцию для подтверждения фокуса.

var expectToBeFocused = function(element){
  return expect(element.getInnerHtml()).
    toBe(browser.driver.switchTo().activeElement().getInnerHtml());
};
Другие вопросы по тегам