简体   繁体   English

Selenium 无法通过 class 名称定位元素

[英]Selenium is unable to locate elements by class name

I am trying to get a list of the prices from this page .我正在尝试从此页面获取价格列表。

The class name of the elements I'm trying to get is called s-item__price .我要获取的元素的 class 名称称为s-item__price This is my code:这是我的代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

url = 'https://www.ebay.de/sch/i.html?_from=R40&_nkw=iphone+8+&_sacat=0&LH_TitleDesc=0&LH_ItemCondition=3000&rt=nc&LH_Sold=1&LH_Complete=1'

chrome_options = Options()
chrome_options.add_argument('--headless')

browser = webdriver.Chrome(options=chrome_options)

browser.get(url)

print(browser.find_elements_by_class_name('s-item__price'))

browser.quit()

The output is just an empty list. output 只是一个空列表。

You can use WebDriverWait to wait until the javascript generated the element:您可以使用 WebDriverWait 等到 javascript 生成元素:

wait = WebDriverWait(browser, 15) # 15 sec timeout
wait.until(expected_conditions.visibility_of_element_located((By.CLASS_NAME, 's-item__price')))

You could also use presence_of_elements_located but if it comes to click interaction it won't work with hidden elements.您也可以使用presence_of_elements_located但如果涉及点击交互,它将不适用于隐藏元素。 So prefer using: visibility_of_element_located所以更喜欢使用: visibility_of_element_located

Example Code:示例代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions

url = 'https://www.ebay.de/sch/i.html?_from=R40&_nkw=iphone+8+&_sacat=0&LH_TitleDesc=0&LH_ItemCondition=3000&rt=nc&LH_Sold=1&LH_Complete=1'

options = Options()
options.add_argument('--headless')

browser = webdriver.Chrome(options=options)
browser.get(url)

wait = WebDriverWait(browser, 15) # Throws a TimeoutException after 15 seconds
wait.until(expected_conditions.visibility_of_element_located((By.CLASS_NAME, 's-item__price')))
# you may also culd use the return value of the wait

print(browser.find_elements_by_class_name('s-item__price'))
browser.quit()

You get an empty list I think it because you need wait.我认为你得到一个空列表是因为你需要等待。

Use WebDriverWait and utilize .presence_of_all_elements_located to collect elements in a list.使用WebDriverWait并利用.presence_of_all_elements_located收集列表中的元素。

Then extract them with a loop and you must call the .text method to grab the text然后用循环提取它们,你必须调用.text方法来获取文本

browser.get('https://www.ebay.de/sch/i.html?_from=R40&_nkw=iphone%208%20&_sacat=0&LH_TitleDesc=0&LH_ItemCondition=3000&rt=nc&LH_Sold=1&LH_Complete=1')
wait = WebDriverWait(browser, 20)
list_price = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 's-item__price')))
for price in list_price:
    print(price.text)
driver.quit()

Following import:导入后:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM