Проблема с iFrames в Selenium - PullRequest
4 голосов
/ 16 июня 2011

Я пытаюсь очистить веб-страницу, используя Selenium (на Python), который почти полностью является Javascript.
Например, это тело страницы:

<body class="bodyLoading">
<!-- this is required for GWT history support -->
<iframe id="__gwt_historyFrame" role="presentation" width="0" height="0" tabindex="-1" title="empty" style="position:absolute;width:0;height:0;border:0" src="javascript:''">  </iframe>
<!-- For printing window contents  -->
<iframe id="__printingFrame" role="presentation" width="0" height="0" tabindex="-1" title="empty" style="width:0;height:0;border:0;"   />


<!-- TODO : RECOMMENDED if your web app will not function without JavaScript enabled -->
<noscript>
<div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif">
 Your web browser must have JavaScript enabled in order for
 Regulations.gov to display correctly.
</div>
</noscript>
</body>

По какой-то причине селен (с использованием движка Firefox) не оценивает JavaScript на этой странице. Если я использую функцию get_html_source, она просто возвращает HTML выше, а не импортированный в JavaScript HTML, который я вижу в своем браузере (и в браузере Selenium). И, к сожалению, я не могу понять, что атрибут src от iFrame просто говорит javascript:, что я не могу понять.

Есть мысли о том, как убедиться, что Selenium обрабатывает этот iFrame?

1 Ответ

4 голосов
/ 10 июля 2011

Фреймы являются отдельными документами, поэтому их содержимое не будет включено в HTML-код главной страницы; Вы должны прочитать их отдельно.

Вы можете сделать это, используя функцию Selenium select_frame.

Вы можете получить доступ к фрейму через его имя, селектор CSS, ссылку на xpath и т. Д., Как и для других элементов.

Когда вы выбираете фрейм, вы изменяете контекст Selenium, поэтому вы можете получить доступ к содержимому фрейма, как если бы это была текущая страница.

Если у вас есть кадры внутри фреймов, вы можете продолжить этот процесс через дерево фреймов.

Очевидно, вам нужен метод возврата обратно по пути кадра. Selenium обеспечивает это, позволяя вам использовать ту же функцию select_frame с параметром либо relative=up для перемещения контекста к родительскому элементу текущего кадра, либо relative=top для перехода на главную страницу в браузере.

Таким образом, с помощью этой функции вы можете перемещаться по рамкам на странице.

Вы не можете получить доступ ко всем сразу; только один кадр может быть в контексте одновременно, поэтому вы никогда не сможете сделать один вызов get_html_source и получить все содержимое фрейма одновременно, но вы можете перемещаться по фреймам на странице в вашем скрипте Selenium и получать источник HTML для каждого фрейма отдельно.

Надеюсь, это поможет.

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