Я пытаюсь проверить, виден ли элемент с помощью транспортира. Вот как выглядит элемент:
<i class="icon-spinner icon-spin ng-hide" ng-show="saving"></i>
Находясь в консоли Chrome, я могу использовать этот селектор jQuery, чтобы проверить, виден ли элемент:
$('[ng-show=saving].icon-spin')
[
<i class="icon-spinner icon-spin ng-hide" ng-show="saving"></i>
]
> $('[ng-show=saving].icon-spin:visible')
[]
Однако, когда я пытаюсь сделать то же самое в транспортире, я получаю эту ошибку во время выполнения:
InvalidElementStateError:
invalid element state: Failed to execute 'querySelectorAll' on 'Document':
'[ng-show=saving].icon-spin:visible' is not a valid selector.
Почему это неверно? Как проверить видимость с помощью транспортира?
angularjs
visible
protractor
limp_chimp
источник
источник
Ответы:
Это должно сделать это:
Помните, что транспортир -
$
это не jQuery, и:visible
он еще не является частью доступных селекторов CSS + псевдоселекторов.Дополнительная информация на https://stackoverflow.com/a/13388700/511069
источник
isDisplayed()
но просто расширяется, чтобы разрешить обещание полноты, хотя этот шаг является необязательным и предназначен только для включения условных операторов в ваши тесты, что является плохой практикой. @asenovm, не могли бы вы уточнить свой комментарий "Это просто неправильно"?.toBeTruthy();
используйте.toBe(true)
вместо этого..toBeTruthy();
будет соответствовать таким вещам, как [], 'false', 42. В основном все, что ожидает 0, "", null, undefined, NaN или false, является правдой.Правильный способ проверить видимость элемента с помощью Protractor - вызвать
isDisplayed
метод. Вы должны быть осторожны, такisDisplayed
как не возвращает логическое значение, а скорееpromise
предоставляет оцененную видимость. Я видел много примеров кода, которые неправильно используют этот метод и поэтому не оценивают его фактическую видимость.Пример получения видимости элемента:
Однако вам это не нужно, если вы просто проверяете видимость элемента (в отличие от его получения), потому что транспортир исправляет Jasmine expect (), поэтому он всегда ожидает выполнения обещаний. См. Github.com/angular/jasminewd
Итак, вы можете просто сделать:
Поскольку вы используете
AngularJS
для управления видимостью этого элемента, вы также можете проверить его атрибут классаng-hide
следующим образом:источник
У меня была аналогичная проблема, я хотел вернуть только те элементы, которые были видны в объекте страницы. Я обнаружил, что могу использовать CSS
:not
. В случае этой проблемы это должно сделать вас ...В контексте объекта страницы вы можете получить ТОЛЬКО те элементы, которые также видимы таким образом. Например. учитывая страницу с несколькими элементами, где видны только некоторые, вы можете использовать:
Это вернет вам все видимые
i.icon
sисточник
Если в DOM есть несколько элементов с одинаковым именем класса. Но виден только один элемент.
В этом примере фильтр берет набор элементов и возвращает единственный видимый элемент с помощью isDisplayed () .
источник
filteredElement.length === 0
?Этот ответ будет достаточно надежным, чтобы работать для элементов, которых нет на странице, поэтому он будет корректно завершаться ошибкой (без исключения), если селектор не смог найти элемент.
источник
Ждать видимости
Трюк с Xpath для поиска только видимых элементов
источник
источник
Вот несколько фрагментов кода, которые можно использовать для фреймворка, который использует Typescript, транспортир, жасмин.
// Утверждение текста
// Утверждение элемента
// Утверждение формы
источник