Как найти элемент внутри iFrame, используя Selenium и Python - PullRequest
2 голосов
/ 14 февраля 2020

Это исходный код ifram:

<iframe sandbox="allow-scripts allow-same-origin" class="credit-card-iframe mt1 u-full-width prl2-sm" src="https://paymentcc.nike.com/services/default?id=3f42d8c5-74ee-4d08-95aa-bb6ea4949f9f&amp;ctx=checkout&amp;language=en-GB&amp;maskerEnabled=true" frameborder="0" scrolling="no" xpath="1"></iframe>

Это элемент, который я хочу;

<input maxlength="20" class="mod-ncss-input ncss-input pt2-sm pr4-sm pb2-sm pl4-sm" id="creditCardNumber" onautocomplete="off" value="" type="tel" tabindex="0" data-shortname="cc">

Это мой код:

browser.switch_to.frame(browser.find_element_by_xpath("//iframe[@class='credit-card-iframe mt1 u-full-width prl2-sm']"))
browser.implicitly_wait(10)
card = browser.find_element_by_xpath("//input[@id='creditCardNumber']")
card.send_keys("35663565444")

Это это ошибка:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//input[@id='creditCardNumber']"}

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

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Поскольку требуемый элемент находится в пределах <iframe>, поэтому для вызова click() на элементе необходимо:

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

    • с использованием XPATH:

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@sandbox='allow-scripts allow-same-origin' and contains(@class, 'credit-card-iframe')]")))
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='creditCardNumber' and @data-shortname='cc']"))).send_keys("35663565444")
      
    • Примечание : Вы должны добавить следующий импорт:

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

Ссылка

Вы можете найти соответствующее обсуждение в :

0 голосов
/ 14 февраля 2020

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

from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support.expected_conditions import visibility_of_element_located

CARD_INPUT_LOCATOR = By.ID, "creditCardNumber"
card_input = WebDriverWait(browser, 20).until(visibility_of_element_located(CARD_INPUT_LOCATOR))
card_input.send_keys("35663565444")

Это должно решить вашу проблему.

...