Python selenium не может найти элемент в модальном

#python #selenium #modal-dialog

#python #селен #модальный диалог

Вопрос:

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

мой код:

 driver.find_element_by_xpath('//*[@id="buy-now-button"]').click()
sleep(5)
x = driver.find_elements_by_xpath("//*[@id='turbo-checkout-pyo-button']")
if len(x) > 0:
    y = driver.find_element_by_xpath("//*[@id='turbo-checkout-pyo-button']")
    y.click()
 

ошибка:

 selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id='turbo-checkout-pyo-button']"}
 

скриншот

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

1. Это в iframe? или вам нужен webdriverwait, чтобы убедиться, что ваша кнопка доступна на странице, прежде чем вы попытаетесь получить к ней доступ?

2. @RichEdwards Когда я нажимаю кнопку, появляется такой экран ожидания: gif

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

4. @RichEdwards Я уже использую sleep(5), чтобы дождаться его загрузки, но это ничего не меняет.

5. я посмотрел на вас — в модальном есть iframe. смотрите Ответ ниже о том, как идентифицировать и как обращаться.

Ответ №1:

Ваш элемент находится внутри iframe. Если вы продолжите прокручивать свой DOM, вы увидите это:

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

Для обработки фреймов с помощью selenium:

  1. Вам нужно переключиться на него
  2. Затем вы можете завершить свое действие
  3. Затем вам нужно вернуться к родительскому фрейму, чтобы продолжить работу со сценарием:

Вот так:

 driver.implicitly_wait(10) # this will wait up to 10 seconds for an object to be present

#your code:
driver.find_element_by_xpath('//*[@id="buy-now-button"]').click()

#iframe switch:
iframe = driver.find_element_by_xpath("//iframe[contains(@id,'turbo-checkout-iframe')]")
driver.switch_to.frame(iframe)

#your code:
x = driver.find_elements_by_xpath("//*[@id='turbo-checkout-pyo-button']")
if len(x) > 0:
    y = driver.find_element_by_xpath("//*[@id='turbo-checkout-pyo-button']")
    y.click()

#back to the main frame to continue the script 
driver.switch_to_default_content()

 

Вам, вероятно, не нужны find_elements , и if len детали — вы, вероятно, можете сразу перейти к щелчку. Однако вышесказанное является ответом на вопрос, почему вы не можете найти свой элемент.