2015-08-02 18 views
5

Sto cercando di ottenere il valore dell'elemento "prezzo totale" da this page.Perché il selenio restituisce un campo di testo vuoto?

mio html si presenta così:

<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> 

Il mio codice è il seguente:

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

La cosa strana è la proprietà è presente nel webelement.

enter image description here

Tuttavia, se provo e stamparlo o assegnarlo a un oggetto viene fuori vuoto. Perché?

risposta

6

Quando esegui il debug, in realtà stai aggiungendo una pausa e attendi involontariamente che la pagina venga caricata.

Inoltre, il prezzo viene caricato dinamicamente con una richiesta XHR aggiuntiva e ha un valore intermedio "xxx" che viene sostituito con un valore reale in un secondo momento nel processo di caricamento. Le cose si complicano da quando ci sono più elementi con la classe total-price e solo uno di questi diventa visibile.

avrei avvicino con un custom Expected Condition:

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 

Il codice di lavoro:

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 

Stampe:

3.551 Kr. 
+0

@alexce - Grazie! – Frank