Селен (Python) >> selenium.common.exceptions.NoSuchFrameException: - PullRequest
1 голос
/ 11 марта 2020

Я пытался войти в iframe и написать текст в строке поиска (тэге) в Safari:

Я не могу опубликовать html, потому что он огромный и не мой но это код iframe:

<iframe frameborder="0" id="contentIFrame0" name="contentIFrame0" title="Área de contenido" style="border: 0px none; overflow: hidden; position: absolute; left: 0px; right: 0px; height: 100%; width: 100%; visibility: visible; display: block;"> (...Content of the iframe...) </iframe>

Вот код python:

wait.until(ec.frame_to_be_available_and_switch_to_it((By.XPATH, '//*[@id="contentIFrame0"]')))
chk_elem = wait.until(ec.visibility_of_element_located((By.XPATH, '//*[@id="2crmGrid_findCriteria"]')))
act = ActionChains(driver)
act.move_to_element(chk_elem)
act.send_keys('Search input', Keys.ENTER).perform()

но я всегда получаю это исключение: "selenium.common.exceptions.NoSuchFrameException: Message: ».

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

PD: Нет другого iframe перед тем iframe, который я разместил, и XPATH написаны хорошо. Я не знаю, насколько это актуально, но мы говорим о веб-сайте динамических сервисов от Microsoft, на всякий случай.

1 Ответ

1 голос
/ 11 марта 2020

Это сообщение об ошибке ...

selenium.common.exceptions.NoSuchFrameException

... означает, что экземпляру Selenium WebDriver не удалось обнаружить элемент <iframe>.


Вы адаптировали правильный подход. В идеале, чтобы найти , вы должны вызвать WebDriverWait несоответствие с Ожидаемые_условия , установленное как frame_to_be_available_and_switch_to_it () .

* 10 * Однако может быть множество причин возникновения этой ошибки, и некоторые из причин и решений следующие:
  • Требуемый iframe может быть вложенным iframe внутри родительского элемента iframe . В этих случаях вы должны WebDriverWait сначала переключиться на родительский фрейм , а затем на дочерний фрейм следующим образом:

    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"parent_iframe_xpath")))
    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"child_iframe_xpath")))
    
  • Если вы переключаетесь между двумя братьями и сестрами iframes , то сначала вам нужно сначала переключиться обратно на default_content, а затем переключиться на iframe брата следующим образом:

    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"sibling_iframe_A")))
    driver.switch_to.default_content()
    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"sibling_iframe_B")))
    

Подробное обсуждение можно найти в Как обратиться к «WebDriverException: Сообщение: TypeError: невозможно получить доступ к мертвому объекту» и дождаться, пока кадр будет доступен с помощью Selenium и Python

  • Иногда кратные iframes могут иметь одинаковые значения для одинаковых атрибутов. В этих случаях вам может понадобиться построить Locator Strategies , который уникальным образом идентифицирует элемент <iframe>, используя атрибут src, следующим образом:

    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id="iframe_id and @src='iframe_src'"]")))
    

Подробное обсуждение можно найти в Способы работы с #document в iframe

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...