Что такое 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 для выполнения работ в то же время обнаружить, когда сценарий пошел rogue. Например, если по опыту вы знаете, что скрипт вы передаете в executeAsyncScript будет сделано за 2 секунды или меньше (за исключением, возможно, в чрезвычайно необычных обстоятельствах), затем вы установите тайм-аут на 2 секунды, так что если где-то есть ошибка, и код никогда не заканчивается, вы получите тайм-аут через 2 секунды. В противном случае, Selenium будет счастливо ждать навсегда завершения сценария.


из документации WebDriver: setScriptTimeout(долгое время, java.утиль.параллельный.Блок timeunit / единицы ) Задает время ожидания asynchronous script, чтобы завершить выполнение, прежде чем выбросить ошибку. Это работает only для скриптов Assync (executeAsyncScript)

давайте запустим простой javascript: (не ставим setScriptTimeout) - Теперь это должно выполняться без каких-либо проблем.

((JavascriptExecutor) driver).executeScript("alert('hello world');");


позволяет запустить простой скрипт Assync: (Do не установить setScriptTimeout) - это должно завершиться ошибкой - "тайм-аут ожидания результата асинхронного скрипта после 0 мс"

 ((JavascriptExecutor) driver).executeAsyncScript("window.setTimeout(arguments[arguments.length - 1], 500);");

чтобы решить эту проблему: setScriptTimeout до 1 секунды:

driver.manage().timeouts().setScriptTimeout(1, TimeUnit.SECONDS);

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


причина: Тайм-аут по умолчанию для выполняемого сценария равен 0ms. В большинстве случаев, включая приведенные ниже примеры, необходимо задать сценарий благодаря тайм-аут.Таймауты.setScriptTimeout (длинный, java.утиль.параллельный.TimeUnit) заранее до значения достаточно большого

Дополнительные Ссылки:
когда следует использовать setScriptTimeout?
WebDriver executeAsyncScript vs executeScript
WebDriver Doc


автоматизация веб-приложений зависит от многих факторов, таких как браузер, скорость сети, встроенные скрипты и т. д. Чтобы написать надежный код для работы во всех средах, нам нужно вставить ожидание WebElements перед выполнением любой операции. WebDriver wait (синхронизация) можно получить либо с помощью support.ui или driver().manage().timeouts()

если мы используем driver.manage().timeouts(), общей практикой для достижения синхронизации является использование JavaScript через JavascriptExecutor которые в свою очередь обеспечивают два метода выполнение скрипта:

executeAsyncScript -> этот метод не блокирует выполнение следующей строки кода...до завершения выполнения этого метода. Этот метод будет выполняться, а также следующая строка кода будет выполняться...асинхронно. (не блокируя друг друга)

executeScript - > этот метод будет блокировать выполнение до завершения его выполнения, а затем он переходит к следующей строке кода. Короче кода автоматизация остановитесь, пока Javascript не будет выполнен с помощью этого метода.

вот так executeAsyncScript метод не блокирует выполнение следующей строки кода, это может быть полезно использовать driver.manage().timeouts().setScriptTimeout(30,SECONDS); так что наш код может ждать заданного количества времени для асинхронного скрипта, чтобы завершить выполнение, прежде чем бросить ошибку.