Сообщение об ошибке: невозможно найти элемент.В чем может быть проблема?Python 3.7, Selenium 3.141.0 - PullRequest
0 голосов
/ 14 февраля 2019

При использовании селена для поиска тега элемента с использованием 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 ]

0 голосов
/ 14 февраля 2019

Существует множество способов решения этой проблемы.

Вы можете сопоставить частичное текстовое содержимое Xpath, например,

//*[contains(text(), 'Account')]

. Вы можете использовать тег Img и следующий шрифт, например,

(//img//following::font)[2]
0 голосов
/ 14 февраля 2019

Я бы порекомендовал вместо этого использовать 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 ')]")

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

...