从表中每行收集td [3]值,下面是我的java源代码
WebElement biboSection = driver.findElement(By.xpath("//*@id='Label1']/div/table[2]/tbody"));
List<WebElement>rowsCount = biboSection.findElements(By.tagName("tr"));
for (int k =1;k<=rowsCount.size();k++){
String biblioTable = driver.findElement(By.xpath("//*@id='Label1']/div/table[2]/tbody/tr["+k+"]/td[3]")).getText().trim();
}
问题是,如果行td[3]
标记中的任何一个不可用,那么它会失败,得到以下错误
org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id='Label1']/div/table[2]/tbody/tr[5]/td[3]"}
一般来说 - 单个元素我们可以使用显式等待来避免上述异常,但是如果特定选项卡不可用(即如果tr[5]/td[3]
不可用,那么如何在表中继续其余的行,然后移到下一个设置tr[6]/td[3]
)
答案 0 :(得分:0)
您需要做的是,在获得NoSuchElementException时需要返回一个值。这样做的风险是,你可以得到误报,所以你需要确保你做了一些异常。
你可以做的是,你可以在其他地方使用字符串biblioTable,允许你先检查元素。尝试以下(我在没有IDE的情况下键入此内容,请原谅任何错误等):
var el;
String exception;
for (int k =1;k<=rowsCount.size();k++){
try
{
el = driver.findElement(By.xpath("//*@id='Label1']/div/table[2]/tbody/tr["+k+"]/td[3]"));
return el;
}
catch (NoSuchElementException)
{
exception = "Whatever you want"
return exception;
}
if(exception == "Whatever you want")
{
Console.Writeline.....
}
else{
String biblioTable = el.getText().trim();
}
}
所以你要做的是: 首先,您要创建一个var和一个字符串,您将在try / catch中返回该字符串。然后在try / catch中,您首先要尝试返回webelement el。如果得到NoSuchElementException,则将返回带有值的字符串异常,您将使用该值作为创建字符串biblioTable的条件。如果它被填满,则意味着webelement el不在那里。所以你可以做任何你想做的事情并结束循环。否则,您可以创建字符串biblioTable。
答案 1 :(得分:0)
首先,我认为你在两个地方有一个错字:你的xpath缺少空方括号&#34; [&#34;在&#34; // *&#34;
之后其次,我认为你可以用一个声明来完成你想要的东西:
increaseScoreBy3 () {
this.setState(prevState => ({ score: prevState.score + 1 }));
this.setState(prevState => ({ score: prevState.score + 1 }));
this.setState(prevState => ({ score: prevState.score + 1 }));
}
然后您可以通过以下方式访问文本元素:
List<WebELement> biblioTable = driver.findElements(By.xpath("//*[@id='Label1']/div/table[2]/tbody/tr/td[3]"));