Способы работы с #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
оберток.