Java 如何在等待时不失败(预期条件)

Java 如何在等待时不失败(预期条件),java,selenium-webdriver,webdriverwait,Java,Selenium Webdriver,Webdriverwait,我有一个表,它可能根据URL显示,也可能不显示。现在,我的测试将遍历所有给定的URL。我必须单击一个搜索按钮,然后验证表是否存在。 虽然我的桌子清晰可见,但一开始我的桌子坏了。我添加了以下代码来处理该问题: WebDriverWait wait = new WebDriverWait(data.Driver,30); wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("abc"))); Boolean tableVisi

我有一个表,它可能根据URL显示,也可能不显示。现在,我的测试将遍历所有给定的URL。我必须单击一个搜索按钮,然后验证表是否存在。 虽然我的桌子清晰可见,但一开始我的桌子坏了。我添加了以下代码来处理该问题:

WebDriverWait wait = new WebDriverWait(data.Driver,30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("abc")));
Boolean tableVisibility = data.Driver.findElements(By.id("12345abcd")).size() > 0;
if (tableVisibility == true) {
    result.logInfo("table displaying successfully");
}
Boolean isElmPresent =  data.Driver.findElements(By.id("labelMessage")).size() > 0;
if (isPresent == true) {
    this.updateDBTbl(abc,xyz);
}
这个语句帮助我解决了表加载的问题。但现在我遇到了一个问题,就是找不到表。实际上,当找不到表时,我们会得到一个新标签,上面提到“我们需要联系系统台”,我需要在数据库中报告。但对于wait.until语句,当它在30秒后没有看到表时,它会出错并停止执行。因此,标签永远不会得到验证。现在我已经注释掉了wait.until语句,而是添加了Thread.Sleep,解决了这个问题,但我根本不喜欢硬等待。所以我想知道是否有更好的方法来处理这个问题。

试试这个:

try{
 wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("abc")));
 Boolean tableVisibility = data.Driver.findElements(By.id("12345abcd")).size() > 0;
                if (tableVisibility==true) {
                    result.logInfo("table displaying successfully");
                }
Boolean isElmPresent=  data.Driver.findElements(By.id("labelMessage")).size() > 0;
                if (isPresent == true) {
                    this.updateDBTbl(abc,xyz);
                }
}catch(ElementNotVisibleException e){
    e.printStackTrace();
}

这将解决您的问题。

您的逻辑流程需要稍微调整。您需要:

  • 等待桌子出现
  • 如果存在,则记录成功
  • 如果不存在,则记录故障和日志标签消息

  • 以下是您可以尝试的解决方案: 1.检查元素是否可见如果它可见请对其执行操作,如果不可见,则对另一个元素执行操作,如果缺少表,则应显示该元素 2.将忽略异常添加到等待中
    3.在try/catch块中换行以处理缺少表的情况

    捕获异常并将表可见性设置为false。您还可以执行以下操作:webelements=wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.id(“12345abcd”);然后检查尺寸。。。试着抓住整件事。和/或为“tableNotFoundInTime”创建另一个bool?这可能会使开发人员加快速度。请澄清您的代码。。。添加一些注释以指示每个定位器要查找的内容。例如,
    By.id(“abc”)
    finding是什么?那是桌子吗?什么是.id(“12345abcd”)查找?那张桌子是一排吗?我假设的最后一个是联系系统台的标签?我想它会引发超时。。。也许只是捕捉“异常”而已?。。。findElements不会抛出。问题表明,他正在尝试处理表丢失的情况,而不是找到消息。如果在代码中找不到该表,则不会收集和存储该消息。我认为只有当元素存在但其宽度/高度为0时才会引发“ElementNotVisibleException”。。。如果它超时,就不会被抓到。。。但看起来你还是需要检查一下捕获物上的标签。。。至少如果我理解正确的话。
    // not sure what this does
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("abc")));
    
    // is table present?
    try
    {
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("12345abcd")));
        result.logInfo("table displaying successfully");
    }
    catch (TimeoutException e)
    {
        // table is not present
        result.logInfo("table NOT displaying successfully");
    
        // report contact system desk message
        if (data.Driver.findElements(By.id("labelMessage")).size() > 0)
        {
            this.updateDBTbl(abc,xyz);
        }
    }