Невозможно найти / нажать всплывающую кнопку с Selenium в Python

#python #selenium-webdriver #popup

#python #selenium-webdriver #всплывающее окно

Вопрос:

Я использую Selenium в Python 3 для доступа к веб-страницам, и я хочу нажать на всплывающую кнопку, но я не могу найти ее с помощью Selenium.

То, что я описываю ниже, относится к ряду сайтов с всплывающим окном, поэтому я использую простой пример.

 url = "https://www.google.co.uk"

from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get(url)
  

На странице есть всплывающее окно для согласия на использование файлов cookie.

страница с всплывающим

Я хочу, чтобы скрипт нажал на кнопку «Я согласен», но я не могу ее найти.

Я нашел несколько вопросов и сообщений об этом в Интернете (в том числе в Stackoverflow), но все предложения, которые я нашел, похоже, попадают в одну из следующих категорий и, похоже, не работают для меня.

  1. Подождите дольше, пока всплывающее окно действительно загрузится.

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

  1. Используйте что-то вроде driver.switch_to.alert

Я получаю NoAlertPresentException . Всплывающее окно, похоже, не является предупреждением.

  1. Найдите элемент с помощью driver.find_element .

Это тоже не работает, независимо от того, какой подход я использую (xpath, имя класса, текст и т.д.). Я могу найти элементы со страницы под всплывающим окном, но ничего из самого всплывающего окна. Например,

 # Elements in main page (under pop-up)
driver.find_element_by_partial_link_text("Sign in") # returns FirefoxWebElement
driver.find_element_by_class_name("gb_g") # returns FirefoxWebElement

# Elements on the pop-up
driver.find_element_by_partial_link_text("I agree") # NoSuchElementException
driver.find_element_by_class_name("RveJvd snByac") # NoSuchElementException
  

Всплывающее окно, похоже, просто отсутствует в источнике страницы. На самом деле, если я попытаюсь просмотреть источник загруженной страницы из браузера, я не могу найти ничего, связанного с всплывающим окном. Я понимаю, что многие сайты используют клиентские скрипты для динамической загрузки элементов, поэтому многие элементы не будут отображаться в исходном коде, но в этом и был смысл использования Selenium: для загрузки страницы, интерпретации скриптов и доступа к конечному результату.

Итак, что я делаю не так? Откуда появляется всплывающее окно и как я могу получить к нему доступ?

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

1. используется --headless ли опция или вам нужно окно?

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

3. @AbrarAhmed, мне не нужно видеть окно, но мне нужен браузер, который может интерпретировать JS и т.д. чтобы загрузить содержимое, к которому я хочу получить доступ с помощью скрипта. Я считаю, что я не могу использовать --headless для этого.

4. @AbrarAhmed, я включил в вопрос как URL-адрес страницы, так и скриншот с всплывающим окном. Чтобы получить всплывающее окно, вам может потребоваться выйти из любых учетных записей Google и очистить файлы cookie.

5. Вы пробовали использовать инструменты отладки браузера? Я мог видеть (в Firefox) следующую строку, когда я использовал инспектор на кнопке «Я согласен»: <span class="RveJvd snByac">I agree</span> .