Способы работы с #document в iframe - PullRequest
0 голосов
/ 08 ноября 2018

Для портала, который я сейчас тестирую, я столкнулся с проблемой, что не мог создать локаторы xpath, через некоторое время я понял, что это из-за «#document», это сокращает путь и делает простое «Скопируйте xpath», чтобы указать путь к совершенно другому элементу.

<iframe id="FRAMENAME" src="/webclient/workspace/launch-task/REMbl?ds=BP" width="100%" height="100%" frameborder="0" data-navitemname="navitemname" style="" xpath="1">
#document
    <html>
        CODE....
    </html>

Я нашел решение для этого, это просто добавить переключатель, например:

driver.switchTo().frame("FRAMENAME");

Это работает и заставляет остальную часть кода работать должным образом, но требует дополнительной обработки этой команды, пока код не переместится на следующую строку.

Итак, я хотел бы спросить, есть ли лучшее решение для этого? что-то умнее / быстрее?

Я обеспокоен тем, что когда наступит момент, когда у меня будет много сценариев, время выполнения займет слишком много времени.

Например, я не использую локаторы идентификаторов, потому что все они динамические, поэтому иногда требуется xpath.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

встроенных кадров

Согласно документации в Использование встроенных фреймов , встроенный фрейм - это конструкция, которая встраивает документ в документ HTML, так что внедренные данные отображаются внутри подокна браузера. окно. Это не означает полного включения, и оба документа независимы, и оба они рассматриваются как полные документы, а не рассматриваются как один из компонентов другого.


структура и детали iframe

  • Обычно элемент iframe имеет вид:

    <iframe src="URL" more attributes>
    alternative content for browsers which do not
    support iframe
    </iframe>
    
  • Браузеры, которые поддерживают iframe, отображают документ, на который ссылается URL, в подокне, обычно с вертикальной и / или горизонтальной полосой прокрутки. Такие браузеры игнорируют содержимое элемента iframe (т. Е. Все, что находится между начальным тегом <iframe...> и конечным тегом </iframe>). Браузеры, которые не поддерживают iframe (или имеют такую ​​поддержку отключенной), делают наоборот, т. Е. Обрабатывают содержимое так, как если бы тегов <iframe...> и </iframe> не было. Таким образом, контент имеет значение, несмотря на то, что некоторые браузеры его игнорируют.

  • Итак, подведем итог: встроенные фреймы не означают, что включает в себя функцию , хотя иногда она может служить аналогичным целям.

  • Обратите внимание, что при использовании встроенных фреймов браузер (если он их поддерживает) отправляет запрос на сервер, указанный в элементе iframe URL, и после получения запрошенного документа отображает его внутри встроенная рамка. В этом смысле встроенные фреймы - это общая проблема браузера и сервера, но только браузер должен быть особенно осведомлен о iframe; с точки зрения сервера, это просто обычный HTTP-запрос на документ, и он отправляет документ, не имея (или не требуя) никакого представления о том, что будет с ним делать браузер.


Что-то умнее

В соответствии с рекомендациями при переключении на iframe вам нужно вызвать WebDriverWait следующим образом:

  • Переключение через Имя кадра (Пример кода Java):

    new WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.name("frame_name")));
    
  • Переключение через iframe XPath (пример кода Python):

    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='ptifrmtgtframe' and @name='TargetContent']")))
    
  • Переключение через iframe CssSelector (Пример кода C #):

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt(By.CssSelector("iframe#twitter-widget-0")));
    

Ссылки

Подробное обсуждение можно найти в Можно ли переключиться на элемент в кадре без использования driver.switchTo (). Frame (“frameName”) в Selenium Webdriver Java?


ТЛ; др

Встроенные и обычные кадры

0 голосов
/ 12 ноября 2018

Для работы с элементами внутри iframe необходимо переключиться на этот конкретный iframe.

Ваше решение .switchTo().frame("FRAMENAME"); правильно. У Selenium нет других способов работы с iframe оболочками.

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