Selenium Webdriver - 如何使用java在表中(在for循环中)应用显式等待

时间:2018-01-11 14:31:08

标签: java html selenium xpath selenium-webdriver

从表中每行收集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]

2 个答案:

答案 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]"));