即使明显存在具有指定类名的元素,以下代码也始终返回空列表:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
# instantiate options
options = webdriver.ChromeOptions()
# run browser in headless mode
options.headless = True
# instantiate driver
driver = webdriver.Chrome(service=ChromeService(
ChromeDriverManager().install()), options=options)
# load website
url = 'https://maclear.ch/en/projects'
# get the entire website content
driver.get(url)
# select elements by class name
elements = driver.find_elements(By.CLASS_NAME, 'project-info__elem')
print(elements)
我希望得到指定的元素
看起来网站正在动态加载内容(使用JS),Selenium找不到元素,因为它不等待页面加载并立即开始执行指令。
此代码等待该元素加载,然后返回它。
from selenium.webdriver.support.wait import WebDriverWait
WAIT_LIMIT = 20 // seconds
elements = WebDriverWait(driver, WAIT_LIMIT ).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, ".project-info__elem"))
)
这似乎是您试图在加载元素之前获取元素列表的情况,所以自然您会得到一个空列表。
尝试在获取 url 后添加
driver.implicitly_wait(10)
,您应该会获得一些元素。
当然,您应该研究其他更优雅的方法来等待页面加载,然后再获取元素。在所有情况下 10 秒可能都不够,而且在其他情况下可能会过长。