Почему селен возвращает пустое текстовое поле?

Я пытаюсь получить значение элемента "total-price" с этой страницы.

Мой HTML выглядит так:

<div class="data">
<div class="data-first">Ydelse pr. måned</div>
<div class="data-last">
<span class="total-price">[3.551 Kr][1].</span>
</div>
</div>

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

monthlyCost = driver.find_element_by_xpath("//span[@class='total-price']")
print monthlyCost.text

Странно то, что собственность присутствует в webelement.

введите описание изображения здесь

Однако, если я попытаюсь напечатать или присвоить объекту, он окажется пустым. Зачем?

1 ответ

Решение

Когда вы отлаживаете его, вы фактически добавляете паузу и непреднамеренно ждете загрузки страницы.

Кроме того, цена загружается динамически с дополнительным запросом XHR и имеет промежуточное значение "xxx", которое заменяется реальным значением позже в процессе загрузки. Все становится сложнее, так как есть несколько элементов с total-price класс и только один из них становится видимым.

Я подхожу к этому с пользовательским ожидаемым условием:

from selenium.common.exceptions import StaleElementReferenceException
from selenium.webdriver.support import expected_conditions as EC

class wait_for_visible_element_text_to_contain(object):
    def __init__(self, locator, text):
        self.locator = locator
        self.text = text

    def __call__(self, driver):
        try:
            elements = EC._find_elements(driver, self.locator)
            for element in elements:
                if self.text in element.text and element.is_displayed():
                    return element
        except StaleElementReferenceException:
            return False

Рабочий код:

from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://www.leasingcar.dk/privatleasing/Citro%C3%ABn-Berlingo/eHDi-90-Seduction-E6G')

# wait for visible price to have "Kr." text
wait = WebDriverWait(driver, 10)
price = wait.until(wait_for_visible_element_text_to_contain((By.CSS_SELECTOR, "span.total-price"), "Kr."))
print price.text

Печать:

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