Сообщение об ошибке: невозможно найти элемент. В чем может быть проблема? Python 3.7, Selenium 3.141.0
При использовании селена для поиска тега элемента с использованием Xpath, он работает с использованием xpath, скопированного из chrome для этого элемента, чтобы проверить, работает ли он. Поскольку элемент id меняется каждый раз, когда я открываю веб-страницу, я знаю, что это приведет к ошибке в моей программе веб-автоматизации, и теперь из того же тега я использую элемент class, поскольку он не меняется каждый раз, когда я открываю веб-страницу, но Selenium не может найти этот элемент вообще. Когда я изменяю элемент в xpath на class с его относительным именем из xpath, я первоначально копировал и тестировал из webbroswer. В чем может быть проблема?
Вот пример исходного кода HTML, к которому я хочу перейти, и Xpath:
<div class="popover fade right in" role="tooltip" id="popover784483" style="top: -9px; left: 328.5px; display: block;">
<div class="arrow" style="top: 88.9423%;"></div>
<h3 class="popover-title">
<font style="vertical-align: inherit;">
<font style="vertical-align: inherit;">Member details</font>
</font>
</h3>
<div class="popover-content">
<img class="center-block" src="http://api.vdarts.net:8080/picture/portrait/default.png" style="max-width:200px;height:auto;">
<hr>
<font style="vertical-align: inherit;">
<font style="vertical-align: inherit;">Account: CapitainJack </font>
Xpath используется изначально, но идентификатор изменяется:
//*[@id="popover784483"]/div[2]/font[1]/font
Xpath для использования:
//*[@class="popover fade right in"]/div[2]/font[1]/font
2 ответа
Есть много способов подойти к этому вопросу.
Вы можете соответствовать частичному текстовому содержимому как Xpath
//*[contains(text(), 'Account')]
Вы можете использовать тег Img и следующий шрифт, как
(//img//following::font)[2]
Я бы порекомендовал вам использовать селекторы CSS вместо этого.
Сложные имена классов - это когда элемент имеет несколько классов, разделенных пробелами. Например <div class="class1 class2 class3"></div>
если вы хотите выбрать элемент со всеми 3 классами (в любом порядке), вы можете использовать:
element = driver.find_element_by_css_selector(".class1.class2.class3")
Если вы хотите использовать XPath, я обнаружил, что работает следующий метод (используя тот же пример, что и выше):
browser.find_elements_by_xpath("//*[contains(concat(' ',@class,' '),' class1 ') and contains(concat(' ',@class,' '),' class2 ') and contains(concat(' ',@class,' '),' class3 ')]")
Примечание: вы можете использовать различные логические операторы для фильтрации определенных имен классов (например, 'и' ', а не' и т. Д.)