为什么 webdriver 中的 getWindowHandles() 使用 java returns Set<> 而不是 ArrayList<>?

Why getWindowHandles() in webdriver with java returns Set<> instead of ArrayList<>?

driver.getWindowHandles() returns 设置 所以,如果我们想通过索引选择 window,我们必须将 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)

这里选择设置的目的是什么?

一个评论 - 考虑到 Set 的顺序是不固定的,所以它会 return 你随机 window 按照上面的用法。

Window 手柄

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

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.


背景

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

List<E>:

An ordered collection (also known as a sequence). The user of this interface has precise control over where in the list each element is inserted. The user can access elements by their integer index (position in the list) and search for elements in the list.

Set<E>:

A collection that contains no duplicate elements. More formally, sets contain no pair of elements e1 and e2 such that e1.equals(e2), and at most one null element. As implied by its name, this interface models the mathematical set abstraction.


结论

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


参考资料

您可以在以下位置找到几个工作示例:

因为 Sets 不强加顺序,* 这很重要,因为无法保证返回的 window 句柄的顺序。这是因为 window 句柄不仅代表选项卡,而且代表其他浏览器中的选项卡 windows。对于跨平台和浏览器的整体顺序没有可靠的定义,因此列表(强加顺序)没有多大意义。

* 从技术上讲,SortedSet 是 Set 的子类型,它确实有顺序,但 Set 的一般契约不需要任何顺序。