我正在使用selenium和Java。我想在页面上执行任何操作之前等待页面完全加载。
我尝试过以下方法,但无法按预期工作。
public void waitForElementToBeVisible(final WebElement element) {
WebDriverWait wait = new WebDriverWait(WebDriverFactory.getWebDriver(), WEBDRIVER_PAUSE_TIME);
wait.until(ExpectedConditions.visibilityOf(element));
答案 0 :(得分:2)
WebDriverWait继承了等待until。
等方法类似
webDriverWait.until(ExpectedConditions.visibilityOfElementLocated( elementLocator)
应该有效。您可以使用ExpectedConditions,这会使事情变得更简单。您还可以使用方法visibilityOfAllElements
答案 1 :(得分:0)
此方法将一直等到元素可见。 首先,这个方法将检查元素是否在html中可用以及是否显示..它将等到元素显示..
public void E_WaitUntilElementDisplay() throws Exception
{
int i=1;
boolean eleche,eleche1 = false;
while(i<=1)
{
try{
eleche = driver.findElements(by.xpath("path")).size()!=0;
}catch(InvalidSelectorException ISExcep)
{
eleche = false;
}
if(eleche == true)
{
while(i<=1)
{
try{
eleche1=driver.findElement(By.xpath("Path")).isDisplayed();
}catch(org.openqa.selenium.NoSuchElementException NSEE){
eleche1=false;
}
if(eleche1 == true)
{
i=2;
System.out.println("\nElement Displayed.");
}
else
{
i=1;
Thread.sleep(1500);
System.out.println("\nWaiting for element, to display.");
}
}
}
else
{
i=1;
Thread.sleep(1500);
System.out.println("\nWaiting for element, to display.");
}
}
}
答案 2 :(得分:0)
作为另一种选择,您可以尝试以下方式:
if(element.isDisplayed() && element.isEnabled()){
//your code here
}
或者如果你知道你想等多久:
thread.sleep(3000); //where 3000 is time expression in milliseconds, in this case 3 secs
答案 3 :(得分:0)
您可以在Java中使用此功能来验证页面是否已完全加载。验证有两个方面。一种使用javascript document.readystate并在javascript上施加等待时间。
/* Function to wait for the page to load. otherwise it will fail the test*/
public void waitForPageToLoad() {
ExpectedCondition<Boolean> javascriptDone = new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
try {
return ((JavascriptExecutor) getDriver()).executeScript("return document.readyState").equals("complete");
} catch (Exception e) {
return Boolean.FALSE;
}
}
};
WebDriverWait wait = new WebDriverWait(getDriver(), waitTimeOut);
wait.until(javascriptDone);
}
答案 4 :(得分:0)
这对我有用:
wait.until(ExpectedConditions.not(
ExpectedConditions.presenceOfElementLocated(
By.xpath("//div[contains(text(),'Loading...')]"))));
答案 5 :(得分:0)
这是专门针对 Angular 7 或 8 的终极解决方案。
您可以将等待时间划分为分区并递归使用,而不是使用睡眠或隐式等待方法等待更长的时间。
以下逻辑将等待页面呈现最少 300 秒和最多 900 秒。
/**
* This method will check page loading
*
*/
public void waitForLoadingToComplete() {
waitLoadingTime(3); // Enter the number of attempts you want to try
}
private void waitLoadingTime(int i) {
try {
// wait for the loader to appear after particular action/click/navigation
this.staticWait(300);
// check for the loader and wait till loader gets disappear
waitForElementToBeNotPresent(By.cssSelector("Loader Element CSS"));
} catch (org.openqa.selenium.TimeoutException e) {
if (i != 0)
waitLoadingTime(i - 1);
}
}
/**
* This method is for the static wait
*
* @param millis
*/
public void staticWait(final long millis) {
try {
TimeUnit.MILLISECONDS.sleep(millis);
} catch (final InterruptedException e) {
System.err.println("Error in staticWait." + e);
}
}
public void waitForElementToBeNotPresent(final By element) {
long s = System.currentTimeMillis();
new WebDriverWait(this.getDriver(), 30)
.until(ExpectedConditions.not(ExpectedConditions.presenceOfAllElementsLocatedBy(element)));
System.err.println("Waiting for Element to be not present completed. " + (System.currentTimeMillis() - s));
}