Cómo resolver TypeError: el objeto de tipo ‘WebElement’ no tiene len () en Python Selenium

Quiero imprimir todos los elementos similares pero sigo recibiendo un error (estoy usando Pycharm ).

Error:

TypeError: object of type 'WebElement' has no len() 

Esta línea es la que lanza el error: num_page_items = len(productname)

Código completo de selenium:

 from selenium import webdriver driver = webdriver.Chrome('/Users/reezalaq/PycharmProjects/untitled2/venv/driver/chromedriver') driver.get("https://www.blibli.com/jual/batik-pria?s=batik+pria") productname = driver.find_element_by_xpath("//div[@class='product-title']") oldprice = driver.find_element_by_css_selector("span.old-price-text").text discount = driver.find_element_by_css_selector("div.discount > span").text saleprice = driver.find_element_by_css_selector("span.new-price-text").text num_page_items = len(productname) for i in range(num_page_items): print(productname[i].text + " : " + oldprice[i].text + " : " + discount[i].text + " : " + saleprice[i].text) driver.close() 

El error lo dice todo:

 num_page_items = len(productname) TypeError: object of type 'WebElement' has no len() 

productname tiene asignado el tipo de retorno de driver.find_element_by_xpath("//div[@class='product-title']") , que es un WebElement y WebElement no tiene ningún método como len() . len() puede invocarse en una List .

Solución

Mientras intenta acceder a los elementos de la List como en:

 print(productname[i].text + " : " + oldprice[i].text + " : " + discount[i].text + " : " + saleprice[i].text) 

Por lo tanto , el nombre del producto , el precio anterior , el descuento y el precio de sal deben ser del tipo List .

Pero tu código se lee como:

 productname = driver.find_element_by_xpath("//div[@class='product-title']") oldprice = driver.find_element_by_css_selector("span.old-price-text").text discount = driver.find_element_by_css_selector("div.discount > span").text saleprice = driver.find_element_by_css_selector("span.new-price-text").text 

Donde productname es WebElement y oldprice , discount y saleprice son texto . Por lo tanto, debe cambiarlos como una List de elementos web de la siguiente manera:

 productname = driver.find_elements_by_xpath("//div[@class='product-title']") oldprice = driver.find_elements_by_css_selector("span.old-price-text") discount = driver.find_elements_by_css_selector("div.discount > span") saleprice = driver.find_elements_by_css_selector("span.new-price-text") 

Está utilizando find_element_by_xpath que encuentra y devuelve el primer WebElement coincide con el selector. find_elements_by_xpath utilizar find_elements_by_xpath que devuelve todos los elementos coincidentes