it-swarm.com.ru

Как настроить тайм-аут на получение доступа к Selenium?

Когда я использую прокси в веб-драйвере, например 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 секунд, а если страница не загружена, выдается исключение.

29
福气鱼

Попробуй это:

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

Методы 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 (), может оказаться заблокированным. К сожалению, у меня нет решений для заблокированных драйверов.

23
user1102631

пытаться 

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

это утверждение вернется немедленно.

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

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

8
JasonYou

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

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

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

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

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

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

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

5
Lukasz

Добавлять 

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

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

2
zhongting

Вы можете установить тайм-аут на клиенте 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);
2
flob

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

1
sou

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

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

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

0
premganz

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

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

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

0
Manjunath24