#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, попытался выполнить регистрацию.