Python Selenium Webdriver - найти вложенный фрейм

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

Источник HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
	<head>
		<meta http-equiv = "Content-Type" content = "text/html; charset=windows-1252">
		<title>VIS</title>
		<link rel = "shortcut icon" href = "https://bbbbb/ma1/imagenes/iconos/favicon.ico">
	</head>
	<frameset rows = "51,*" frameborder = "no" scrolling = "no" border = "0">
		<frame id = "cabecera" name = "cabecera" src = "./blablabla.html" scrolling = "no" border = "3">
			<frameset id = "frame2" name = "frame2" cols = "180,*,0" frameborder = "no" border = "1">
				<frame id = "menu" name = "menu" src = "./blablabla_files/Menu.html" marginwidth = "5" scrolling = "auto" frameborder = "3">
					<a href = "/ma1/jsp/orD/queda.jsp" target = "contenido">Buscar</a>
				<frame id = "contenido" name = "contenido" src = "./blablabla_files/saved_resource.html" marginwidth = "5" marginheight = "5">
					<html>
						<head>
							<meta http-equiv = "Content-Type" content = "text/html; charset=windows-1252">
							<title>BUSCAr</title>
						</head>
						<frameset name = "principal" rows = "220,*" frameborder = "NO">
							 <frame name = "Formulario" src = "./BusquedaSimple.html" scrolling = "AUTO" noresize = "noresize">
								<input id = "year" name = "year" size = "4" maxlength = "4" value = "" onchange = "javascript:Orden();" onfocus = "this.value='2018';this.select();" type = "text">
							 <frame name = "Busqueda" src = "./saved_resource(2).html" scrolling = "AUTO">
						</frameset>
						<noframes>
							&lt;body&gt;
							&lt;p&gt;soporte a tramas.&lt;/p&gt;
							&lt;/body&gt;
						</noframes>
					</html>
				<frame name = "frameblank" marginwidth = "0" scrolling = "no" src = "./blablabla_files/saved_resource(1).html">
			</frameset>
			<noframes>
			  &lt;P&gt;Para ver esta página.&lt;/P&gt;
			</noframes>
	</frameset>
</html>

Я нахожу кнопку «Автобус» внутри фрейма «меню» с помощью:

driver.switch_to_default_content()
driver.switch_to_frame(driver.find_element_by_css_selector("html frameset frameset#frame2 frame#menu"))
btn_buscar = driver.find_element_by_css_selector("#div_menu > table:nth-child(10) > tbody > tr > td:nth-child(2) > span > a")
btn_buscar.click()

Я пробовал этот код, чтобы найти входной id = "year" внутри frame = "Formulario":

driver.switch_to_default_content()
try:       driver.switch_to_frame(driver.switch_to_frame(driver.find_element_by_css_selector("html frameset frameset#frame2 frame#contenido frameset#principal frame#Formulario")))
    print("Ok cabecera -> contenido")
except:
    print("cabecera not found")

или же

driver.switch_to_frame(driver.switch_to_xpath("//*[@id='year"]"))

но они не работают.

Вы можете помочь мне?

Спасибо!

Проверьте предоставленный образец кода HTML - он, похоже, не работает, поскольку у iframe нет закрывающих тегов ...

Andersson 11.03.2018 16:47
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
280
2

Ответы 2

Чтобы иметь возможность обрабатывать требуемый iframe, вам необходимо впоследствии переключиться на все рамки предков:

driver.switch_to.frame("cabecera")
driver.switch_to.frame("menu")
btn_buscar = driver.find_element_by_link_text("Buscar")
btn_buscar.click()

Также обратите внимание, что в экземпляре Webdriver нет таких методов, как switch_to_xpath() и switch_to_frame(), методы switch_to_default_content() устарели, поэтому вам лучше использовать switch_to.frame(), switch_to.default_content()

Предполагая, что ваша программа сфокусирована на Контекст просмотра верхнего уровня, чтобы найти и кнопку с текстом как Автобус, вам нужно switch() через все родительские кадры вместе с WebDriverWait в сочетании с правильным expected_conditions, и вы можете использовать следующий блок кода:

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(By.ID,"cabecera"))
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(By.ID,"menu"))
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, "Buscar"))).click()

Я попробовал оба варианта, но попасть в кнопку «Бускар» внутри рамки «меню» не удалось. Наконец, я решил загрузить <frame id = "contenido" name = "contenido" src = "./ blablabla_files / saved_resource.html" marginwidth = "5" marginheight = "5">, который загружает тот же результат, что и кнопка "Buscar". , потому что это фрейм, который загружает форму, и единственная часть, которая мне нужна. Спасибо!

Lafayette 02.04.2018 21:51

Другие вопросы по теме