Блог вебразработчика
  • ГЛАВНАЯ
  • ПОДПИСКА

Selenium WebDriver работа с окнами

Авг01
2012
Написал Tatyana

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

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

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

String windowHandler = driver.getWindowHandle();

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

Set<String> windowHandlers = driver.getWindowHandles();

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

// получаем набор дескрипторов текущих открытых окон
Set<String> oldWindowsSet = driver.getWindowHandles();

// нажимаем на ссылку, которая открывает документ в новом окне
driver.findElement(By.tagName("a")).click();

// здесь нужно будет дождаться открытия нового окна

// получаем новый набор дескрипторов, включающий уже и новое окно
Set<String> newWindowsSet = driver.getWindowHandles();

// получаем дескриптор нового окна
newWindowsSet.removeAll(oldWindowsSet);
String newWindowHandle = newWindowsSet.iterator().next();

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

// получаем набор дескрипторов текущих открытых окон
Set<String> oldWindowsSet = driver.getWindowHandles();

// нажимаем на ссылку, которая открывает документ в новом окне
driver.findElement(By.tagName("a")).click();

// ожидаем открытия и получаем дескриптор нового окна
String newWindowHandle = (new WebDriverWait(driver, 10))
    	.until(new ExpectedCondition<String>() {
    	    public String apply(WebDriver driver) {
    	        Set<String> newWindowsSet = driver.getWindowHandles();
    		newWindowsSet.removeAll(oldWindowsSet);
    		return newWindowsSet.size() > 0 ? 
                         newWindowsSet.iterator().next() : null;
            }
        }
);

Пример:

import java.util.Set;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class SwitchToWindowExample {
	public WebDriver driver;

    @Before
    public void setUp() throws Exception {
    	driver = new FirefoxDriver();
    }

    @Test
    public void someSimpleTest() {
        driver.get("http://internetka.in.ua");

        String originalWindow = driver.getWindowHandle();
        final Set<String> oldWindowsSet = driver.getWindowHandles();

        driver.findElement(By.tagName("a")).click();

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

        driver.switchTo().window(newWindow);

        System.out.println("New window title: " + driver.getTitle());
        driver.close();

        driver.switchTo().window(originalWindow);
        System.out.println("Old window title: " + driver.getTitle());

    }

    @After
    public void tearDown() throws Exception {
        driver.quit();
    }
}

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

  • Нравится
  • Tweet

Опубликовано в Selenium - Помечено Selenium WebDriver, switchTo, WebDriverWait
Рассказать всем Twitter Facebook Delicious StumbleUpon E-Mail
← Selenium Driver — открыть документ в новом окне
Selenium Server: запуск браузера на удаленной машине →

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

  1. Кирилл's Gravatar Кирилл
    07.08.2012 at 16:57 | Permalink

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

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

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

    • Tatyana's Gravatar Tatyana
      08.08.2012 at 06:44 | Permalink

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

  2. Leonid's Gravatar Leonid
    14.08.2012 at 07:28 | Permalink

    Добрый день. Очень обрадовался тому, что нашел вашу статью, но пока не могу понять причину ошибки компиляции.
    Компилятор ругается что не находит реализацию функции 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;
    }
    }
    );

    В режиме редактирования кода подчеркнут конструктор 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

    • Tatyana's Gravatar Tatyana
      14.08.2012 at 08:19 | Permalink

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

      String newWindowHandle = (new WebDriverWait(driver, 10))
      	    	        .until(new ExpectedCondition<String>() {
      

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

  1. Selenium Driver — открыть документ в новом окне — Блог вебразработчика on 01.08.2012 at 10:03

Свежие записи

  • WebDriver и SSL Untrusted certificate
  • Видеозапись выполнения тестов Selenium
  • Selenium WebDriver: basic авторизация
  • BrowserMob Proxy + Selenium: автоматизация сбора данных о производительности
  • Hibernate 4: UserType пользовательский тип данных (часть 2)

Поиск

Рубрики

  • Hibernate ORM
  • SEO
  • Разное
  • Тестирование
    • JUnit
    • Selenium
    • Thucydides

Метки

Actions AJAX Alert AutoIt ChromeDriver Exceptions ExpectedConditions FindElement FirefoxDriver Hibernate InternetExplorerDriver Java Javascript Jenkins JUnit4 Maven PageFactory Page Object RemoteWebDriver Select Selenium IDE Selenium Server Selenium WebDriver switchTo Thucydides WebDriverWait XPath Автоматизированное тестирование база данных заработок в сети сеть Интернет скорость продвижения сайта статейное продвижение услуги продвижения

Реклама

продвижение сайтов какая стоимость раскрутки в компании optimize.kiev.ua харьков;купить сборные дома в украине модульные дома под ключ unitfab.com префаб дома

Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.

Блог вебразработчика
Функциональное тестирование и продвижение сайтов

Яндекс.Метрика