NOSUCHELEMENTEXCEPTION:无法找到表格内的下拉列表

时间:2017-09-13 13:06:31

标签: selenium select selenium-webdriver drop-down-menu

dropdown在表格内。

这是我的HTML代码:

<div class="table-responsive">
  <table class="table notification-table">
    <thead>
      <tr>
        <th>ITEM</th>
        <th>PRODUCT CODE</th>
        <th>WEIGHT</th>
        <th>AVAIL</th>
        <th>LOT NUMBER</th>
        <th>STORE QTY</th>
        <th>STORAGE LOC</th>
        <th>STORAGE POINT</th>
        <th/>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>Chicken</td>
        <td>AG0000</td>
        <td>2Kg</td>
        <td>5</td>
        <td>57</td>
        <td>5</td>
        <td>
          <div class="styled-select slate quantity">
            <select id="stockLoc_66" class="cursor stockLocationListItem stockSelectItem selected" name="stockLoc_66">
              <option value="">Select One</option>
              <option value="Loc1">Loc1</option>
              <option value="Loc2">Loc2</option>
              <option value="Loc3">Loc3</option>
              <option value="hgfhf">hgfhf</option>
              <option value="123">123</option>
              <option value="Loc 7">Loc 7</option>
            </select>
          </div>
        </td>
        <td>
          <td>
      </tr>
    </tbody>
  </table>
</div>

我在表格中找到并选择下拉列表的selenium代码是:

WebElement allocationtable = driver.findElement(By.xpath(".//table[@class='table notification-table']"));
List<WebElement> rows = allocationtable.findElements(By.tagName("tr"));
for (WebElement eachrow : rows)
{
    List<WebElement> columns = eachrow.findElements(By.tagName("td"));
    for (WebElement eachcolumn : columns)
    {
        String elementtext = "STORAGE LOC";
        String elementtext2 = "STORAGE POINT";
        WebDriverWait wait = new WebDriverWait(driver, 20);
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id='stockLoc_66']")));
        Select storagelocation = new Select(driver.findElement(By.xpath(".//*[@id='stockLoc_66']")));
        ...
    }
}

获得NoSuchElementException
By.xpath(".//*[@id='stockLoc_66']")

4 个答案:

答案 0 :(得分:0)

原因是每个tbody行的第7个单元格只包含select,所以当循环遍历第一个单元格时,其中没有select,所以等待报告NoSuchElement异常。

答案 1 :(得分:0)

尝试使用名称

/bin/bash -c "netstat -nr | grep '^0.0.0.0' | awk '{print $2}'"

或尝试xpath

driver.findElement(By.name("stockLoc_66"));

答案 2 :(得分:0)

有很多缺少的信息可以帮助缩小答案,但对于初学者,您可以简化代码,这可能有助于缩小问题范围。您不需要遍历行和单元格的所有循环来查找SELECT。下面的代码应该可以正常使用元素。

Select stockLocation = new Select(new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.id("stockLoc_66"))));
stockLocation.selectByVisibleText(...);

如果这不起作用。确保它不在iframe中,确保id='stockLoc_66'等元素不超过一个。

仅使用ID查找元素时,请勿使用XPath。没有必要。 CSS选择器和ID比XPath更好地支持和更快。

答案 3 :(得分:0)

通过不同的rowscolumns的迭代看起来像是一个开销。虽然@JeffC的答案看起来非常完美,但我们可能需要覆盖更多的边界条件。 @JeffC在他的答案中使用visibilityOfElementLocated子句作为ExpectedConditions,它将在检查页面的DOM上是否存在元素并且可见时处理期望。

但是我会更加细化并使用elementToBeSelected子句作为ExpectedConditions来处理期望,同时检查是否按如下方式选择给定元素:

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeSelected(By.id("stockLoc_66")));
Select storagelocation = new Select(driver.findElement(By.id("stockLoc_66")));
storagelocation.selectByValue("Loc1");