Что такое SetScriptTimeout-Webdriver
Когда SetScriptTimeout следует использовать и, пожалуйста, приведите мне любой пример.
Я знаю defn
Sets the amount of time to wait for an asynchronous script to finish execution before throwing an error. If the timeout is negative, then the script will be allowed to run indefinitely.
Но не уверен, что именно он делает.
3 ответов:
У вас уже есть два ответа, ни один из которых я не нахожу ясно объясняющим смысл установки таймаута сценария.
Во-первых, важно, что таймаут скрипта влияет только на JavaScript-код, выполняемый сexecuteAsyncScriptи ни на что другое. В частности, наexecuteScriptэто не влияет.Так почему же вы хотите установить тайм-аут для
executeAsyncScript? Чандан Наяк правильно объяснил, что тайм-аут по умолчанию равен 0s, поэтому вы должны изменить этот тайм-аут, если хотите использоватьexecuteAsyncScriptс асинхронными скриптами, которые действительно выполняют некоторую работу. Но почему бы просто не установить его в-1и не покончить с ним? В конце концов, если вы установите его в-1, то вы отключите тайм-аут. Так что у вас больше не будет тайм-аутов. Миссия выполнена, верно? Нет.То, что вы хотите сделать, - это установить таймаут в значение, которое позволяет коду, который вы используете с
executeAsyncScript, выполнять его работу , в то же время обнаруживая, когда сценарий вышел из строя. Например, если по опыту вы знаете, что сценарий, который вы передаетеexecuteAsyncScript, будет выполнен за 2 секунды или меньше (за исключением, возможно, крайне необычных обстоятельств), затем вы устанавливаете тайм-аут в 2 секунды, так что если где-то есть ошибка и код никогда не завершается, вы получаете тайм-аут через 2 секунды. В противном случае селен будет счастливо ждать вечно, пока сценарий не будет завершен.
Из документации WebDriver:
setScriptTimeout(долгое время, java.утиль.параллельный.Единица измерения времени) Задает время ожидания завершения выполненияasynchronous scriptПеред выдачей ошибки. Это работаетonlyдля Ассинхронных скриптов (executeAsyncScript)Давайте запустим простой javascript: (Не устанавливайте
setScriptTimeout) - Теперь это должно выполняться без каких-либо проблем.((JavascriptExecutor) driver).executeScript("alert('hello world');");
давайте запустим простой Ассинхронный скрипт: ( Не устанавливайтеsetScriptTimeout) - это завершится ошибкой - "Тайм-аут ожидания результата асинхронного скрипта после 0 МС"((JavascriptExecutor) driver).executeAsyncScript("window.setTimeout(arguments[arguments.length - 1], 500);");Чтобы решить эту проблему:
setScriptTimeoutдо 1 секунды:driver.manage().timeouts().setScriptTimeout(1, TimeUnit.SECONDS);А затем запустите тот же сценарий Assync, упомянутый выше, и он будет выполняться без каких-либо ошибок.
Причина: Время ожидания по умолчанию для сценария, который будет выполняться, равно 0 мс. в большинстве случаев, включая приведенные ниже примеры, необходимо установить веб-драйвер времени ожидания сценария.Перерывы.setScriptTimeout (длинный, java.утиль.параллельный.TimeUnit) заранее к a значение достаточно большие
Дополнительные ссылки:
Когда следует использовать setScriptTimeout?
Вебдрайвера executeAsyncScript против executeScript
с WebDriver док
Автоматизация веб-приложений зависит от многих факторов, таких как браузер, скорость сети, встроенные сценарии и т. д. Чтобы написать надежный код для работы во всех средах, нам нужно сначала дождаться WebElements, прежде чем выполнять какие-либо операции над ними. WebDriver wait (синхронизация) может быть получен либо с помощью
support.ui, либоdriver().manage().timeouts()Если мы используем
driver.manage().timeouts(), обычной практикой для достижения синхронизации является использование JavaScript черезJavascriptExecutor, которые, в свою очередь, предоставляют два метода для сценария исполнение:ExecuteAsyncScript - > Этот метод не блокирует выполнение следующей строки кода...до тех пор, пока выполнение этого метода не будет завершено. Этот метод будет выполняться так же, как и следующая строка кода...асинхронно. (не блокируя друг друга)
ExecuteScript -> Этот метод блокирует выполнение до тех пор, пока оно не будет завершено, а затем переходит к следующей строке кода. Короче говоря, ваш код автоматизации остановится до тех пор, пока Javascript не будет выполняется с помощью этого метода.
Теперь, поскольку метод executeAsyncScript не блокирует выполнение следующей строки кода, было бы полезно использовать методdriver.manage().timeouts().setScriptTimeout(30,SECONDS);, чтобы наш код мог подождать определенное количество времени для завершения выполнения асинхронного скрипта, прежде чем выдавать ошибку.
Comments