【问题标题】:Selenium Webdriver - how to apply explicit wait in table (in the for loop) using javaSelenium Webdriver - 如何使用java在表中(在for循环中)应用显式等待
【发布时间】:2023-03-04 21:06:01
【问题描述】:

从表中每一行收集 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] 不可用,则移至下一组@ 987654325@)

【问题讨论】:

    标签: java html selenium xpath selenium-webdriver


    【解决方案1】:

    你需要做的是,当你得到一个 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。

    【讨论】:

      【解决方案2】:

      首先,我认为您在两个地方有错字:您的 xpath 在“//*”之后缺少左方括号“[”

      其次,我认为你可以通过一个声明来完成你想要的:

      List<WebELement> biblioTable = driver.findElements(By.xpath("//*[@id='Label1']/div/table[2]/tbody/tr/td[3]"));
      

      然后您可以通过以下方式访问文本元素:

      for (WebElement text : biblioTable)
          String name = text.getText();
      

      【讨论】:

        猜你喜欢
        • 2021-01-19
        • 2012-05-11
        • 1970-01-01
        • 2013-12-31
        • 2018-01-24
        • 1970-01-01
        • 2015-10-09
        相关资源
        最近更新 更多