Selenium 等待函数不工作

Selenium 等待函数不工作,selenium,selenium-webdriver,wait,ui-automation,Selenium,Selenium Webdriver,Wait,Ui Automation,我正在单击一个元素,并使用wait功能识别下一个元素。这是等待函数 wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("some xpath"))); 识别元素后,我执行其他操作,但当我单击第一个元素时,它将导致下一页,因此在页面加载时,wait函数将应用于当前页面并给出异常。有什么解决办法吗?我试过了 Browser.manage() 在之前等待但它不工作。只有在等待之前使用thread.sleep(1000)才有

我正在单击一个元素,并使用
wait
功能识别下一个元素。这是等待函数

wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("some xpath")));
识别元素后,我执行其他操作,但当我单击第一个元素时,它将导致下一页,因此在页面加载时,
wait
函数将应用于当前页面并给出异常。有什么解决办法吗?我试过了

Browser.manage()


之前等待
但它不工作。只有在
等待之前使用
thread.sleep(1000)
才有效,但我不想使用
thread.sleep()。

我认为在这种情况下有两种等待:

  • 等待加载下一页
  • 等待在新页面中加载指定的元素
下面是等待页面加载的选项:

public void waitForLoad() {
    ExpectedCondition<Boolean> condition = webDriver -> webDriver.getCurrentUrl().contains(getPageUrl());

    WebDriverWait wait = new WebDriverWait(driver, pageLoadTimeout);
    wait.until(condition);
}
与:

private Wait getWebDriverFluentWait(int超时){
返回新FluentWait(驱动程序)
.withTimeout(超时,时间单位为秒)
.轮询间隔(1,时间单位。秒)
.忽略(NoSuchElementException.class);
}

我认为在这种情况下有两种等待:

  • 等待加载下一页
  • 等待在新页面中加载指定的元素
下面是等待页面加载的选项:

public void waitForLoad() {
    ExpectedCondition<Boolean> condition = webDriver -> webDriver.getCurrentUrl().contains(getPageUrl());

    WebDriverWait wait = new WebDriverWait(driver, pageLoadTimeout);
    wait.until(condition);
}
与:

private Wait getWebDriverFluentWait(int超时){
返回新FluentWait(驱动程序)
.withTimeout(超时,时间单位为秒)
.轮询间隔(1,时间单位。秒)
.忽略(NoSuchElementException.class);
}

我想您想单击元素,所以使用
element可选择

WebDriverWait wait=new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.elementToBeClickable(locator))

我想您想单击元素,所以请使用
elementtobelickable

WebDriverWait wait=new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.elementToBeClickable(locator))

我也有同样的问题 但用这个我解决了

WebElement element = (new WebDriverWait(driver, 30)).until(ExpectedConditions.elementToBeClickable(By.xpath(".//*[@class='IM_overlay']")));    //it will wait 30 second for get this element
element .click();
//You can Do any operator here

我也有同样的问题 但用这个我解决了

WebElement element = (new WebDriverWait(driver, 30)).until(ExpectedConditions.elementToBeClickable(By.xpath(".//*[@class='IM_overlay']")));    //it will wait 30 second for get this element
element .click();
//You can Do any operator here

如果要单击的元素位于下一个(新)页面中,则必须使用windows迭代器。 您可以使用以下代码:

Set id=driver.getWindowHandles();
迭代器it=ids.Iterator();
字符串currentPage=it.next();
字符串newPage=it.next();
driver.switchTo()窗口(新页)//这将切换到新窗口。现在使用“等待”条件并执行所有操作
//现在要切换回上一个(当前)窗口,可以使用以下代码

driver.switchTo()窗口(当前页)如果要单击的元素位于下一个(新)页面中,则必须使用windows迭代器。 您可以使用以下代码:

Set id=driver.getWindowHandles();
迭代器it=ids.Iterator();
字符串currentPage=it.next();
字符串newPage=it.next();
driver.switchTo()窗口(新页)//这将切换到新窗口。现在使用“等待”条件并执行所有操作
//现在要切换回上一个(当前)窗口,可以使用以下代码

driver.switchTo()窗口(当前页)我猜问题在于您正在使用

ExpectedConditions.presenceOfElementLocated(...)
存在只是意味着元素存在于DOM中,而不是它是可见的、已启用的、可单击的等等。我建议您更改为等待,以匹配您想要对正在查找的元素执行的操作。如果要单击它,请等待它可单击。如果您想从中获取文本,请等待它可见,等等


另一个问题可能是您打算等待第2页上的某个元素,但该元素与第1页上的定位器匹配。一种解决方案是在第2页上找到一个唯一的元素,等待它可见,然后等待所需的元素。这样,在等待第2页上所需的元素之前,您可以确保自己处于正确的页面上。

我猜问题在于您使用的是

ExpectedConditions.presenceOfElementLocated(...)
存在只是意味着元素存在于DOM中,而不是它是可见的、已启用的、可单击的等等。我建议您更改为等待,以匹配您想要对正在查找的元素执行的操作。如果要单击它,请等待它可单击。如果您想从中获取文本,请等待它可见,等等


另一个问题可能是您打算等待第2页上的某个元素,但该元素与第1页上的定位器匹配。一种解决方案是在第2页上找到一个唯一的元素,等待它可见,然后等待所需的元素。这样,在等待第2页上的所需元素之前,您可以确保您位于正确的页面上。

请共享URL和HTML您会遇到哪些错误?请共享URL和HTML您会遇到哪些错误?否,窗口迭代器用于已启动的浏览器窗口,而不是流中的下一页。否,窗口迭代器用于已启动的浏览器窗口,而不是流中的下一页。请解释您的代码的作用以及它如何回答问题,以便对OP和未来的访问者更有用。请解释您的代码的作用以及它如何回答问题,以便对OP和未来的访问者更有用。