Ошибка При попытке Щелкнуть по тегу » a » — Selenium Python

#python #selenium #selenium-webdriver #firefox #geckodriver

Вопрос:

У меня есть очень простая программа, которая открывается https://google.com и нажимает на первую ссылку. Я использовал WebDriverWait , чтобы убедиться, что элемент готов к щелчку, хотя он все еще не работает, выводит и выдает ошибку.

Код:

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

wd = webdriver.Firefox()

wd.get("https://www.google.com/search?q=python")

# wd.find_element_by_css_selector("a").click()  # This doesn't work, same error
WebDriverWait(wd, 1000000).until(
    expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "a"))
).click()

time.sleep(5)

wd.close()
 

Ошибка:

 Traceback (most recent call last):
  File "c:UserskethaOneDriveDocumentsCodingYoungwonksInteractingWithWebsitesselenium_basics.py", line 17, in <module>
    WebDriverWait(wd, 1000000).until(
  File "C:UserskethaAppDataLocalProgramsPythonPython39libsite-packagesseleniumwebdriverremotewebelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
  File "C:UserskethaAppDataLocalProgramsPythonPython39libsite-packagesseleniumwebdriverremotewebelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "C:UserskethaAppDataLocalProgramsPythonPython39libsite-packagesseleniumwebdriverremotewebdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:UserskethaAppDataLocalProgramsPythonPython39libsite-packagesseleniumwebdriverremoteerrorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotInteractableException: Message: Element <a class="gyPpGe"> could not be scrolled into view
 

Я использую Firefox.
Версия Firefox: 89.0 (64-разрядная версия)
Версия селена: 3.141.0
Версия Geckodriver: 0.29.1

Ответ №1:

Вы используете неправильный локатор.
Определенно не все a элементы являются ссылками, особенно первые a на этой странице.
Попробуйте использовать это вместо:

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

wd = webdriver.Firefox()

wd.get("https://www.google.com/search?q=python")

# wd.find_element_by_css_selector("a").click()  # This doesn't work, same error
WebDriverWait(wd, 20).until(
    expected_conditions.element_to_be_clickable((By.XPATH, "//div[@id='search']//a[contains(@href,'http')]"))
).click()

time.sleep(5)

wd.close()
 

Кроме того, нет необходимости определять такие длительные тайм-ауты для явного ожидания. В большинстве случаев достаточно 20-30 секунд.