driver.get () фактически должен блокироваться, пока страница не закончит загрузку. Однако иногда это не происходит, например, если JavaScript продолжает загружаться после загрузки основного HTML. В этом случае у вас иногда возникают проблемы с щелчком элементов, которые еще не появились. Вы можете либо использовать WebDriverWait (), чтобы дождаться появления элемента, либо увеличить неявное время ожидания с помощью:
driver.manage().timeouts().implicitlyWait(X, TimeUnit.SECONDS);
Вот эквивалент использования WebDriverWait:
public void waitAndClick(WebDriver driver, By by) {
WebDriverWait wait = new WebDriverWait(driver, 10000);
Function<WebDriver, Boolean> waitForElement = new waitForElement(by);
wait.until(waitForElement);
Actions builder = new Actions(driver);
builder.click(driver.findElement(by)).perform();
}
И класс waitForElement:
public class waitForElement implements Function<WebDriver, Boolean> {
private final By by;
private String text = null;
public waitForElement(By by) {
this.by = by;
}
public waitForElement(By by, String text) {
this.by = by;
this.text = text;
}
@Override
public Boolean apply(WebDriver from) {
if (this.text != null) {
for (WebElement e : from.findElements(this.by)) {
if (e.getText().equals(this.text)) {
return Boolean.TRUE;
}
}
return Boolean.FALSE;
} else {
try {
from.findElement(this.by);
} catch (Exception e) {
return Boolean.FALSE;
}
return Boolean.TRUE;
}
}
}