Ошибка селена: Элемент не взаимодействует (всплывающие окна coockie и другие)

#python #html #selenium #beautifulsoup #inspect

Вопрос:

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

 driver = webdriver.Chrome()
driver.get('https://www.quattroruote.it/listino/audi/a4-allroad')
time.sleep(10)
html = driver.find_element_by_id('btnallestimenti')
html.click()
 

Но я получаю эту ошибку:
селен.общие.исключения.Исключение ElementNotInteractableException: Сообщение: элемент не поддается взаимодействию

когда страница открыта, появляются файлы cookie и другие вещи, есть ли способ заблокировать их все, чтобы я мог работать с html?

Большое спасибо!

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

1. Этот код работает, если я вручную закрою файлы cookie и второе всплывающее окно, которое я получу!

2. Ваша проблема решена ?

Ответ №1:

Как вы можете видеть, баннер «cookie» сам по себе является HTML-элементом и содержит кнопку «Закрыть» («Chiudi»), которую можно нажать.

Если вы проверите источник страницы, вы найдете этот код, относящийся к этой кнопке:

 <button type="button" class="iubenda-cs-close-btn" tabindex="0" role="button" aria-pressed="false" style="font-size:16px!important;">Chiudi</button>
 

Ваш скрипт необходимо изменить, чтобы выполнить поиск элемента по видимому тексту (с помощью XPath) и щелкнуть по нему, чтобы закрыть баннер:

 close_button = driver.find_element_by_xpath("//*[text()='Chiudi']")

close_button.click()
 

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

Конечно, вам нужно будет протестировать свой сценарий и настроить его в соответствии с поведением страницы.

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

Редактировать

Разместив здесь полный код, попробуйте использовать его и продолжайте отсюда:

 import time
from selenium.webdriver import Chrome

driver = Chrome()

driver.get("https://www.quattroruote.it/listino/audi/a4-allroad")
time.sleep(6)

driver.find_element_by_xpath("//button[text()='Accetta']").click()
time.sleep(6)

driver.switch_to.frame("promo-premium-iframe")
driver.find_element_by_xpath("//a[normalize-space()='Non sono interessato']").click()
time.sleep(6)

driver.switch_to.default_content()

driver.find_element_by_id("btnallestimenti").click()

input()
 

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

1. Эй, я пытаюсь заставить это работать, я заменяю «Chiudi» на «Accetta», Но все равно появляется второе всплывающее окно… есть идеи, как это решить? В любом случае, я буду голосовать за то, чтобы вы наверняка уже помогли

2. @LuigiModica повторите код для второго всплывающего окна, и он должен сработать, в основном вы снова ищете нужную кнопку и нажимаете ее.

3. Я имею в виду белое всплывающее окно в середине страницы, где внизу написано «Non sono interessato» , что означает «не заинтересован», Извините за беспокойство, но таким образом вы бы решили многие мои проблемы с диссертацией..

4. Попробуйте это: driver.find_element_by_class_name('btn zaux-btn-1 zaux-btn-1--txtred1 closePromo').click() после того, как вы закроете всплывающее окно cookie. Поместите time.sleep(8) между 2 командами (не забудьте import time )

5. К сожалению, это не сработало..

Ответ №2:

Вы можете попытаться принять файл cookie и продолжить, проверив приведенные ниже строки кода.

 options = Options()
options.add_argument("--disable-notifications")


driver = webdriver.Chrome(options=options,"ChromeDriver_Path")
driver.maximize_window()
driver.get('https://www.quattroruote.it/listino/audi/a4-allroad')
sleep(10)

cookie_btn = driver.find_element_by_xpath("//button[text()='Accetta']")
cookie_btn.click()
sleep(3)

WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"promo-premium-iframe")))
register_btn = driver.find_element_by_xpath("//a[normalize-space()='Accedi o Registrati']")
register_btn.click()
 

Iframe доступен, поэтому просто переключился на iframe, попытался выполнить регистрацию.