Я пишу тестовый пример в 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?
Это цепочка классов? если это так, вы можете просто пропустить класс-нарушитель — часть .ng-tns-c36-13
— если нет других элементов, которые имеют другие классы.
@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">
?
@MrLister Не уверен, что такое цепочка классов. Скрывающий элемент отображается в виде зеленого прямоугольника, сообщающего пользователю, что последнее выполненное действие было успешным. Я предполагаю, что, поскольку существует более одного действия, которое может быть успешным, они присвоили этим элементам разные идентификаторы для каждого успешного действия.
Попробуйте этот 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 Это не сработало. Означает ли «*» все классы?
*= означает все, что имеет определенное значение внутри атрибута, например: [class* = "value"] выбирает все элементы, которые содержат "значение" в своем атрибуте класса, но это странно, я протестировал этот CssSelector здесь, и он сработал.. .
о, это не сработало, потому что stackoverflow сломал строку, из-за чего после фильтра первого класса появился дикий пробел
Вот решение для использования начинается и заканчивается в 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']")));
Это не сработало. Не уверен, почему. Для чего используются ^ и $? (пробовал без них, но не помогло)
^
означает starts with
, а $
означает ends with
. Проверьте мой обновленный ответ.
Обновленное решение сработало! Спасибо! Остался только один вопрос: каков правильный формат при использовании CSSselector? Некоторые говорят, что вы должны использовать точки в начале и между каждым пробелом. Вот так: ".ng-trigger.ng-trigger-state.snack-bar-success.mat-snack-bar-top.ng-star-inserted"
Но в вашем решении вы не использовали точки и оно все равно работало. Так что я немного запутался в этой второстепенной части.
Если вы используете только весь класс, вам нужно использовать подход .
. И если вы хотите использовать часть класса в своем селекторе CSS (как в нашем примере), вам нужно использовать точное значение атрибута, а не повторять пробелы с помощью .
.
Можете ли вы дать нам элемент HTML?