【问题标题】:Why getWindowHandles() in webdriver with java returns Set<> instead of ArrayList<>?为什么使用 java 的 webdriver 中的 getWindowHandles() 返回 Set<> 而不是 ArrayList<>?
【发布时间】:2020-02-19 17:38:26
【问题描述】:

driver.getWindowHandles() 返回集合 所以,如果我们想按索引选择窗口,我们必须将 Set 包装到 ArrayList 中:

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

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

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

选择Set here的目的是什么?

【问题讨论】:

  • 它不只是返回标签;它也可以转动其他顶级窗口。它们应该按什么顺序排列?
  • @VGR 你的意思是,我可以用driver.getWindowHandles( 和标签来引用打开的浏览器窗口吗?
  • 是的,没错。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    窗口句柄

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

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


    背景

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

    List&lt;E&gt;:

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

    Set&lt;E&gt;:

    不包含重复元素的集合。更正式地说,集合不包含一对元素 e1 和 e2 使得 e1.equals(e2),并且最多包含一个空元素。正如其名称所暗示的那样,此接口对数学集抽象进行建模。


    结论

    因此考虑到上述定义,在存在多个窗口句柄的情况下,最好的方法是使用 Set&lt;&gt;


    参考

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

    【讨论】:

      【解决方案3】:

      一条评论 - 考虑到 Set 的顺序不是固定的,所以它会按照上面的用法返回一个随机窗口。

      【讨论】:

      • 我理解,但我关心的是类型,而不是实际使用此代码
      猜你喜欢
      • 2018-02-07
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 2017-01-26
      相关资源
      最近更新 更多