Не удалось получить текст элементов. Я хочу использовать Dynami c Xpath здесь, чтобы получить текст элементов заголовка - PullRequest
0 голосов
/ 03 марта 2020

Вот это HTML. Я хочу использовать динамический c xpath здесь, чтобы получить текст элементов заголовка.

<div class="w3-bar w3-theme w3-card-2 w3-wide notranslate">
<a class="w3-bar-item w3-button w3-hover-white w3-padding-16 hidesm" onclick="w3_open()" href="javascript:void(0)">
<a id="navbtn_tutorials" class="w3-bar-item w3-button barex w3-hover-white w3-padding-16" onclick="w3_open_nav('tutorials')" href="javascript:void(0)">
TUTORIALS
<i class="fa fa-caret-down"></i>
<i class="fa fa-caret-up" style="display:none"></i>
</a>
hElements = "//div[@class='w3-bar w3-theme w3-card-2 w3-wide notranslate']//a" 
#is my xpath fetches all the header elements
hElementsSize = len(browser.driver.find_elements_by_xpath(hElements)) 
#fetches the size of the header elements
print("Total Header Elements:", hElementsSize)
hElementsText = browser.driver.find_element_by_xpath(hElements).text
print(hElementsText) 
#i'm not able to get the text of the header elements

Ответы [ 3 ]

0 голосов
/ 03 марта 2020

Если вы хотите вернуть их все, предполагая, что ваш xpath правильный, вам нужно будет использовать find_element s _by_xpath. Затем он возвращает список всех найденных элементов.

hElementsText = browser.driver.find_elements_by_xpath(hElements)
for el in hElementsText:
    print(el.text)
0 голосов
/ 04 марта 2020

Требуется элемент с поддержкой JavaScript, поэтому для извлечения текста из элемента вам нужно вызвать WebDriverWait для visibility_of_element_located(), и вы можете использовать любой из следующие Стратегии локатора :

  • Использование CSS_SELECTOR и get_attribute() Метод:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.w3-bar.w3-theme.w3-card-2.w3-wide.notranslate a#navbtn_tutorials"))).get_attribute("innerHTML"))
    
  • Использование XPATH и текст атрибут:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='w3-bar w3-theme w3-card-2 w3-wide notranslate']//a[@id='navbtn_tutorials']"))).text)
    
  • Примечание : необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
0 голосов
/ 03 марта 2020

То, как вы ожидаете текст, используя browser.driver.find_element_by_xpath, вернет текст первого элемента, который является пустым, как я вижу в HTML, которым вы поделились. findElement находит первый элемент в DOM в случае наличия нескольких элементов.

Необходимо использовать find_elements и l oop через, чтобы проверить ожидаемый один

hElements = "//div[@class='w3-bar w3-theme w3-card-2 w3-wide notranslate']//a"
listOfElement = driver.find_elements_by_xpath(hElements)
print("Total Header Elements:", len(listOfElement))

for element in listOfElement:
    print(element.text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...