Python, selenium — почему я получаю эту ошибку?

#python #selenium #google-maps

#python #селен #google-карты

Вопрос:

Я хочу получить доступ к картам Google с помощью python, но сначала вам нужно нажать кнопку «Принять файлы cookie», и я не знаю почему, но я продолжаю получать эту ошибку:

Файл «file», строка 12, в WebDriverWait(драйвер, 10).пока (EC.element_to_be_clickable((By.XPATH, ‘//*[@id=»introAgreeButton»]’))).щелкните () Файл «C:UsersgasspAppDataLocalPackagesPythonSoftwareFoundation .Python.3.8_qbz5n2kfra8p0LocalCachelocal-packagesPython38site-packagesseleniumwebdriversupportwait.py» , строка 80, в, пока
не вызовет исключение TimeoutException(message, screen, stacktrace) selenium.common.exceptions.Исключение TimeoutException: сообщение:

Вот мой код:

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome('PATH')
url = 'https://www.google.com/maps/'

driver.get(url)

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="introAgreeButton"]'))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="searchboxinput"]'))).send_keys('gostilne')
driver.submit()
 

Ответ №1:

Согласно https://selenium-python.readthedocs.io/api.html :

исключение selenium.common.exceptions.Исключение TimeoutException(msg = None, screen = None, stacktrace = None) Основы: selenium.common.exceptions.Исключение WebDriverException возникает, когда команда не завершается за достаточное время.

Следовательно, вам нужно либо увеличить время, WebDriverWait(driver, 10) либо проверить, выполняется ли условие EC.element_to_be_clickable вообще.


Кроме того, попробуйте следующую реализацию:

 element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="introAgreeButton"]')))
element.click()
 

Это исправило несколько проблем с моей стороны с аналогичной структурой кода.

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

1. Я попытался увеличить время до 10, и оно по-прежнему выдает мне ту же ошибку. Есть еще идеи? Или ошибка может заключаться в том, что это окно приема файлов cookie является всплывающим окном?

2. @gasper_vaupot Элемент, на который вы ссылаетесь, скрыт? … это интерактивно? С информацией, которую вы нам предоставляете, трудно найти какое-либо решение вашей проблемы. Как уже упоминалось, согласно официальной документации Selenium selenium.common.exceptions.TimeoutException (ошибка, которую вы получаете), относится к следующей проблеме: a command does not complete in enough time .

3. Я не понимаю, как работает система времени. Если я увеличу число, время ожидания также увеличится, верно? Это означает, что если я изменю число на 30 вместо 10, оно должно подождать немного дольше, правильно?

4. @gasper_vaupot Взгляните на явные ожидания ( selenium-python.readthedocs.io/waits.html ): Оператор WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="introAgreeButton"]'))) ожидает максимум 10 секунд для элемента, который вы указали через XPath. Если элемент не найден, присваивается a TimeoutException (тот, который вы получаете)! Таким образом, элемент либо недоступен, либо отсутствует (возможно, неправильный XPath?).

5. Есть ли способ, чтобы я мог отправить изображение того, что я хочу щелкнуть? Чтобы вы точно знали, что я имею в виду

Ответ №2:

Когда я попытался получить доступ к сайту, я не нашел локатор xpath //*[@id="introAgreeButton"] в chrome dev tool. Не уверен, к какому элементу он относится.

Однако, когда я прокомментировал эту строку и добавил событие щелчка на кнопке поиска, я смог получить результаты.

Также нет submit() метода, доступного для экземпляра драйвера.

Ниже была моя пробная версия с использованием предоставленного вами кода —

 WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="searchboxinput"]'))).send_keys('gostilne')
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//button[@id='searchbox-searchbutton']"))).click()
 

Вывод :-

введите описание изображения здесь

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

1. Проблема, с которой я сталкиваюсь, до этого. Когда я запускаю свой код, он открывает новую вкладку Google Maps, но прежде чем я смогу что-либо сделать, поскольку я не зарегистрирован, я должен нажать кнопку «Принять файлы cookie», и в этом моя проблема

2. Я только что опубликовал изображение того, что я хочу щелкнуть здесь

3. Опубликуйте это в самом вашем вопросе, эта часть этой темы предназначена только для ответов

4. @gasper_vaupot Я не получаю это всплывающее окно с моей стороны

Ответ №3:

Проблема заключалась в том, что она не менялась между основным фреймом и фреймом принятия cookie. Вот код soulution:

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome('C:\Users\gassp\OneDrive\Namizje\Python.projects\chromedriver.exe')
url = 'https://www.google.com/maps/'

driver.get(url)

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//*[@id="consent-bump"]/div/div[1]/iframe')))
agree = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="introAgreeButton"]/span/span'))) 
agree.click()

#back to the main page
driver.switch_to_default_content()


WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="searchboxinput"]'))).send_keys('gostilne')
driver.submit()