Сообщение об ошибке: невозможно найти элемент. В чем может быть проблема? 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 ')]")

Примечание: вы можете использовать различные логические операторы для фильтрации определенных имен классов (например, 'и' ', а не' и т. Д.)

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