我对在selenium中返回窗口句柄的设置是否保留打开窗口的顺序感到困惑,我的意思是第一个窗口将位于第一个位置,下一个窗口将打开下一个位置,依此类推。
这是代码:
Set<String> handles = driver.getWindowhandles()
答案 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()
方法返回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);