Java 如何在等待时不失败(预期条件)
我有一个表,它可能根据URL显示,也可能不显示。现在,我的测试将遍历所有给定的URL。我必须单击一个搜索按钮,然后验证表是否存在。 虽然我的桌子清晰可见,但一开始我的桌子坏了。我添加了以下代码来处理该问题: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
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);
}
}