Недопустимая проблема выражения xpath в селене - PullRequest
0 голосов
/ 29 октября 2019

У меня есть небольшая проблема, с которой я сталкиваюсь. в настоящее время я использую этот код, чтобы найти элемент:

BasePage.waitInvisabilityOfElementByXpath("//div[@class='ant-notification-notice ant-notification-notice-closable ng-trigger ng-trigger-notificationMotion']");

Все работает, как указано, однако я хочу попробовать использовать содержимое в этом xpath, а не использовать полный путь. Я начинаю с того же самого xpath, используя «Вектор», и получаю ошибку, в то время как делаю это с «Содержит».

BasePage.waitInvisabilityOfElementByXpath("//div[contains(@class, 'ant-notification-notice ant-notification-notice-closable ng-trigger ng-trigger-notificationMotion'])");

Я получаю эту ошибку

SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//div[contains(@class, 'ant-notification-notice ant-notification-notice-closable ng-trigger ng-trigger-notificationMotion'])' is not a valid XPath expression.

что не так с моим синтаксисом

Ответы [ 3 ]

2 голосов
/ 29 октября 2019

похоже, что вы заключаете квадратную скобку вместо скобок

2 голосов
/ 29 октября 2019

В конце ваши ] и ) перепутаны.

//div[contains(@class, 'ant-notification-notice ant-notification-notice-closable ng-trigger ng-trigger-notificationMotion']) ... посмотрите, как вы начинаете с [, но заканчиваете ).

Вместо этого попробуйте:

//div[contains(@class, 'ant-notification-notice ant-notification-notice-closable ng-trigger ng-trigger-notificationMotion')]

0 голосов
/ 29 октября 2019

Как уже упоминали другие, у вас есть закрытие] и) в обратном направлении, но я хотел бы предложить вам использовать селектор CSS. У XPath есть свое место, но в этом нет необходимости. Селекторы CSS имеют несколько преимуществ перед XPath:

  1. Улучшена поддержка селекторов CSS
  2. Поведение в браузерах более согласовано для селекторов CSS
  3. Существует незначительныйпреимущество в производительности при использовании селекторов CSS
  4. При работе с элементами с большим количеством классов (как в вашем случае здесь) проще использовать селектор CSS

Короткая версия:
Вы можете использовать селектор CSS ниже

div.ant-notification-notice.ant-notification-notice-closable.ng-trigger.ng-trigger-notificationMotion

Длинная версия:
Когда вы используете XPath, такой как

//div[@class='ant-notification-notice ant-notification-notice-closable ng-trigger ng-trigger-notificationMotion']

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

XPath можно использовать практически для чего угодно, но, как вы можете видеть,выше есть недостатки. Из-за этого, это рекомендуется многими / большинством докладчиков на конференциях Selenium (например, seleniumconf и SauceCon), включая многих участников Selenium, которые вы используете

  1. ID
  2. CSS селекторы
  3. XPath, только когда это необходимо, и это необходимо только тогда, когда вы находите элемент по содержанию текста или выполняете обход DOM
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...