Разница между содержит и равна в XPath - селен - PullRequest
0 голосов
/ 30 октября 2019

Привет всем Я задал вопрос относительно локатора xpath в селене. У меня есть тест, который, если я использую следующий код:

locator = By.xpath("//div[@class='ant-notification-notice ant-notification-notice-closable ng-trigger ng-trigger-notificationMotion']");`

все работает, так как я использую "class ="

Однако, если я изменяю его и использую, содержит:

locator = By.xpath("//div[contains(@class, 'ant-notification-notice ant-notification-notice-closable ng-trigger ng-trigger-notificationMotion')]");

Я получаю

ERROR: no such element: Unable to locate element: {"method":"xpath","selector":"//div[contains(@class, 'ant-notification-notice ant-notification-notice-closable ng-trigger ng-trigger-notificationMotion')]"}

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

1 Ответ

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

xpath as:

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

проверяет @class значения атрибута лексически для строки:

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

Где как xpath as:

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

проверяет подстроку ant-notification-notice ant-notification-notice-closable ng-trigger ng-trigger-notificationMotion в пределах значения атрибута @class.

Я считаю, что было бы лучше ограничитьатрибуты @class выглядят следующим образом:

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

Соответствующее обсуждение можно найти в Почему google-chrome-devtools определяет меньшее количество элементов через XPathзатем число элементов, идентифицированных через CssSelector

...