Как я могу найти элемент, перебирающий список div с помощью Selenium? - PullRequest
1 голос
/ 08 мая 2020

В файле HTML, структурированном следующим образом:

<div class="card">
    <div class="id">
        ID: 123456
    </div>
    <div class="title">
        Title 1
    </div>
    <div class="description">
        Description 1
    </div>
</div>

<div class="card">
    <div class="id">
        ID: 89123
    </div>
    <div class="title">
        Title 2
    </div>
</div>

Допустим, у меня есть переменное количество div с классом «card», используя Selenium, я хотел бы l oop через эти divs и если есть div с описанием класса, я хотел бы распечатать его текст. Я попытался сделать что-то вроде кода ниже, но используя find_element_by_xpath. Я всегда получаю первый элемент с классом description. Как я могу исправить это и правильно получить элементы, перебирая div? Большое спасибо.

cards = webdriver.find_elements_by_xpath("//div[@class='main-div']")

for card in cards:
    try:
        description = card.find_element_by_xpath("//div[@class='description']")
        print(description.text)
    except:
        print("No description")

Ответы [ 3 ]

1 голос
/ 08 мая 2020

Просто используйте . для intermediate дочернего тега. Так должно быть

card.find_element_by_xpath(".//div[@class='description']")

Код здесь:

cards = webdriver.find_elements_by_xpath("//div[@class='card']")

for card in cards:
    try:
        description = card.find_element_by_xpath(".//div[@class='description']")
        print(description.text)
    except:
        print("No description")
1 голос
/ 09 мая 2020

Вы можете сделать это с одним локатором и одним l oop.

for description in driver.find_elements_by_css_selector("div.card > div.description"):
    print(description.text)

ПРИМЕЧАНИЕ. Если вы хотите исправить текущий код, вам просто не хватает оси self . в ваш второй XPath. Измените "//div[@class='description']" на ".//div[@class='description']", чтобы указать, что вы хотите начать поиск с текущего элемента card.

Для получения дополнительной информации об оси self см. mdn , который имеет много отличной информации, связанной с XPath и CSS селектором.

1 голос
/ 08 мая 2020

Вам нужно получить все div с классом «card» и выполнить поиск в div «description» внутри них:

cards = webdriver.find_elements_by_css_selector(".card")

for card in cards:

    try:

        description = card.find_element_by_css_selector(".description")
        print(description.text)

    except:

        print("No description.")

PS: Или измените свой первый XPath на //div[@class='card'], а второй XPath на .//div[@class='description'] как предложили ребята из других ответов.

Надеюсь, это вам поможет!

...