Если вы только начали использовать селен, это законный вопрос.Я всегда предлагаю взглянуть на официальный документ .
Неявное ожидание состоит в том, чтобы указать WebDriver опрашивать DOM в течение определенного времени при попытке найти элемент или элементы, если они не доступны сразу.Значение по умолчанию равно 0. После установки неявное ожидание устанавливается на срок службы экземпляра объекта WebDriver.
Пример:
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));
В этом случае, если сетьэлемент с идентификатором myDynamicElement отсутствует в DOM, когда вы пытаетесь найти его, вы говорите, что повторите попытку до 10 секунд.Время опроса зависит от используемого вами веб-драйвера .Вы должны знать, что он попытается найти элемент за 10 секунд.Конечно, если элемент находится до конца этого времени, код будет продолжаться.В противном случае выдается исключение.
Явное ожидание - это код, который вы определили для ожидания определенного условия, прежде чем продолжить работу в коде.В худшем случае это Thread.sleep (), который устанавливает условие для точного периода ожидания.Есть несколько удобных методов, которые помогут вам написать код, который будет ждать столько времени, сколько потребуется.WebDriverWait в сочетании с ExpectedCondition - это один из способов, которым это может быть достигнуто.
Пример:
WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));
Это ожидает до 10 секунд, прежде чем вызвать TimeoutException или если он найдетэлемент вернет его через 0 - 10 секунд.По умолчанию WebDriverWait вызывает ExpectedCondition каждые 500 миллисекунд, пока не завершится успешно.Успешное возвращаемое значение для типа функции ExpectedCondition является логическим значением true или ненулевым объектом.
И, в конце, там написано: Этот пример также функциональноэквивалентно первому примеру неявного ожидания.
Таким образом, если вы используете senceOfElementLocated в качестве ожидаемого условия (для каждого элемента, который вы пытаетесь найти), то точно так же, чтобы использоватьнеявное ожидание.Но это не только условие.Как видно из ExpectedConditions , вы можете указать другие условия (пример: elementToBeClickable, stalenessOf и т. Д.).
Итак, возвращаясь к вашему вопросу:
С
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
вы говорите подождать, всякий раз, когда вы пытаетесь найти элемент , присутствие (помните, что это похоже наsenceOfElementLocated) до 30секунд.
С помощью
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
вы устанавливаете на 30 секунд время загрузки веб-страницы.
С помощью:
WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(id)));
boolean status = element.isDisplayed();
Вы говорите, что хотите подождать visibilityOfElementLocated веб-элемента с id: "id" до 30 секунд.
Наконец:
Почему необходимо назначить WebElement следующему ожиданию, что получает элемент WebElement?Это правильная реализация?
Что получает элемент WebElement?что еще если не webelement с id: "id"?Конечно, если это видно.В противном случае будет сгенерировано исключение.