Selenium Select Object selectByIndex方法检查索引属性而不是计数.为什么?

Rei*_*ist 5 java selenium select

免责声明:我是StackOverflow的新手,至少在询问我自己的问题方面,所以如果有任何错误或"不良做法",请给我一些指示.

最近在工作中我有理由使用Selenium,并且对这个工具不熟悉,曾经有几次当我为什么某种方式做某事时,我已经开始摸不着头脑了.通常原因后来会变得明显,但在这种情况下不会.

目前我正在编写一些浏览器自动化,其中涉及索引搜索组合,并注意在与我正在为之工作的公司相关的各个站点上显示该组合的结果数量.

对于大多数这些网站,搜索通常会通过我通过Selenium的Select对象处理的关键字和下拉菜单来定义.具体来说,我一直在使用selectByIndex方法来迭代各种组合.

我注意到的一件事是,使用这种方法,我得到的选项列表越远,方法花费的时间越长.当我打开声明时,我发现的代码如下:

  /**
   * Select the option at the given index. This is done by examing the "index" attribute of an
   * element, and not merely by counting.
   * 
   * @param index The option at this index will be selected
   */
  public void selectByIndex(int index) {
    String match = String.valueOf(index);

    boolean matched = false;
    for (WebElement option : getOptions()) {
      if (match.equals(option.getAttribute("index"))) {
        setSelected(option);
        if (!isMultiple()) {
          return;
        }
        matched = true;
      }
    }
    if (!matched) {
      throw new NoSuchElementException("Cannot locate option with index: " + index);
    }
  }
Run Code Online (Sandbox Code Playgroud)

令我困惑的是为什么编写这段代码以便检查'index'属性.据我所知,getOptions()方法返回一个基于标签的选择器可用选项列表,所以它应该是准确的,并考虑到我一直在使用相同的方法列出索引的搜索组合,那些已经准确,我很确定.

所以,现在我已经扩展了类并重载了方法,直接将它直接指向相应的索引,因为我确实需要检查一些非常微不足道的搜索组合,并且速度的任何提高都是有价值的.似乎没有任何问题与重载代码一起出现,一切似乎都准确,所以我想知道为什么这种方法是用这种方式编写的?谁能开导我?

Man*_*anu 1

选择给定索引处的选项。这是通过检查元素的“索引”属性来完成的,而不仅仅是通过计数。

我相信这样做是为了克服“选择下拉列表”标签中嵌套选项或 OPTGROUP的可能性。考虑下面的 Select 标签:

<SELECT name="ComOS">
  <OPTION selected label="none" value="none">None</OPTION>
  <OPTGROUP label="PortMaster 3">
    <OPTION label="3.7.1" value="pm3_3.7.1">PortMaster 3 with ComOS 3.7.1</OPTION>
    <OPTION label="3.7" value="pm3_3.7">PortMaster 3 with ComOS 3.7</OPTION>
    <OPTION label="3.5" value="pm3_3.5">PortMaster 3 with ComOS 3.5</OPTION>
  </OPTGROUP>
  <OPTGROUP label="PortMaster 2">
    <OPTION label="3.7" value="pm2_3.7">PortMaster 2 with ComOS 3.7</OPTION>
    <OPTION label="3.5" value="pm2_3.5">PortMaster 2 with ComOS 3.5</OPTION>
  </OPTGROUP>
  <OPTGROUP label="IRX">
    <OPTION label="3.7R" value="IRX_3.7R">IRX with ComOS 3.7R</OPTION>
    <OPTION label="3.5R" value="IRX_3.5R">IRX with ComOS 3.5R</OPTION>
  </OPTGROUP>
</SELECT>
Run Code Online (Sandbox Code Playgroud)

在此 Select 标记中,仅计算索引并查找元素是不够的,因为它可能会返回多个索引并给出错误/异常。

此外,如果发现多个选项标签,也应该通知它。因此,“可能”这可能是在实际返回元素之前检查“index”属性的原因。

在您的情况下,最好重载该方法并按索引进行选择,因为对于大量选项标签, selectByIndex 必然会变慢。

编辑:

阅读评论后进行编辑。该语句for (WebElement option : getOptions())实际上正在减慢代码(问题主要集中在提高速度)。因此,是否通过检查索引属性或其他方式来完成解决方案并不重要,因为这不是速度慢的原因。

此外,检查索引属性对于嵌套选项很有帮助,因为它将选项索引为 Select 的子项,而不仅仅是作为 Select 的直接子项。