Selenium переключение между вкладками

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

Он работал только иногда, но иногда он показывает исключение. Может ли кто-нибудь предложить мне какие-либо другие инструкции для переключения вкладок в одном окне с помощью java.

Здесь вы должны использовать функцию дескриптора окна. Вот пример рабочего кода в java:

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

Переключение между окнами браузера отличается от переключения вкладок b/w.

В некоторых случаях команда обработчика окна браузера может работать, но она не будет работать во всех браузерах.

Вот решение для навигации по вкладкам b/w

для навигации слева направо:

Для навигации справа налево:

В моем случае следующий код работает нормально —

мы разработали расширение Chrome, и я хочу проверить наше расширение с селеном. Я создал тест, но проблема в том, что наше расширение открывает новую вкладку, когда оно установлено, и я думаю, что получаю исключение из другой вкладки. Можно ли переключиться на активную вкладку, которую я тестирую? Или другой вариант-начать с отключенного расширения, затем войти на наш сайт и только затем включить расширение. Возможно ли это? Вот мой код:

испытание терпит неудачу с ElementNotVisibleException: Message: element not visible , потому что в новой вкладке (открыть расширением) "вход" не видно (я думаю, что новая вкладка открывается только после команды self.driver.get(url=’http://example.com/logout’) ).

обновление: я узнал, что исключение не связано с дополнительной вкладкой, это с нашего сайта. Но я закрыл дополнительную вкладку с этим кодом, согласно ответу @aberna:

после закрытия дополнительной вкладки я вижу свою вкладку в видео.

3 ответов

некоторые возможные подходы:

1 — переключение между вкладками с помощью send_keys (CONTROL + TAB)

2 — переключение между вкладками с помощью using ActionsChains (CONTROL+TAB)

Читайте также:  Asus p5kpl драйвер звук

3 — другой подход может использовать методы Selenium для проверки текущего окна и перехода к другому:

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

это действительно сработало для меня в 3.x:

добавляются дескрипторы окон, поэтому выбирается вторая вкладка в списке

чтобы продолжить первую вкладку:

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

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

на window_handles массив содержит handles открыть tabs , используйте его в качестве аргумента в switch_to_window() для переключения между вкладками.

Для переключения между окнами браузера в Selenium WebDriver используется метод switchTo , также как и при работе с алертами или фреймами. Только для окон нет родительского окна, в которое можно было бы переключиться по умолчанию. Для переключения всегда используется дескриптор окна, поэтому для того, чтобы переключиться в первоначально открытое окно, нужно сначала запомнить его дескриптор.

driver.switchTo().window(windowHandler) — переключает фокус для будущих команд драйвера в окно с заданным дескриптором.

Для получения дескриптора окна используется метод getWindowHandle() . Он возвращает дескриптор текущего открытого окна, который уникально идентифицирует окно для этого экземпляра драйвера.

Метод getWindowHandles() возвращает набор дескрипторов окон, которые можно использовать для перебора всех открытых окон для данного экземпляра webdriver .

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

Иногда открытие новых окон происходит не сразу. Для того, чтобы дождаться открытия окна достаточно перенести описанную выше логику в WebDriverWait:

Про корректное закрытие окон можно почитать в этой статье.

5 комментариев

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

Читайте также:  Display none не работает

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

+ в отдельной статье было бы полезно расписать как этот метод (а так же другие, которые часто используются) вывести в родительский класс чтобы было легко им пользоваться.
Например если вся эта ожидающая конструкция будет возвращать WebElement b вызываться одной строчкой кода из род. класса будет очень удобно обнаруживать элемент, заодно его дождавшись (например разные выпадающие медленные списки и т.д.)
достаточно писать waitFor(By.id(«some-id»)).click(); и все. Одной строкой мы дождались элемент с айдишником и кликнули на него. А еще можно в созданный нами waitFor метод добавить if который будет в случае null ( если не дождалось или не нашло) делать fail() для теста вместо обычной java ошибки, да еще и текст ошибки выводить.. короче накрутить в этот хелпер можно много!

Что касается получения нового окна и использования removeAll, то сейчас и остается только новое окно с помощью удаления совпадающих элементов в сетах, как Вы и написали. Если разбор кода вызывает затруднения, пишите, постараюсь прокомментировать.
Статья про ожидания уже существует — здесь.
Создание хелперов — личное дело каждого и достаточно объемная тема. Да и потом, не всегда нужно их создавать, можно, например, использовать Thucydides.

Добрый день. Очень обрадовался тому, что нашел вашу статью, но пока не могу понять причину ошибки компиляции.
Компилятор ругается что не находит реализацию функции apply(f), хотя я просто скопировал код из статьи.

String newWindow = (new WebDriverWait(driver, 10))
.until(new ExpectedCondition() <
public String apply(WebDriver driver) <
Set newWindowsSet = driver.getWindowHandles();
newWindowsSet.removeAll(oldWindowsSet);
return newWindowsSet.size() > 0 ?
newWindowsSet.iterator().next() : null;
>
>
);

Читайте также:  Bat удаление из реестра

В режиме редактирования кода подчеркнут конструктор ExpectedCondition в строке
.until(new ExpectedCondition() <

Сам я в Java не настолько силен чтобы понять в чем дело. Не могли бы вы уточнить в чем может быть причина?

При компиляции ошибка:
is not abstract and does not override abstract method apply(java.lang.Object) in com.google.common.base.Function
incompatible types
found : java.lang.Object
required: java.lang.String

Добрый день, действительно присутствует ошибка — редактор кода съел при форматировании.
Должно быть так:

Исправила в примерах. Большое спасибо, что обратили внимание.

Добрый день, а возможно ли запретить открывать новые окна в selenium ?

Тестирую сайт на котором присутствует реклама, при клике открывается пару новых окон, что дико не удобно, можно ли запретить новые окна или только вариант добавить ad block ?

Rate this post

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *