下面的WebElement在WebPage中不存在。但是我想了解Fluent等。
当webdriver尝试识别BE_flight_flseah_btn
时,它应该根据代码等待最多5分钟,但它会在几秒钟内抛出错误,说没有这样的元素。
Wait<WebDriver> w=new FluentWait<WebDriver>(dr)
.withTimeout(5,TimeUnit.MINUTES)
.pollingEvery(5,TimeUnit.MILLISECONDS)
.ignoring(NoSuchElementException.class);
WebElement we=w.until(new Function<WebDriver,WebElement>()
{
public WebElement apply(WebDriver dr)
{
return dr.findElement(By.id("BE_flight_flseah_btn"));
}
});
为什么它不等待5分钟,这段代码有什么问题?请帮帮我。
答案 0 :(得分:1)
确保您已导入正确的NoSuchElementException
课程。
import org.openqa.selenium.NoSuchElementException;
因为如果你使用像eclipse或Netbeans这样的任何ide,自动导入很可能会导入import java.util.NoSuchElementException;
这是错误的
您每5毫秒轮询一次并等待5分钟。所以它将检查60000次以找到该元素。它将影响性能。将轮询TimeUnit增加到秒或将超时减少到秒
流畅等待让我们假设您有一个元素,有时会在1秒钟内出现,有些时间需要几分钟才会出现。在这种情况下,最好使用流畅的等待,因为这将尝试一次又一次地找到元素,直到找到它或直到最后的计时器用完为止。
显式等待:可能存在特定元素加载超过一分钟的实例。在这种情况下,你绝对不想为Implicit wait设置一个巨大的时间,就像你这样做一样,你的浏览器将会为每个元素等待相同的时间。
为避免这种情况,您只需在所需元素上单独设置一个时间即可。通过遵循这一点,您的浏览器隐含的等待时间对于每个元素都是短的,并且对于特定元素它将是大的。
根据您的要求而不是FluentWait和Wait,您可以使用WebDriverWait和ExpectedConditions,但WebDriverWait是FluentWait的扩展。
您可以阅读comparison over this link
您的条件可以作为
处理//timeunit in seconds.
//There are two other constructors available you can see that in the links
WebDriverWait wait = new WebDriverWait(driver, 300);
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("BE_flight_flseah_btn")));
答案 1 :(得分:0)
public WebElement waitForElementDisplayed(final Supplier<By> by,
final int timeToWaitInSec) {
Wait<Browser> wait = new FluentWait<>(this)
.withTimeout(timeToWaitInSec, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.MILLISECONDS)
.ignoring(WebDriverException.class);
wait.until(ExpectedConditions.presenceOfElementLocated(by.get()));
WebElement foo = wait.until((Function<Browser, WebElement>) (Browser driver) -> {
try {
Element element = driver.findElement(by);
if (element.isDisplayed()) {
return element;
}
} catch (Exception e) {
}
return null;
});
return foo;
}
调用此方法-您的脚本应该可以正常工作。
答案 2 :(得分:0)
.ignoring(NoSuchElementException.class)-应该从导入org.openqa.selenium.NoSuchElementException;
导入默认情况下,Eclipse要求从 java.util.NoSuchElementException; 导入NoSuchElementException类;或者 org.openqa.selenium.NoSuchElementException;
如果我们选择-java.util.NoSuchElementException;那么程序将不会等待轮询语句中提到的最长时间。
从技术上讲,代码没有什么错,只是导入了错误的包