Лучший способ отслеживать и перебирать вкладки и окна с помощью WindowHandles с использованием Selenium

Мы работаем с веб-драйвером Selenium, чтобы провести тесты пользовательского интерфейса для Internet Explorer 11. В протестированном веб-приложении появляется несколько всплывающих экранов. В нескольких тестах мы получили три окна браузера, а также три Driver.WindowHandles. Чтобы переключиться с одного WindowHandle на другой, мы ожидали, что Driver.WindowHandles будет отсортирован так, что самые старые окна будут первыми, а самые новые окна последними. Но это не так: это совершенно случайно!

Поскольку дескриптор окна — это идентификатор GUID, мы создали словарь с идентификатором GUID WindowHandle в качестве ключа со значением типа страницы, загружаемой в окне браузера. Но это также приводит к сохранению словаря, например, при закрытии окна.

Кажется, что для такого простого дела требуется много работы. Есть ли лучшее решение для этого?


person Koen Meijer    schedule 16.09.2017    source источник
comment
Я не очень хорошо знаком с С#, но могу построить ответ через Java. Будет ли это соответствовать вашему вопросу?   -  person DebanjanB    schedule 18.09.2017
comment
Да, без проблем.   -  person Koen Meijer    schedule 18.09.2017


Ответы (1)


Вы совершенно правы, когда говорите:

WindowHandles будут отсортированы так, что самые старые окна будут первыми, а самые новые окна последними. Но это не так: это совершенно случайно!

В обсуждении Саймон ясно упомянул, что:

While the datatype used for storing the list of handles may be ordered by insertion, the order in which the WebDriver implementation iterates over the window handles to insert them has no requirement to be stable. The ordering is arbitrary.

Итак, мы будем вызывать WebDriverWait, а затем собирать дескрипторы окна каждый раз, когда мы открываем новую вкладку/окно, и, наконец, перебирать дескрипторы окна и switchTo().window(newly_opened) по мере необходимости:

При необходимости измените Test Environment [Моя конфигурация - Selenium: 3.5.3, IEDriverServer: 3.5.0.0 (64-разрядная версия), IE: v10.0< /сильный>]

Джава:

package demo;

import java.util.Iterator;
import java.util.Set;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class NEW_TAB_Handling {

    public static void main(String[] args)  {


        System.setProperty("webdriver.ie.driver", "C:\\Utility\\BrowserDrivers\\IEDriverServer.exe");
        WebDriver driver =  new InternetExplorerDriver();
        driver.get("http://www.google.com");
        String first_tab = driver.getWindowHandle();
        System.out.println("Working on Google");
        ((JavascriptExecutor) driver).executeScript("window.open('http://facebook.com/');");
        WebDriverWait wait = new WebDriverWait(driver,5);
        wait.until(ExpectedConditions.numberOfWindowsToBe(2));
        Set<String> s1 = driver.getWindowHandles();
        Iterator<String> i1 = s1.iterator();
        while(i1.hasNext())
        {
            String next_tab = i1.next();
            if (!first_tab.equalsIgnoreCase(next_tab))
            {
                driver.switchTo().window(next_tab);

                System.out.println("Working on Facebook");
            }
        }
        String second_tab = driver.getWindowHandle();
        ((JavascriptExecutor) driver).executeScript("window.open('http://youtube.com/');");
        wait.until(ExpectedConditions.numberOfWindowsToBe(3));
        Set<String> s2 = driver.getWindowHandles();
        Iterator<String> i2 = s2.iterator();
        while(i2.hasNext())
        {
            String next_tab = i2.next();
            if (!first_tab.equalsIgnoreCase(next_tab) && !second_tab.equalsIgnoreCase(next_tab))
            {
                driver.switchTo().window(next_tab);
                System.out.println("Working on Youtube");
            }
        }
        driver.quit();
        System.out.println("Quit the WebDriver instance");
    }
}

Выход консоли:

Working on Google
Working on Facebook
Working on Youtube
Quit the WebDriver instance

Outro

Вы можете найти обсуждение на основе python в Открыть Интернет в новой вкладке Selenium + Python

person DebanjanB    schedule 21.09.2017
comment
Спасибо за ваш ответ. Но как это работает, когда есть третье или четвертое окно? - person Koen Meijer; 21.09.2017
comment
Привет Дебанджан, мой первоначальный вопрос был о 3 дескрипторах окон. Поэтому я не могу принять ваш ответ как ответ. Я понимаю, что вы можете переключаться между двумя дескрипторами окна, но сложнее всего, когда дескрипторов больше двух. - person Koen Meijer; 21.09.2017
comment
@KoenMeijer Обновил мой ответ на How to handle 3 windowhandles. Дайте мне знать, если это ответит на ваш вопрос. - person DebanjanB; 22.09.2017
comment
Спасибо, Дебанджан, так что вам также нужно отслеживать все WindowHandles в объекте. И когда вы закрываете окно, вы также должны удалить winodwhandle. Вот мне кажется много работы для такого простого дела. Нет ли другого решения этой проблемы? - person Koen Meijer; 23.09.2017