Подтвердить что ты не робот

Как настроить таймер ожидания selenium webdriver?

Когда я использую прокси-сервер в webdriver, таком как FirefoxDriver, если прокси-сервер плохой, метод get будет блокироваться навсегда. Я установил некоторые параметры таймаута, но это не сработало.

Это мой код:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("general.useragent.override", ua);    
Proxy p = new Proxy();
p.setHttpProxy(proxy);
profile.setProxyPreferences(p);
profile.setEnableNativeEvents(true);

// create a driver
WebDriver driver = new FirefoxDriver(profile);
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
driver.get("www.sina.com.cn")

Призыв к driver.get будет заблокирован навсегда, но я хочу, чтобы он подождал 30 секунд, и если страница не загружена, выведите исключение.

4b9b3361

Ответ 1

Попробуйте следующее:

 driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

Ответ 2

Методы timeouts() не реализованы в некоторых драйверах и очень ненадежны вообще.
Я использую отдельный поток для тайм-аутов (передача URL-адреса для доступа в качестве имени потока):

    Thread t = new Thread(new Runnable()
    {
      public void run()
      {
        driver.get(Thread.currentThread().getName());
      }
    }, url);
    t.start();
    try
    {
      t.join(YOUR_TIMEOUT_HERE_IN_MS);
    }
    catch (InterruptedException e)
    { // ignore
    }
    if (t.isAlive())
    { // Thread still alive, we need to abort
      logger.warning("Timeout on loading page " + url);
      t.interrupt();
    }

Это, похоже, работает большую часть времени, однако может случиться так, что драйвер действительно застрял, и любой последующий вызов драйвера будет заблокирован (я испытываю это с драйвером Chrome в Windows). Даже что-то безобидное, как вызов driver.findElements(), может быть заблокировано. К сожалению, у меня нет решений для заблокированных драйверов.

Ответ 3

попробуйте

driver.executeScript("window.location.href='http://www.sina.com.cn'")

этот оператор немедленно вернется.

И после этого вы можете добавить WebDriverWait с таймаутом, чтобы проверить, правильно ли заголовок страницы или какой-либо элемент.

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

Ответ 4

У меня была такая же проблема и благодаря этому форуму, и некоторые другие нашли ответ. Первоначально я также думал о отдельной теме, но это немного усложняет код. Поэтому я попытался найти ответ, который согласуется с моим принципом "элегантность и простота".

Пожалуйста, посмотрите на такой форум: https://sqa.stackexchange.com/questions/2606/what-is-seleniums-default-timeout-for-page-loading

#

РЕШЕНИЕ: В коде перед линией с методом get вы можете использовать, например:

driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
#

Одно дело, что он выдает исключение timeoutException, поэтому вам нужно инкапсулировать его в блок catch try или обернуть каким-либо методом.

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

#

ВНИМАНИЕ: 'pageLoadTimeout' НЕ применяется для драйвера Chrome и, следовательно, вызывает исключение. Я видел комментарии пользователей, что есть планы сделать это.

Ответ 5

Добавить

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

Ничего не сделает. Страница будет блокироваться в течение очень долгого времени.

Ответ 6

Вы можете установить тайм-аут на HTTP-клиенте, например

int connectionTimeout=5000;
int socketTimeout=15000;
ApacheHttpClient.Factory clientFactory = new ApacheHttpClient.Factory(new HttpClientFactory(connectionTimeout, socketTimeout));
HttpCommandExecutor executor =
      new HttpCommandExecutor(new HashMap<String, CommandInfo>(), new URL(seleniumServerUrl), clientFactory);
RemoteWebDriver driver = new RemoteWebDriver(executor, capabilities);

Ответ 7

Решение driver.manage(). timeouts(). pageLoadTimeout (10, TimeUnit.SECONDS) будет работать на страницах с синхронизацией, но это не решит проблему на загрузке страниц на асинхронном режиме, тесты будет работать все время, если мы установим pageLoadTimeOut.

Ответ 8

Я нахожу, что тайм-аут не достаточно надежны в реальной жизни, особенно для Internet Explorer, однако следующие решения могут помочь:

  • Вы можете завершить полный тест, используя @Test (timeout = 10000) в тесте junit, из которого вы запускаете процесс селена. Это освободит основной поток для выполнения других тестов, вместо того, чтобы блокировать все шоу. Однако даже это время не работает.

  • В любом случае по тайм-ауту вы не собираетесь спасать тестовый пример, потому что тайм-аут даже одной операции может привести к тому, что вся тестовая последовательность будет в противоречивом состоянии. Вы можете просто захотеть продолжить работу с другими тестовыми шкафами без блокировки (или, возможно, повторить повторный тест). В таком случае безупречным методом было бы написать poller, который проверяет процессы Webdriver (например, IEDriverServer.exe, Phantomjs.exe), работающие более 10 минут и убивающие их. Пример можно найти в Автоматически идентифицировать (и убивать) процессы с длительным временем обработки

Ответ 9

Используется под кодом в аналогичной ситуации

driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);

и встроенный код driver.get в try catch, который решил проблему загрузки страниц, которые занимали более 1 минуты.