我点击了一个元素,我正在使用wait
函数来识别下一个元素。这是等待功能。
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("some xpath")));
在识别元素之后,我执行其他操作,但是当我单击第一个元素时它将转到下一页,因此在页面加载时wait
函数正在申请当前页面并给出异常。这有什么解决方案吗?我试过了
Browser.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
wait
之前但它无效。只有在thread.sleep(1000)
之前使用wait
但我不想使用thread.sleep().
答案 0 :(得分:1)
我猜测问题在于你正在使用
->orWhere($qb->expr()->isNull('t.hardware'))
Presence只是意味着元素存在于DOM中,而不是它可见,启用,可点击等。我建议您更改为等待您想要对您要查找的元素进行匹配。如果要单击它,请等待它可单击。如果你想从中获取文本,等待它可见,等等。
另一个问题可能是您打算等待第2页上的元素,但元素与第1页上的定位符匹配。一种解决方案是在第2页上找到一个唯一元素,等待它可见,然后等待你想要的元素。这样,您就可以确保在等待第2页上的所需元素之前就在正确的页面上。
答案 1 :(得分:0)
我认为在这种情况下有2次等待:
以下是等待加载页面的选项:
public void waitForLoad() {
ExpectedCondition<Boolean> condition = webDriver -> webDriver.getCurrentUrl().contains(getPageUrl());
WebDriverWait wait = new WebDriverWait(driver, pageLoadTimeout);
wait.until(condition);
}
然后等待下一个元素可见:
protected void waitFor(By by) {
ExpectedCondition<Boolean> condition = webDriver -> !webDriver.findElements(by).isEmpty();
WebDriverWait wait = new WebDriverWait(driver, pageLoadTimeout);
wait.until(condition);
}
或使用其他解决方案:
public WebElement elementToBeClickable(By locator, int timeout) {
try {
return getWebDriverFluentWait(timeout)
.until(ExpectedConditions.elementToBeClickable(locator));
} catch (Exception e) {
return null;
}
}
使用:
private Wait<WebDriver> getWebDriverFluentWait(int timeout) {
return new FluentWait<WebDriver>(driver)
.withTimeout(timeout, TimeUnit.SECONDS)
.pollingEvery(1, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
}
答案 2 :(得分:0)
我想你想点击元素,所以使用elementToBeClickable
WebDriverWait wait=new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.elementToBeClickable(locator))
答案 3 :(得分:0)
我也有同样的问题 但是使用这个我解决了
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
答案 4 :(得分:0)
如果要单击的元素位于下一个(新)页面中,则必须使用Windows迭代器。 您可以使用此代码:
Set <Strings> ids = driver.getWindowHandles();
Iterator <String> it = ids.iterator();
String currentPage = it.next();
String newPage = it.next();
driver.switchTo().window(newPage);//this will switch to the new window. Use your 'wait' condition now and do all the operations
//now to switch back to the previous(current) window, you could use the below code
driver.switchTo().window(currentPage);
&#13;