即使元素确实存在,我仍然在 selenium 中收到 NoSuchElementException

I keep getting a NoSuchElementException in selenium even though the element DOES exist

这是我第一个使用 selenium 的抓取项目。我正在尝试使用 this website.

下载保存在列表中的几个 reddit 视频

如您所见,它显示了一个输入标签,我需要在其中输入视频或 gif 的 url,然后转到下载页面。该输入标签有一个 class 名称 form-control form-control-lg form-control-alternative。因此,当我尝试获取该元素以便用 Python 中的列表中的 link 填充它时,它显示 selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: .form-control form-control-lg form-control-alternative 错误。

您可以使用开发人员工具自行检查,您会看到该输入标签具有 class。

这是我的代码:

for gif in gif_list:
    driver.get('https://keepv.id/reddit-video-downloader')
    input_tag = driver.find_element_by_class_name('form-control form-control-lg form-control-alternative')
    input_tag.send_keys(gif)
    go_button = driver.find_element_by_class_name('btn btn-danger')
    go_button.click()
    second_button = driver.find_element_by_class_name('btn btn-danger sheen waggle spin')
    second_button.click()
    WebDriverWait(driver, 5).until(expected_conditions.presence_of_element_located((By.CLASS_NAME, 'row')))
    download_button = driver.find_element_by_class_name('btn btn-lg btn-danger mb-3 shadow vdlbtn')
    download_button.click()
    gif_url = driver.current_url()
    download_gif(gif_url)

find_element_by_class_name() 接受单个 class 仅使用 css selector 代替。

driver.find_element_by_css_selector(".form-control.form-control-lg.form-control-alternative").send_keys(gif)
driver.find_element_by_css_selector(".btn.btn-danger").click()

或者您可以使用 by_id

driver.find_element_by_id("dlURL").send_keys(gif)
driver.find_element_by_id("dlBTN1").click()

理想情况下,您应该使用 WebDriverWait() 并等待 element_to_be_clickable() 并遵循 css selecor

WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,".form-control.form-control-lg.form-control-alternative"))).send_keys(gif)

点击开始按钮

WebDriverWait(browser,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,".btn.btn-danger"))).click()

您需要导入以下库

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