Не удается найти элемент во всплывающем окне с помощью Selenium на Python - PullRequest
2 голосов
/ 07 августа 2020

Я хочу очистить некоторые элементы с веб-страницы Duden с этим URL: https://www.duden.de/rechtschreibung/aussuchen. Когда я просматриваю страницу вручную, всплывающие окна не появляются, но когда я использую селен на python, это происходит: всплывающее изображение

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

Я попытался найти элемент фрейма и распечатать оператор, чтобы посмотреть, сможет ли он найти элементы, но это тоже не работает.

Кто-нибудь идея, почему это так или что я мог бы попробовать еще?

Вот несколько вещей, которые я пробовал:

  • Для блокировки:

    def getAllWordForms(word):
    
       options = Options()
       profile = webdriver.FirefoxProfile()
       profile.set_preference("dom.disable_open_during_load", False)
       driver = webdriver.Firefox(firefox_profile=profile,options=options, executable_path=os.path.join(driver_location, 'geckodriver'))
    
       main_url = 'https://www.duden.de/rechtschreibung/'
    
       word_url = main_url + '{}'.format(word)
    
       driver.get(word_url)
    
  • , чтобы увидеть, может ли он найти элемент во всплывающем фрейме:

    def getAllWordForms(word):
    
       options = Options()
       driver = webdriver.Firefox(options=options, executable_path=os.path.join(driver_location, 'geckodriver'))
    
       main_url = 'https://www.duden.de/rechtschreibung/'
       word_url = main_url + '{}'.format(word)
       driver.get(word_url)
       driver.implicitly_wait(10)
       driver.switch_to.frame(1)
    
       if driver.find_elements_by_class_name('message-button'):
          print('yes')
    
  • , чтобы нажать кнопку:

      def getAllWordForms(word):
    
         options = Options()
         options.headless = False
         driver = webdriver.Firefox(options=options, executable_path=os.path.join(driver_location, 'geckodriver'))
    
         main_url = 'https://www.duden.de/rechtschreibung/'
         word_url = main_url + '{}'.format(word)
         driver.get(word_url)
         driver.implicitly_wait(10)
         driver.switch_to.frame(1)
         button = driver.find_element_by_xpath("//button[@aria-label='AKZEPTIEREN']")
         button.click()
         driver.switch_to.default_content()
    

Я пробовал разные комбинации, но это не работает.

Элементы страницы структурированы следующим образом: структура page_1 структура page_2

Надеюсь, я смогу объяснить это правильно и, возможно, кто-нибудь сможет мне помочь.

1 Ответ

1 голос
/ 07 августа 2020

Каждый раз, когда вы запускаете свой webdriver, вы используете новый временный профиль. В этом профиле нет файлов cookie, поэтому он рассматривается сайтом как новый пользователь, которому необходимо принять сообщение cook ie.

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

Этот код работает для меня:

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

driver = webdriver.Chrome()
driver.get("https://www.duden.de/rechtschreibung/aussuchen")

iframe = driver.find_element_by_xpath("//iframe[contains(@id,'sp_message_iframe')]")
driver.switch_to.frame(iframe)
cookieAccpet = WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.XPATH, "//button[text()='AKZEPTIEREN']")))
cookieAccpet.click()

driver.switch_to.default_content()

Не забудьте переключиться обратно на фрейм по умолчанию в конце driver.switch_to.default_content(), затем вы можете продолжить свой скрипт.

...