Я хочу использовать webdriver в nodejs для управления сайтом, который использует ajax очень тяжелый, особенно он всегда имеет http-запрос на сервер.Как «выполнить» перед загрузкой страницы с помощью WebDriver в селене?
Когда я использую driver.executeScript
, я обнаружил, что обещание вернулось почти никогда не решено.
Я проверил сайт, обнаружил, что для связи с сервером используется контур http-запроса keep-alive
. Это означает, что у него всегда будет по крайней мере одно живое соединение с сервером в течение 30 секунд, затем еще одно соединение еще на 30 секунд, снова и снова. которые вызывают document.readyState
держат interactive
вместо completed
, а затем driver.executeScript
почти заблокированы навсегда.
Я пробовал driver.manage().timeouts().pageLoadTimeout(PAGE_LOAD_TIMEOUT_MS)
, но он только выдает исключение после таймаута.
Я также попытался остановить соединения, нажав ESC в окне браузера. после этого, кажется driver.executeScript
можно запустить сразу. Но в API WebDriver я не нашел никакой функции, например, window.stop()
.
так есть ли способ решить эту проблему? Либо должно быть нормально, как:
- запустить
executeScript
прямо сейчас, независимо от того, загружается страница; - a webdriver api like
driver.browser.stop()
может остановить все прямые соединения на странице.
Nodejs код, чтобы повторно производить эту проблему:
const WebDriver = require('selenium-webdriver')
const driver = new WebDriver.Builder()
.withCapabilities(
WebDriver.Capabilities.firefox()
.set('webdriver.load.strategy', 'unstable')
).build()
driver.get('https://wx.qq.com/')
driver.executeScript('return "99% will be blocked, 1% luck to return"')
.then(function (ret) {console.log(ret)})
спасибо!
UPDATE:
я нашел, может быть установленwebdriver.load.strategy
кunstable
в Firefox будет помощь.
FirefoxProfile fp = new FirefoxProfile(); fp.setPreference("webdriver.load.strategy", "unstable"); WebDriver driver = new FirefoxDriver(fp);
https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/4993 https://w3c.github.io/webdriver/webdriver-spec.html#page-load-strategies-1
Ссылка из других получила то же проблемы: http://grokbase.com/t/gg/webdriver/1263dbyws6/how-to-click-stop-button-or-equivalent
не могли бы вы привести пример кода? – zixia
((IJavaScriptExecutor) Driver) .ExecuteScript ("return document.readyState == 'complete'"); это C#. И сделайте это Driver.Manage(). Timeouts(). ImplicitlyWait (TimeSpan.FromSeconds (0)); до. –
Я пробовал, но это не работает. (Я использую nodejs) 'driver.manage(). Timeouts(). ImplicitlyWait (0)' не помогло, 'executeScript' по-прежнему заблокирован. Как использовать мой собственный таймер? и я не могу выполнить какой-либо JS-код сейчас из-за этой «блокировки». – zixia