Способы работы с #document в iframe

Для портала, который я сейчас тестирую, я столкнулся с проблемой, что не мог создать локаторы 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 ответа

Решение

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

Согласно документации в разделе Использование встроенных фреймов, встроенный фрейм - это конструкция, которая встраивает документ в 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> тегов там не было. Таким образом, контент имеет значение, несмотря на то, что некоторые браузеры его игнорируют.

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

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


Что-то умнее

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

  • Переключиться через имя кадра (образец кода Java):

    new WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.name("frame_name")));
    

Ссылка

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


ТЛ; доктор

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

Работать с элементами внутри iframe Вы должны переключиться на этот конкретный iframe,

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

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