Переключение обратно на родительский кадр после того, как он больше не находится в DOM в Selenium - PullRequest
0 голосов
/ 04 июля 2018

У меня есть следующая страница

<body>
  <iframe id="outer_frame">
    <iframe id="search_button_frame">
      <button id="search_button"></button>
    </iframe>
  </iframe>
</body>

Теперь, после того как я нажму search_button, два frames outer_frame и search_button_frame больше не будут в DOM, и вместо этого страница станет такой

<body>
  <iframe id="form_frame">
    ...
  </iframe>
</body>

Я пытаюсь перейти на search_button, затем выйти из фреймов на главную страницу, а затем переключиться на form_frame, используя это:

outer_frame = browser.find_element_by_xpath('//*[@id="outer_frame"]')
browser.switch_to.frame(outer_frame)

search_button_frame = browser.find_element_by_xpath('//*[@id="search_button_frame"]')
browser.switch_to.frame(search_button_frame)

search_button = browser.find_element_by_xpath('//*[@id="search_button"]')
search_button.click()

browser.switch_to_default_content()

form_frame = browser.find_element_by_xpath('//*[@id="form_frame"]')
browser.switch_to.frame(form_frame)

но я продолжаю получать следующую ошибку:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Una
ble to locate element: {"method":"xpath","selector":"//*[@id="form_frame"]"}

означает ли это, что я не в правильном кадре?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Согласно стандартной процедуре: сначала сохраните родительский дескриптор браузера. String handle = driver.getwindowhandle ();

Затем попробуйте переключиться на фрейм с ожиданием, чтобы драйвер мог подождать некоторое время, если его сейчас нет в DOM. После завершения работы над фреймом снова переключитесь на parentWindow (окно по умолчанию). Та же процедура может применяться к каждому кадру, который всегда будет работать идеально.

0 голосов
/ 04 июля 2018

В соответствии с вашим вопросом и структурой DOM Tree после нажатия на search_button вам необходимо переключить на default_content() сначала, а затем переключиться к следующему желаемому <iframe>, используя WebDriverWait следующим образом:

driver.switch_to.default_content()
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"form_frame")))

Подробное обсуждение можно найти в:

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