Идентификатор изменения имени скрывающего элемента

Я пишу тестовый пример в Selenium, используя Visual Studio.

В нескольких тесткейсах мне нужно дождаться исчезновения временного затеняющего элемента. Проблема в том, что имя этого элемента меняет свой "идентификатор числа".

Это имя затемняющего элемента:

.mat-snack-bar-container.ng-tns-c36-13.ng-trigger.ng-trigger-state.snack-bar-success.mat-snack-bar-top.ng-star-inserted

Часть, которая всегда меняется, это часть: 36-13

Я жду, когда это исчезнет, ​​вот так:

wait.Until(ExpectedConditions.InvisibilityOfElementLocated(By.CssSelector(".mat-snack-bar-container.ng-tns-c36-13.ng-trigger.ng-trigger-state.snack-bar-success.mat-snack-bar-top.ng-star-inserted")));

Вместо того, чтобы писать 9999 строк кода для покрытия каждого идентификатора этого элемента. Есть ли способ просто написать одну строку кода, которая ищет этот идентификатор в диапазоне от 00-00 до 99-99?

Можете ли вы дать нам элемент HTML?

Valga 28.05.2019 14:51

Это цепочка классов? если это так, вы можете просто пропустить класс-нарушитель — часть .ng-tns-c36-13 — если нет других элементов, которые имеют другие классы.

Mr Lister 28.05.2019 15:00

@Valga Это то, что вы ищете: <snack-bar-container class = "mat-snack-bar-container ng-tns-c72-68 ng-trigger ng-trigger-state snack-bar-success mat-snack-bar-top ng-star-inserted"> ?

David 28.05.2019 15:04

@MrLister Не уверен, что такое цепочка классов. Скрывающий элемент отображается в виде зеленого прямоугольника, сообщающего пользователю, что последнее выполненное действие было успешным. Я предполагаю, что, поскольку существует более одного действия, которое может быть успешным, они присвоили этим элементам разные идентификаторы для каждого успешного действия.

David 28.05.2019 15:08

Попробуйте этот CssSelector: "snack-bar-container[class*='mat-snack-bar-container ng-tns-c][class*=' ng-trigger ng-trigger-state snack-bar-success mat-snack-bar-top ng-star-inserted']"

Valga 28.05.2019 16:20

@Valga Это не сработало. Означает ли «*» все классы?

David 28.05.2019 17:00

*= означает все, что имеет определенное значение внутри атрибута, например: [class* = "value"] выбирает все элементы, которые содержат "значение" в своем атрибуте класса, но это странно, я протестировал этот CssSelector здесь, и он сработал.. .

Valga 28.05.2019 20:40

о, это не сработало, потому что stackoverflow сломал строку, из-за чего после фильтра первого класса появился дикий пробел

Valga 28.05.2019 20:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот решение для использования начинается и заканчивается в css.

[class^='mat-snack-bar-container ng-tns-c'][class$='ng-trigger ng-trigger-state snack-bar-success mat-snack-bar-top ng-star-inserted']

Код ниже будет ждать, пока элемент не станет невидимым.

wait.Until(ExpectedConditions.InvisibilityOfElementLocated(By.CssSelector("[class^='mat-snack-bar-container ng-tns-c'][class$='ng-trigger ng-trigger-state snack-bar-success mat-snack-bar-top ng-star-inserted']")));

Это не сработало. Не уверен, почему. Для чего используются ^ и $? (пробовал без них, но не помогло)

David 28.05.2019 15:46
^ означает starts with, а $ означает ends with. Проверьте мой обновленный ответ.
supputuri 28.05.2019 16:32

Обновленное решение сработало! Спасибо! Остался только один вопрос: каков правильный формат при использовании CSSselector? Некоторые говорят, что вы должны использовать точки в начале и между каждым пробелом. Вот так: ".ng-trigger.ng-trigger-state.snack-bar-success.mat-snack-ba‌​r-top.ng-star-insert‌​ed" Но в вашем решении вы не использовали точки и оно все равно работало. Так что я немного запутался в этой второстепенной части.

David 28.05.2019 16:52

Если вы используете только весь класс, вам нужно использовать подход .. И если вы хотите использовать часть класса в своем селекторе CSS (как в нашем примере), вам нужно использовать точное значение атрибута, а не повторять пробелы с помощью ..

supputuri 28.05.2019 17:47

Другие вопросы по теме