我们在driver.getWindowhandles()中获得的Set是否保留顺序

时间:2017-09-02 13:21:00

标签: selenium selenium-webdriver

我对在selenium中返回窗口句柄的设置是否保留打开窗口的顺序感到困惑,我的意思是第一个窗口将位于第一个位置,下一个窗口将打开下一个位置,依此类推。

这是代码:

Set<String> handles = driver.getWindowhandles()

3 个答案:

答案 0 :(得分:0)

Set只是interface。为了保留顺序,您必须使用该接口和子接口SortedSet的特定实现,

答案 1 :(得分:0)

这取决于您使用的驱动程序。有些人保留了订单,有些人则没有。 WebDriver protocol表示订单是任意的:

  

Get Window Handles命令返回一个窗口句柄列表   每个开放的顶级浏览上下文。窗口的顺序   返回的句柄是任意的。

这可能是为什么所有句柄都放在Set中以防止您通过索引访问句柄的原因。

如果你只有2个窗口,那么只需切换到不是当前窗口的窗口:

Set<String> handles = driver.getWindowHandles();
handles.remove(driver.getWindowHandle());
driver.switchTo().window(handles.iterator().next());

但是如果你有两个以上的窗口,那么跟踪每个新窗口或迭代每个窗口,直到你得到预期的窗口:

Set<String> handles = driver.getWindowHandles();
handles.remove(driver.getWindowHandle());

for (String hwnd : handles) {
    driver.switchTo().window(hwnd);

    if (driver.getCurrentUrl().contains(...)) {
        ...
    }
}

答案 2 :(得分:0)

首先让我们看看对getWindowhandles()方法的调用。

getWindowhandles

很明显,getWindowhandles()方法返回Set类型String,所以当我们提到时,我们几乎是正确的:

Set<String> handles = driver.getWindowhandles();

现在,我会将我的答案限制在Mozilla Firefox,因为它遵循与W3C Specs内联的明确规范。

WebDriver W3C Specification明确提到以下内容:

  

<强> The Get Window Handles command returns a list of window handles for every open top-level browsing context. The order in which the window handles are returned is arbitrary.

关于窗口句柄 WebDriver W3C Specification也清楚地说:

  

<强> Each browsing context has an associated window handle which uniquely identifies it. This must be a String and must not be "current"

     

<强> The web window identifier is the string constant "window-fcc6-11e5-b4f8-330a88ab9d7f"

因此,我们可以得出结论,订单不会被保留。

解决方案:

在这种情况下,如果我们需要将Selenium的焦点从第一个窗口转移到第二个窗口,然后转移到第三个窗口然后遍历,我们可以实现一个逻辑来保留Set中的所有窗口句柄只需在调用window handle之前比较driver.switchTo().window(win_handle);值,如下所示:

String parent_window = driver.getWindowHandle();
System.out.println("Parent Window ID is : "+parent_window);
element2.click();   // WebElement which opens a new window
Set<String> allWindows = driver.getWindowHandles();
for(String child_1:allWindows)
    if(!parent_window.equalsIgnoreCase(child_1))
        driver.switchTo().window(child_1);
System.out.println(driver.getTitle());
String child1_window = driver.getWindowHandle();
System.out.println("Child 1 Window ID is : "+child1_window);
driver.findElement(By.linkText("Link")).click();    //Link which opens a new window
Set<String> all_Windows = driver.getWindowHandles();
for(String child_2:all_Windows)
    if(!parent_window.equalsIgnoreCase(child_2) && !child1_window.equalsIgnoreCase(child_2))
        driver.switchTo().window(child_2);
String child2_window = driver.getWindowHandle();
System.out.println("Child 2 Window ID is : "+child2_window);