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

时间:2015-07-02 18:44:56

标签: java select selenium

免责声明:我是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);
    }
  }

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

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

1 个答案:

答案 0 :(得分:1)

  

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

我相信这样做是为了克服Select Dropdown标签中Nested Options或OPTGROUP的可能性。请考虑以下选择标记:

<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>

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

此外,如果找到多个选项标签,也应该通知它。因此,可能&#39;这可能是检查&#34;指数&#34;实际返回元素之前的属性。

在你的情况下,最好重载方法并按索引进行操作,因为selectByIndex对大量选项标记的约束速度很快。

编辑:

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

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