2016-05-06 2 views
1

Я хочу использовать 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().

так есть ли способ решить эту проблему? Либо должно быть нормально, как:

  1. запустить executeScript прямо сейчас, независимо от того, загружается страница;
  2. 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

ответ

0

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

Если это не сработает, вы можете попробовать использовать свой собственный таймер. Проверьте состояние готовности документа, если он не готов после некоторого таймаута, затем остановите его вручную (по JS) и запустите свой скрипт.

+0

не могли бы вы привести пример кода? – zixia

+0

((IJavaScriptExecutor) Driver) .ExecuteScript ("return document.readyState == 'complete'"); это C#. И сделайте это Driver.Manage(). Timeouts(). ImplicitlyWait (TimeSpan.FromSeconds (0)); до. –

+0

Я пробовал, но это не работает. (Я использую nodejs) 'driver.manage(). Timeouts(). ImplicitlyWait (0)' не помогло, 'executeScript' по-прежнему заблокирован. Как использовать мой собственный таймер? и я не могу выполнить какой-либо JS-код сейчас из-за этой «блокировки». – zixia

-3

Использование Thread.sleep(secs);. Например, мы хотим загрузить страницу за 3 секунды, мы пишем thread.sleep(30000);.

+0

Это будет ждать 30 секунд, а не 3. Также это просто заблокирует выполнение чтобы он ничего не делал в течение 30 секунд. – Festivejelly

Смежные вопросы