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

Java Selenium Select Object selectByIndex方法检查索引属性,而不是计数。为什么?,java,select,selenium,Java,Select,Selenium,免责声明:我是StackOverflow的新手,至少在问我自己的问题方面是这样,所以如果这个问题有任何错误或“坏习惯”,请给我一些建议 最近在工作中,我有理由使用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()方法根据标记返回选择器可用的选项列表,因此它应该是准确的,考虑到我已经使用相同的方法列出了索引搜索组合,并且这些组合是准确的,我相当确定它是准确的

所以,现在我扩展了这个类并重载了这个方法,使它直接指向相应的索引,因为我需要检查大量的搜索组合,任何速度的提高都是有价值的。重载代码似乎并没有出现任何问题,而且一切似乎都是准确的,所以我想知道为什么这个方法是这样写的?有谁能启发我吗

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

我相信这样做是为了克服在Select下拉标签中使用或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>

没有一个
PortMaster 3和ComOS 3.7.1
PortMaster 3和ComOS 3.7
PortMaster 3和ComOS 3.5
PortMaster 2和ComOS 3.7
PortMaster 2和ComOS 3.5
采用ComOS 3.7R的内部收益率
采用ComOS 3.5R的内部收益率
在这个Select标记中,仅仅计算索引并查找元素是不够的,因为它可能返回多个索引并给出错误/异常

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

在您的情况下,最好重载该方法并按索引进行操作,因为selectByIndex对于大量的选项标记肯定会变慢

编辑:

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


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

不要担心您的免责声明;你的问题很好!还有,很有趣。我不知道答案,但是你最好问一下你能不能用嵌套选项运行你的重载代码,看看它是否工作正常。你有没有测试过它。你确定我试过这个,而且它使用op的方法工作正常吗asked@Madhan你试过什么好用的?Op询问为什么该方法可能是在本周编写的way@Madhan我想你可能误解了马努的回答。我重载了上面编写的方法,以便直接转到指定的索引,因为Selenium Select类中的方法是以一种对于大量选项来说速度较慢的方式编写的。我在问为什么代码会这样写。马努的回答指出了可能的原因。@Madhan我觉得这确实是一个很好的理由。getOptions返回web元素的列表,但这些web元素的列表位置可能与基于嵌套的索引属性不对应。这是为什么这个方法可能是这样写的一个似是而非的原因。坦白地说,我认为这是我的错,因为我的问题可能过于宽泛,我主要是想满足我的好奇心,而这个答案确实如此。@ReidPalmquist感谢你接受了这个答案。实际上,为什么要选择index属性,只有代码贡献者才能回答这个问题(实际上,可能有多种原因,以及他们可能想到的其他替代解决方案)。但是,我回答了为什么直接获取索引和查找元素没有实现的问题。