Подтвердить что ты не робот

Selenium Webdriver находит элемент в подэлементе

Я пытаюсь найти элемент в подэлементе с Selenium (версия 2.28.0), но selenium, похоже, не ограничивает его поиск подэлементом. Я делаю это неправильно или есть способ использовать element.find для поиска подэлемента?

В качестве примера я создал простую тестовую веб-страницу с этим кодом:

<!DOCTYPE html>
<html>
    <body>
        <div class=div title=div1>
            <h1>My First Heading</h1>
            <p class='test'>My first paragraph.</p>
        </div>
        <div class=div title=div2>
            <h1>My Second Heading</h1>
            <p class='test'>My second paragraph.</p>
        </div>
        <div class=div title=div3>
            <h1>My Third Heading</h1>
            <p class='test'>My third paragraph.</p>
        </div>
    </body>
</html>

Мой код python (версия 2.6) выглядит следующим образом:

from selenium import webdriver

driver = webdriver.Firefox()

# Open the test page with this instance of Firefox

# element2 gets the second division as a web element
element2 = driver.find_element_by_xpath("//div[@title='div2']")

# Search second division for a paragraph with a class of 'test' and print the content
print element2.find_element_by_xpath("//p[@class='test']").text 
# expected output: "My second paragraph."
# actual output: "My first paragraph."

Если я запустил:

print element2.get_attribute('innerHTML')

Он возвращает html из второго деления. Таким образом, селен не ограничивает свой поиск элементом2.

Я хотел бы найти подэлемент element2. Это сообщение предполагает, что мой код должен работать Selenium WebDriver для доступа к вспомогательному элементу, но его проблема была вызвана проблемой тайм-аута.

Может кто-нибудь помочь мне понять, что здесь происходит?

4b9b3361

Ответ 1

Когда вы запускаете выражение XPath с помощью //, он выполняет поиск из корня документа, игнорируя ваш родительский элемент. Вы должны добавить выражение с помощью .

element2 = driver.find_element_by_xpath("//div[@title='div2']")
element2.find_element_by_xpath(".//p[@class='test']").text 

Ответ 2

Используйте следующее:

element2 = driver.find_element_by_cssselector("css=div[title='div2']")
element2.find_element_by_cssselector("p[@class='test']").text 

Пожалуйста, дайте мне знать, если у вас возникнут проблемы.

Ответ 3

Вот как вы ищете элемент или тег в подклассе, и я считаю, что это работает и для многоуровневой ситуации:

Образец HTML:

<li class="meta-item">
 <span class="label">Posted:</span>
 <time class="value" datetime="2019-03-22T09:46:24+01:00" pubdate="pubdate">22.03.2019 u 09:46</time>
</li>