Я продолжаю получать исключение NoSuchElementException в selenium, даже если этот элемент существует

#python #selenium #web-scraping #css-selectors #webdriverwait

Вопрос:

Это мой первый проект по очистке с использованием селена. Я пытаюсь загрузить пару видео reddit, сохраненных в списке, с помощью этого веб-сайта.

Как вы можете видеть, он показывает тег ввода, в котором мне нужно ввести URL-адрес видео или gif, а затем перейти на страницу загрузки. Этот входной тег имеет имя класса 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)
 

Комментарии:

1. Вы не должны находить элементы по имени класса, если в имени класса есть пробелы. Может быть, попробовать другой селектор/подход

Ответ №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
 

Комментарии:

1. Thx, я исправил те, о которых вы мне говорили, но когда вы возвращаетесь к моему коду, там есть строка, в которой я получаю элемент download_button. По какой-то причине я продолжаю получать ту же ошибку nosuchelement даже после того, как попытался переключиться на селектор css и изменить строку. Я даже попытался использовать xpath после копирования его с помощью инструментов разработчика и получения «/html/body/main/section[1]/div/div[2]/div[1]/div[2]/a».