#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».