为什么带有Java的webdriver中的getWindowHandles()返回Set <>而不是ArrayList <>?

时间:2019-10-23 12:59:12

标签: java selenium selenium-webdriver webdriver window-handles

driver.getWindowHandles()返回Set 因此,如果要按索引选择窗口,则必须将Set包装到ArrayList中:

var tabsList = new ArrayList<>(driver.getWindowHandles());
var nextTab = tabsList.get(1);
driver.switchTo().window(nextTab);

在python中,我们可以立即通过索引访问Windows:

next_window = browser.window_handles[1]
driver.switch_to.window(next_window)

选择此处设置的目的是什么?

3 个答案:

答案 0 :(得分:2)

窗口句柄

在讨论中,关于 Simon(WebDriver的创建者)明确提到:

  

虽然用于存储句柄列表的数据类型可以通过插入来排序,但是WebDriver实现在窗口句柄上迭代以插入它们的顺序并不要求稳定。顺序是任意的。


背景

在讨论What is the difference between Set and List?中,@ AndrewHare解释了:

List<E>:

  

有序集合(也称为序列)。该界面的用户可以精确控制列表中每个元素的插入位置。用户可以通过其整数索引(列表中的位置)访问元素,并在列表中搜索元素。

Set<E>:

  

不包含重复元素的集合。更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)最多包含一个空元素。顾名思义,此接口可对数学集抽象进行建模。


结论

因此,考虑到以上定义,在存在多个窗口句柄的情况下,最好的方法是使用 Set<>


参考

您可以在以下位置找到几个可用的示例:

答案 1 :(得分:1)

因为集不施加顺序, * 很重要,因为没有保证返回的窗口句柄的顺序。这是因为窗口句柄不仅代表选项卡,而且还代表其他浏览器窗口中的选项卡。没有可靠的整体定义可以跨平台和浏览器使用的总体顺序,因此列表(强加顺序)没有多大意义。

*从技术上讲,SortedSet是Set的子类型,它确实施加了顺序,但是Set的常规合同不需要任何顺序。

答案 2 :(得分:0)

一个注释-考虑到Set的顺序是固定的,因此它会根据上述用法返回一个随机窗口。