【问题标题】:I keep getting a NoSuchElementException in selenium even though the element DOES exist即使元素确实存在,我也会在 selenium 中不断收到 NoSuchElementException
【发布时间】:2021-03-18 15:57:57
【问题描述】:

这是我第一个使用 selenium 的抓取项目。我正在尝试使用 this website 下载保存在列表中的几个 reddit 视频。

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

你可以使用开发者工具检查自己,你会看到输入标签有那个类。

这是我的代码:

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)

【问题讨论】:

  • 如果类名中有空格,则不应按类名查找元素。也许尝试不同的选择器/方法

标签: python selenium web-scraping css-selectors webdriverwait


【解决方案1】:

find_element_by_class_name() 接受单个类,仅使用 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

【讨论】:

  • 谢谢,我修复了你告诉我的那些,但是当你回到我的代码时,有一行我得到了 download_button 元素。出于某种原因,即使在我尝试更改为 css 选择器并修改字符串之后,我仍然会收到相同的 nosuchelement 错误。我什至在使用开发工具复制 xpath 并获取 '/html/body/main/section[1]/div/div[2]/div[1]/div[2]/a' 后尝试使用它。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 2020-07-20
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多