Поиск…


Типы ожидания в селене WebDriver

При запуске любого веб-приложения необходимо учитывать время загрузки. Если ваш код пытается получить доступ к любому элементу, который еще не загружен, WebDriver выдаст исключение, и ваш скрипт остановится.

Существует три типа ожиданий -

  • Неявные ожидания
  • Явные ожидания
  • Свободные ожидания

Неявные ожидания используются для установки времени ожидания во всей программе, в то время как явные ожидания используются только на определенных участках.


Неявное ожидание

Неявное ожидание - сказать WebDriver, чтобы опросить DOM в течение определенного времени, пытаясь найти элемент или элементы, если они не доступны сразу. Неявные ожидания - это в основном ваш способ сообщить WebDriver о задержке, которую вы хотите увидеть, если указанный веб-элемент отсутствует, что ищет WebDriver. Значение по умолчанию равно 0. После установки неявный ожидание задается для жизни экземпляра объекта WebDriver. Неявное ожидание объявляется в части экземпляра кода с использованием следующего фрагмента.

Пример в Java :

driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
// You need to import the following class - import java.util.concurrent.TimeUnit;

Пример в C # :

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(15));

Таким образом, в этом случае вы сообщаете WebDriver, что он должен ждать 15 секунд, если указанный элемент не доступен в пользовательском интерфейсе (DOM).


Явное ожидание

Вы можете столкнуться с экземплярами, когда какой-то элемент занимает больше времени для загрузки. Установка неявного ожидания таких случаев не имеет смысла, поскольку браузер будет ждать ненужных за одно и то же время для каждого элемента, увеличивая время автоматизации. Явное ожидание помогает здесь, минуя неявное ожидание для некоторых конкретных элементов.

Явные ожидания - это интеллектуальные ожидания, которые ограничены определенным веб-элементом. Используя явные ожидания, вы в основном говорите WebDriver на максимуме, чтобы ждать X единиц времени, прежде чем он сдастся.

Явные ожидания выполняются с использованием классов WebDriverWait и ExpectedConditions. В приведенном ниже примере мы подождем до 10 секунд для элемента, идентификатор которого является именем пользователя, чтобы стать видимым, прежде чем переходить к следующей команде. Вот шаги.

Пример в Java :

//Import these two packages:
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

//Declare a WebDriverWait variable. In this example, we will use myWaitVar as the name of the variable.
WebDriverWait myWaitVar = new WebDriverWait(driver, 30);

//Use myWaitVar with ExpectedConditions on portions where you need the explicit wait to occur. In this case, we will use explicit wait on the username input before we type the text tutorial onto it.
myWaitVar.until(ExpectedConditions.visibilityOfElementLocated(By.id(“username”)));
driver.findElement(By.id(“username”)).sendKeys(“tutorial”);

Класс ExpectedConditions имеет некоторые предопределенные общие условия для ожидания элемента. Нажмите здесь, чтобы просмотреть список этих условий в привязке Java.

Пример в C # :

using OpenQA.Selenium;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium.PhantomJS;

// You can use any other WebDriver you want, such as ChromeDriver.
using (var driver = new PhantomJSDriver())
{
    driver.Navigate().GoToUrl("http://somedomain/url_that_delays_loading");

    // We aren't going to use it more than once, so no need to declare this a variable.
    new WebDriverWait(driver, TimeSpan.FromSeconds(10))
        .Until(ExpectedConditions.ElementIsVisible(By.Id("element-id")));

    // After the element is detected by the previous Wait, 
    // it will display the element's text
    Console.WriteLine(driver.FindElement(By.Id("element-id")).Text);
}

В этом примере система будет ждать 10 секунд, пока элемент не будет виден. Если элемент не будет отображаться после таймаута, WebDriver выкинет WebDriverTimeoutException .

Обратите внимание: если элемент отображается до истечения 10-секундного тайм-аута, система немедленно продолжит дальнейший процесс.


Свободное ожидание

В отличие от неявного и явного ожидания, свободное ожидание использует два параметра. Значение тайм-аута и частота опроса. Скажем, у нас есть значение тайм-аута как 30 секунд, а частота опроса - 2 секунды. WebDriver будет проверять элемент через каждые 2 секунды до значения тайм-аута (30 секунд). После превышения значения тайм-аута без какого-либо результата генерируется исключение. Ниже приведен пример кода, который демонстрирует безупречное ожидание.

Пример в Java :

Wait wait = new FluentWait(driver).withTimeout(30, SECONDS).pollingEvery(2, SECONDS).ignoring(NoSuchElementException.class);


WebElement testElement = wait.until(new Function() {
    public WebElement apply(WebDriver driver) {
        return driver.findElement(By.id("testId"));
    }
});

