Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

[Resolved] Не получается переключиться в iframe.


(Yury) #1

Доброго дня!
Есть такая структура страницы:

<html>
<head>
    <body class="en">
	<div class="header clearfix">
		<div class="main">
			<tr class="mceFirst" role="presentation">
				<tr class="mceLast">
					<td class="mceIframeContainer">
						<iframe id="micro_bundle_ifr" frameborder="0" src="javascript:""" allowtransparency="true">
							<html>
							    <body>

Не получается переключиться в iframe.
Пробовал так:

frame = driver.find_element(By.ID, 'micro_bundle_ifr')
driver.switch_to_frame(frame)

Выбрасывается ошибка: NoSuchFrameException: Message: Unable to locate frame:
Та же беда, если использовать XPATH.
Что я не так делаю?
Спасибо!


(Максим Малунов) #2

Я бі попробывал (Java).

  1. webDriver.switchTo().frame( 1 );
  2. webDriver.switchTo().defaultContent()

p/s Это попыткa переключения первая ? Или вы уже переключались в другой frame ?


(ex3me0) #3

Все же проверяйте свой селектор, FirePath’ом например
Потестил, у меня Ваш пример работает в таком виде:

app_frame = driver.find_element_by_xpath('//iframe[@id="micro_bundle_ifr"]')
driver.switch_to.frame(app_frame)

Возможно несколько таких фреймов на странице (с одинаковыми id), и тот, который Вам нужен - идет вторым по-порядку, проверьте:

frames = driver.find_elements_by_xpath('//iframe')
print(len(frames))

Либо, как вариант, страница на которой находится этот фрейм - находится на втором уровне вложенности (т.е. сама является фреймом)


(Yury) #4

Благодарю за ответы!
Попытка переключения первая.
В FirePath у меня это отображается так, что есть TopWindow и некий iframe#
То есть в FirePath этот вложенный элемент находится. Он не находится на стадии запуска теста.
Фрейм на странице единственный. Это текстовое поле с кнопками редактирования


(ex3me0) #5

В принципе можете выложить ссылку на исследуемую страницу, если она не под секретом.
Быстрее найдем проблемное место


(Yury) #6

Нашел ошибку!
У меня фрейм хранился только как локатор в классе:

class Page:
     frame = (By.ID, 'micro_bundle_ifr')

И я так на него и ссылался, а надо было:

driver.find_element(*Page.frame)

Спасибо еще раз за помощь! И простите великодушно :slight_smile:


(Oleg V) #7

Ещё можно попробовать поставить принудительные ожидания перед и после переключения во фрейм


(ex3me0) #8

:smile: бывает, сам иногда парюсь с распаковкой
в следующий раз - выкладывайте полный стектрейс :wink: