Ответ 1
Попробуйте следующее:
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
Когда я использую прокси-сервер в 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 секунд, и если страница не загружена, выведите исключение.
Попробуйте следующее:
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
Методы 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(), может быть заблокировано. К сожалению, у меня нет решений для заблокированных драйверов.
попробуйте
driver.executeScript("window.location.href='http://www.sina.com.cn'")
этот оператор немедленно вернется.
И после этого вы можете добавить WebDriverWait с таймаутом, чтобы проверить, правильно ли заголовок страницы или какой-либо элемент.
Надеюсь, это поможет вам.
У меня была такая же проблема и благодаря этому форуму, и некоторые другие нашли ответ. Первоначально я также думал о отдельной теме, но это немного усложняет код. Поэтому я попытался найти ответ, который согласуется с моим принципом "элегантность и простота".
Пожалуйста, посмотрите на такой форум: 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 и, следовательно, вызывает исключение. Я видел комментарии пользователей, что есть планы сделать это.
Добавить
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
Ничего не сделает. Страница будет блокироваться в течение очень долгого времени.
Вы можете установить тайм-аут на 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);
Решение driver.manage(). timeouts(). pageLoadTimeout (10, TimeUnit.SECONDS) будет работать на страницах с синхронизацией, но это не решит проблему на загрузке страниц на асинхронном режиме, тесты будет работать все время, если мы установим pageLoadTimeOut.
Я нахожу, что тайм-аут не достаточно надежны в реальной жизни, особенно для Internet Explorer, однако следующие решения могут помочь:
Вы можете завершить полный тест, используя @Test (timeout = 10000) в тесте junit, из которого вы запускаете процесс селена. Это освободит основной поток для выполнения других тестов, вместо того, чтобы блокировать все шоу. Однако даже это время не работает.
В любом случае по тайм-ауту вы не собираетесь спасать тестовый пример, потому что тайм-аут даже одной операции может привести к тому, что вся тестовая последовательность будет в противоречивом состоянии. Вы можете просто захотеть продолжить работу с другими тестовыми шкафами без блокировки (или, возможно, повторить повторный тест). В таком случае безупречным методом было бы написать poller, который проверяет процессы Webdriver (например, IEDriverServer.exe, Phantomjs.exe), работающие более 10 минут и убивающие их. Пример можно найти в Автоматически идентифицировать (и убивать) процессы с длительным временем обработки
Используется под кодом в аналогичной ситуации
driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
и встроенный код driver.get в try catch, который решил проблему загрузки страниц, которые занимали более 1 минуты.