Еще одно преимущество использования свободного ожидания - мы можем игнорировать определенные типы исключений (например, NoSuchElementExceptions) во время ожидания. Из-за всех этих положений, свободное время полезно в приложениях AJAX, а также в сценариях, когда время загрузки элемента часто колеблется. Стратегическое использование быстрого ожидания значительно улучшает усилия по автоматизации.


Различные типы явных условий ожидания

В явном ожидании вы ожидаете, что это произойдет. Например, вы хотите подождать, пока элемент будет доступен для клика.

Вот демонстрация нескольких общих проблем.

Обратите внимание: во всех этих примерах вы можете использовать любой параметр « By качестве локатора», например, имя classname , xpath , link text , tag name или cssSelector


Подождите, пока элемент не будет виден

Например, если вашему веб-сайту требуется некоторое время для загрузки, вы можете подождать, пока страница завершит загрузку, и ваш элемент будет виден WebDriver.

C #

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("element-id")));

Джава

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("element-id")));

Подождите, пока элемент больше не будет виден

То же, что и раньше, но наоборот.

C #

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.InvisibilityOfElementLocated(By.Id("element-id")));

Джава

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("element-id")));

Подождите, пока текст не будет указан в указанном элементе

C #

IWebElement element = driver.FindElement(By.Id("element-id"));

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.TextToBePresentInElement(element, "text"));

Джава

WebElement element = driver.findElement(By.id("element-id"));

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.textToBePresentInElement(element, "text"));

Если вы перейдете к данной ссылке выше, вы увидите все условия ожидания.

Разница между использованием этих условий ожидания заключается в их входном параметре.

Это означает, что вам необходимо передать WebElement, если его входным параметром является WebElement, вам нужно передать локатор элемента, если он принимает локатор By в качестве его входного параметра.

Выберите разумно, какое условие ожидания вы хотите использовать.

Ожидание заявок Ajax на завершение

C #

using OpenQA.Selenium
using OpenQA.Selenium.Chrome;
using System.Threading;

namespace WebDriver Tests
{
    class WebDriverWaits
    {
        static void Main()
        {
            IWebDriver driver = new ChromeDriver(@"C:\WebDriver");
            
            driver.Navigate().GoToUrl("page with ajax requests");
            CheckPageIsLoaded(driver);

            // Now the page is fully loaded, you can continue with further tests.
        }

        private void CheckPageIsLoaded(IWebDriver driver)
        {
            while (true)
            {
                bool ajaxIsComplete = (bool)(driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");
                if (ajaxIsComplete)
                    return;
                Thread.Sleep(100);
            }
        }
    }
}

Этот пример полезен для страниц, на которых выполняются запросы ajax, здесь мы используем IJavaScriptExecutor для запуска нашего собственного кода JavaScript. Как это в while петли он будет продолжать работать , пока ajaxIsComplete == true и поэтому оператор возврата выполняется.

Мы проверяем, что все запросы ajax завершены, подтвердив, что jQuery.active равен 0 . Это работает, потому что каждый раз, когда выполняется новый запрос ajax, jQuery.active увеличивается и каждый раз, когда запрос дополняет его, уменьшается, из этого можно сделать вывод, что когда jQuery.active == 0 все запросы ajax должны быть завершены.

Свободное время ожидания

Свободное ожидание является суперклассом явного ожидания ( WebDriverWait ), который более настраивается, поскольку он может принимать аргумент функции ожидания. Я передам имплицитное ожидание, так как лучше избегать этого.

Использование (Java):

Wait wait = new FluentWait<>(this.driver)
        .withTimeout(driverTimeoutSeconds, TimeUnit.SECONDS)
        .pollingEvery(500, TimeUnit.MILLISECONDS)
        .ignoring(StaleElementReferenceException.class)
        .ignoring(NoSuchElementException.class)
        .ignoring(ElementNotVisibleException.class);

WebElement foo = wait.until(ExpectedConditions.presenceOfElementLocated(By.yourBy));

// or use your own predicate:
WebElement foo = wait.until(new Function() {
  public WebElement apply(WebDriver driver) {
    return element.getText().length() > 0;
  }
});

Когда вы используете Explicit wait с его значениями по умолчанию, это просто FluentWait<WebDriver> со значениями по умолчанию: DEFAULT_SLEEP_TIMEOUT = 500; и игнорирование NotFoundException .

Свободное ожидание

Каждый экземпляр FluentWait определяет максимальное время ожидания условия, а также частоту проверки состояния. Кроме того, пользователь может настроить ожидание, чтобы игнорировать определенные типы исключений во время ожидания, например, NoSuchElementExceptions при поиске элемента на странице. Он связан с драйвером.

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS) //actuall wait for the element to pe present
.pollingEvery(5, SECONDS) //selenium will keep looking for the element after every 5seconds
.ignoring(NoSuchElementException.class); //while ignoring this condition
wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.id("username"));


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow