Заменить неявное ожидание явным ожиданием (селен вебдрайвер и Java)
Как я могу заменить это неявное ожидание явным?
драйвер = новый ChromeDriver(возможности);
. Driver.manage() deleteAllCookies ();
driver.manage(). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);
Это используется в методе "До". Мне удалось заменить все Thread.sleep () в коде, но я не уверен, что делать с этим.
4 ответа
Неявное ожидание определяется один раз сразу после driver
инициализация для driver
время жизни, и он устанавливает максимальное количество времени для driver
выглядеть врагом WebElement
,
Явное ожидание используется для ожидания указанного количества времени для WebElement
быть в состоянии кретина, и его нужно использовать каждый раз, когда вы ожидаете выполнения условия.
Вы не можете "заменить" определение неявного ожидания явным ожиданием, так как это разные вещи, и в этом пункте нет условий для ожидания.
Что такое ExplicitWait
:
Согласно документации здесь, ExplicitWait
кодовый блок, который вы определяете, настраиваете и внедряете для WebDriver
экземпляр, чтобы дождаться выполнения определенного условия, прежде чем переходить к следующей строке кода. Есть несколько методов, которые помогают нам реализовать ExplicitWait
это будет ждать только столько времени, сколько потребуется. WebDriverWait
в комбинации с ExpectedCondition
это один из способов ExplicitWait
может быть достигнут.
Пример:
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
.
.
.
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("element_xpath")));
element.click();
Объяснение:
Эта реализация ExplicitWait
ждет до 10 секунд, прежде чем бросить TimeoutException
или если он найдет элемент, он вернется в течение от 0 до 10 секунд. WebDriverWait
по умолчанию вызывает ExpectedCondition
каждые 500 миллисекунд, пока он не вернется успешно. Успешное возвращаемое значение для ExpectedCondition
Тип функции является Boolean
значение true или ненулевой объект.
Ожидаемые условия:
Существуют некоторые часто встречающиеся условия при автоматизации веб-браузеров для Testing Web/Mobile Applications
, Привязки Java, C# и Python включают эти удобные методы, поэтому нам не нужно писать ExpectedCondition
сами классифицируем или создаем для них собственный пакет утилит. Некоторые из Expected Conditions
являются:
alertIsPresent()
elementToBeClickable(locator)
elementToBeSelected(WebElement)
frameToBeAvailableAndSwitchToIt(locator)
invisibilityOf(element)
Вы можете найти информацию обо всех методах, поддерживаемых Expected Conditions
здесь
Склонение ExplicitWait
:
Чтобы побудить ExplicitWait
сначала нужно удалить все звонки на implicitlyWait()
в вашем Test Framework
, Начните новое выполнение и наблюдайте, где вы столкнулись с исключением для атрибута элемента. Исключения, с которыми мы столкнемся, будут следующими:
NoSuchElementException
ElementNotVisibleException
ElementNotSelectableException
Теперь нам нужно подтвердить конкретный атрибут WebElement
чего нам нужно ждать. Если WebElement
в рассмотрении должен быть нажат, мы рассмотрим Expected Conditions
как elementToBeClickable(locator)
Element is Clickable
- Реализован как элемент отображается и включен.
Note
: Не смешивайтеimplicit and explicit waits
, Это может привести кunpredictable wait times
, Например, установка неявного ожидания 10 секунд и явного ожидания 15 секунд может привести к возникновению тайм-аута через 20 секунд.
Неявные ожидания устанавливаются один раз и применяются в течение всего срока службы экземпляра драйвера, поэтому реальной замены этой линии не существует. Вы должны просто удалить его, потому что вы не хотите смешивать неявные и явные ожидания в соответствии с официальными документами.
ВНИМАНИЕ: не смешивайте неявные и явные ожидания. Это может привести к непредсказуемому времени ожидания.
Как только вы удалите эту строку, вам нужно будет запустить ваши сценарии и добавить явные ожидания в тех областях, где требуется ожидание.
Как только вы объявите implicitlyWait
он будет применяться ко всем элементам во время выполнения скрипта. Поэтому объявите это изначально, чтобы предотвратить сбой скрипта.
Теперь, если есть элемент, требующий явного ожидания, просто объявите его перед тем, как выполнить какое-либо действие или используйте ссылку на него. явное ожидание не применяется через как implicitlyWait
,
Пример:-
WebElement seleniumlink;
seleniumlink= wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@id='add_files_btn']")));
seleniumlink.click();
См. Ссылку ниже для получения более подробной информации: -
https://www.guru99.com/implicit-explicit-waits-selenium.html
Использование неявных и явных ожиданий.
Хотя мы считаем, что явное ожидание более целесообразно, вам следует проверить сценарий, к которому вы стремитесь.
Например, в своем коде вы вызываете ожидание, чтобы узнать время завершения вызова удаления. Который может быть улучшен без использования ожидания вообще.
Set<Cookie> cookies = driver.manage().getCookies();
for(;cookies.size() != 0;){
driver.manage().deleteAllCookies();
}
** Вы можете использовать цикл Хотя я полагаю **
Сказав это, использовать явное ожидание. Я использовал его для выполнения действий во всплывающем окне, которое я получаю во время тестирования приложения.
WebDriverWait wait = new WebDriverWait(appDriver, 10);
wait.until(ExpectedConditions.alertIsPresent());
appDriver.switchTo().alert().dismiss();
Так что не ждите, если вы можете проверить условие выполнения, и используйте явное ожидание, когда вы знаете, чего ждать. Надеюсь это немного поможет.