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']")
答案 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)
通过不同的rows
和columns
的迭代看起来像是一个开销。虽然@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");