Драйвер Selenium python не нажимает и не нажимает клавишу для кнопки все время

Я использую селен, чтобы попасть на YouTube и написать что-то в строке поиска, а затем нажать кнопку или нажать клавишу ввода.

И щелчок, и нажатие клавиши иногда работают, но иногда нет. Пробовал ждать с WebDriverWait, и даже менял время ожидания с 10 до 20 секунд, но это не имело никакого значения.

И если я что-нибудь добавлю (например, распечатаю новый заголовок страницы), он покажет мне только заголовок первой страницы, а не заголовок после поиска.

Вот мой код и то, что я пробовал:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


def get_driver():
    firefox_options = Options()
    # firefox_options.add_argument("--headless")
    driver = webdriver.Firefox(executable_path=r"C:\Program Files\Mozilla Firefox\geckodriver.exe", options=firefox_options)
    driver.implicitly_wait(9)
    return driver

driver = get_driver()

driver.get('https://www.youtube.com/')
search = driver.find_element(By.XPATH, '//input[@id = "search"]')
search.send_keys("python")
# search.send_keys(Keys.ENTER) #using the enter key # If I add nothing after this line it work
# searchbutton = driver.find_element(By.XPATH,'//*[@id = "search-icon-legacy"]') # This also dose doesn't work
# searchbutton.click() # using the click method() #also dose not work
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id = "search-icon-legacy"]'))).click() # Sometimes work
# driver.implicitly_wait(10)
# print(driver.title) # This show me only the title of the first page not the one after the search

Это потому, что я использую веб-драйвер Firefox (должен ли я перейти на Chrome)? Или это из-за моего интернет-соединения?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы это работало, вам нужно сначала щелкнуть поле поиска, затем добавить короткую задержку, а затем отправить элемент Keys.ENTER или щелкнуть search-icon-legacy.
Так что это не ваша вина, так работает веб-страница YouTube. Можно даже назвать это своего рода ошибкой. Но поскольку эта веб-страница создана для пользователей-людей, она работает хорошо, поскольку человек никогда не нажмет на поле ввода и не вставит туда значение поиска за нулевое время.
В любом случае, работают 2 следующих кода:
Первый.

import time

from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

options = Options()
options.add_argument("start-maximized")
options.add_argument('--disable-notifications')

webdriver_service = Service('C:\webdrivers\chromedriver.exe')
driver = webdriver.Chrome(options=options, service=webdriver_service)
wait = WebDriverWait(driver, 10)

url = "https://www.youtube.com/"
driver.get(url)

search = wait.until(EC.element_to_be_clickable((By.XPATH, '//input[@id = "search"]')))
search.click()
time.sleep(0.2)
search.send_keys("python")
wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id = "search-icon-legacy"]'))).click()

Второй.

import time

from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

options = Options()
options.add_argument("start-maximized")
options.add_argument('--disable-notifications')

webdriver_service = Service('C:\webdrivers\chromedriver.exe')
driver = webdriver.Chrome(options=options, service=webdriver_service)
wait = WebDriverWait(driver, 10)

url = "https://www.youtube.com/"
driver.get(url)

search = wait.until(EC.element_to_be_clickable((By.XPATH, '//input[@id = "search"]')))
search.click()
time.sleep(0.2)
search.send_keys("python" + Keys.ENTER)

Он работает именно так, как я хочу, и спасибо за подсказку о том, как работает YouTube, большое спасибо

zaki_zardo 27.11.2022 14:59

Добро пожаловать! Я всегда рад помочь.

Prophet 27.11.2022 15:02

Другие вопросы по теме