Лучший способ отслеживать и перебирать вкладки и окна с помощью WindowHandles с помощью Selenium
Мы работаем с веб-драйвером Selenium для создания тестов пользовательского интерфейса для Internet Explorer 11. В протестированном веб-приложении появляется несколько экранов. В нескольких тестах мы получили три окна браузера, а также три Driver.WindowHandles. Чтобы переключиться с одного WindowHandle на другой, мы ожидали, что Driver.WindowHandles будет отсортирован, как сначала самые старые окна, так и последние новейшие окна. Но это не так: это совершенно случайно!
Поскольку дескриптор окна - это GUID, мы закончили тем, что создали словарь с GUID WindowHandle в качестве ключа со значением типа страницы, который загружен в окно браузера. Но это также приводит к поддержанию словаря при закрытии окна, например.
Похоже, что для такого простого дела требуется много работы. Есть ли лучшее решение для этого?
1 ответ
Вы совершенно правы, когда говорите:
WindowHandles would be sorted like the oldest windows first and the newest windows last. But this is not the case: It is totaly random!
В обсуждении Саймон четко упомянул, что:
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