19 дек. 2017 г., 02:18 отDarrel HoltSUM

Когда использовать явное ожидание против неявного ожидания в Selenium Webdriver?

Я использую:

<code>driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS);
</code>

Но это все еще терпит неудачу непрерывно для элемента ниже

<code>    driver.findElement(By.id("name")).clear();
    driver.findElement(By.id("name")).sendKeys("Create_title_01");
</code>

Я добавил код ожидания:

<code>for (int second = 0;; second++) {
        if (second >= 120) fail("timeout");
        try { if (isElementPresent(By.id("name"))) break; } catch (Exception e) {}
        Thread.sleep(1000);
    }
</code>

Разве неявное ожидание должно заботиться о ожидании, пока элемент не будет найден? Также было бы лучше, если бы я использовал Явное ожидание вместо кода, который я добавил, который имеетThread.sleep()?

Ответы на вопрос(6)

23 мая 2017 г., 13:55 отCommunitylesmana

DR: всегда использовать явное ожидание. Забудьте, что неявное ожидание существует.

Вот краткое изложение различий между явным и неявным ожиданием:

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

documented and defined behaviour. runs in the local part of selenium (in the language of your code). works on any condition you can think of. returns either success or timeout error. can define absence of element as success condition. can customize delay between retries and exceptions to ignore.

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

undocumented and practically undefined behaviour. runs in the remote part of selenium (the part controlling the browser). only works on find element(s) methods. returns either element found or (after timeout) not found. if checking for absence of element must always wait until timeout. cannot be customized other than global timeout.

Давайте посмотрим на разницу между явным ожиданием и неявным ожиданием в фактическом исходном коде селена. Я скопировал код из привязки python к селену, потому что python "легко читается".

КодWebDriverWait.until() (явное ожидание):

def until(self, method, message=''):
    end_time = time.time() + self._timeout
    while(True):
        try:
            value = method(self._driver)
            if value:
                return value
        except self._ignored_exceptions:
            pass
        time.sleep(self._poll)
        if(time.time() > end_time):
            break
    raise TimeoutException(message)

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

Сравните с кодомWebDriver.implicitly_wait() (комментарии удалены для краткости):

def implicitly_wait(self, time_to_wait):
    self.execute(Command.IMPLICIT_WAIT, {'ms': float(time_to_wait) * 1000})

self.execute() являетсяWebDriver.execute() какие звонкиRemoteConnection.execute() который, в свою очередь, делает, насколько я могу судить, RPC для удаленной стороны селена.

На человеческом языке: неявное ожидание отправляет сообщение на «удаленную сторону» веб-драйвера селена. Удаленная сторона селенового веб-драйвера является частью селена, которая фактически управляет браузером. Что делает удаленная сторона с сообщением? & quot; Это зависит & quot ;. Это зависит от операционной системы, браузера и версии селен. Насколько я могу судить, нет никакой гарантии относительно фактического поведения конкретной реализации.

Возможные реализации:

repeatedly try to find element until timeout. return as soon as element is found. try to find element. wait until timeout. try again. wait until timeout. try to find element.

Обратите внимание, что неявное ожидание вступает в силу только для методов find element (s).

Я не посмотрел фактический исходный код удаленных сторон селена. Информация собирается из чтения комментариев вошибка сообщает о неявном и явном ожидании в селене:

Мой вывод: неявное ожидание это плохо. Возможности ограничены. Поведение недокументировано и зависит от реализации.

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

Дальнейшее чтение:

Official documentation (does not really explain the problematic other than warning from mixing implicit and explicit wait). Answer on a related question from Jim Evans. Jim Evans is a maintainer of selenium. Summary: don't mix implicit and explicit wait. Two blog posts explaining implicit and explicit wait in great detail: http://vnrtech.blogspot.de/2013/04/selenium-implicit-wait.html http://vnrtech.blogspot.de/2013/04/selenium-explicit-wait.html Selected bugs about implicit and explicit wait in selenium: http://code.google.com/p/selenium/issues/detail?id=2934 http://code.google.com/p/selenium/issues/detail?id=4471 http://code.google.com/p/selenium/issues/detail?id=7972
10 февр. 2016 г., 20:38 отMykolaAnand Somani

Implicit wait - Этоglobal setting применимо для всех элементов, и если элемент появится раньше указанного времени, скрипт начнет выполняться, иначе скрипт выдастNoSuchElementException, Лучший способ использовать в методе настройки. Влияет толькоBy.findelement().

Thread.sleep() - Это будет время сна для сценария,not good way использовать в сценарии, поскольку он спит без условий. Что если 2 секунд недостаточно в 5% случаев?

Explicit wait: Ожидание указания содержит содержит / изменение атрибута. Больше используется, когда приложение даетAJAX вызов системы и получение динамических данных и рендеринг в пользовательском интерфейсе. В этом случаеWebDriverWait подходит.

02 мая 2012 г., 03:23 отNashibukasan

Вы пытались использовать & apos;WebDriverWait& APOS; ? Я представляю, что вы хотите, это:

WebDriverWait _wait = new Web,DriverWait(driver, new TimeSpan(0, 0, 2)); //waits 2 secs max
_wait.Until(d => d.FindElement(By.Id("name")));
//do your business on the element here :)

Насколько я понимаю, это в значительной степени сделает ваш текущий код. Он будет постоянно пробовать метод (игнорируя не найденные исключения) до тех пор, пока не истечет время ожидания переданного промежутка времени, и можно ввести третий параметр, чтобы указать сон в миллисекундах. Извините, если это то, что неявно Wait делает тоже!

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

03 сент. 2012 г., 15:24 отeugene.polschikov

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

см эту ссылкусвободное ожидание описания

В частности, я использовал свободное ожидание таким образом:

public WebElement fluentWait(final By locator){
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                .withTimeout(30, TimeUnit.SECONDS)
                .pollingEvery(5, TimeUnit.SECONDS)
                .ignoring(NoSuchElementException.class);

        WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
            public WebElement apply(WebDriver driver) {
                        return driver.findElement(locator);
                }
                }
);
                           return  foo;              }     ;

Как вы заметили, беглое ожидание возвращает найденный веб-элемент. Таким образом, вы просто передаете локатор по типу By, а затем можете выполнять любые действия с найденным веб-элементом.

fluentWait(By.id("name")).clear();

Надеюсь, это поможет вам)

08 авг. 2017 г., 08:13 отiamsankalp89

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

Syntax:

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

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

Syntax:

WebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver,30);
07 дек. 2017 г., 14:26 отKiran Sk

ImplicitWait :

    1.. UnConditional Wait. ( No Conditions were given)
    3. Applicable throughout the program

Declaring the implicit wait in java - selenium:

driver.manage().timeout().implicitWait(20, TimeUnit.Seconds());

Explicit Wait:

Dynamic Wait Conditional Wait. Not applicable throughout the program

Declaring the Explicit Wait in Java Selenium.

WebDriverWait wait=new WebDriverWait(driver, 20); wait.until(somecondition);

ВАШ ОТВЕТ НА ВОПРОС