Как программно остановить загрузку страницы в firefox?

Я провожу несколько тестов с WebDriver и Firefox.

У меня возникла проблема со следующей командой:

WebDriver.get(www.google.com);

С помощью этой команды WebDriver блокируется до тех пор, пока не будет запущено событие onload. Хотя обычно это занимает секунды, на веб-сайтах, которые никогда не заканчивают загрузку, на это могут уйти часы.

Что я хотел бы сделать, так это остановить загрузку страницы после определенного тайм-аута, каким-то образом имитируя кнопку остановки Firefox.

Сначала я пытался выполнять следующий код JS каждый раз, когда пытался загрузить страницу:

var loadTimeout=setTimeout(\"window.stop();\", 10000);

К сожалению, это не работает, вероятно, потому что:

Из-за порядка загрузки сценариев метод stop() не может остановить загрузку документа, в котором он содержится, 1.

ОБНОВЛЕНИЕ 1: я пытался использовать SquidProxy, чтобы добавить время ожидания соединения и запроса, но проблема осталась.

Одна странная вещь, которую я обнаружил сегодня, заключается в том, что один веб-сайт, который никогда не переставал загружаться на моем компьютере (FF3.6 - 4.0 и Mac Os 10.6.7), нормально загружался в других браузерах и/или компьютерах.

ОБНОВЛЕНИЕ 2: проблему, по-видимому, можно решить, указав Firefox не загружать изображения. надеюсь после этого все заработает...

Я бы хотел, чтобы у WebDriver был лучший драйвер Chrome, чтобы использовать его. Firefox разочаровывает меня каждый день!

ОБНОВЛЕНИЕ 3: в Selenium 2.9 добавлена ​​новая функция для обработки случаев, когда драйвер зависает. Это можно использовать с FirefoxProfile следующим образом:

FirefoxProfile firefoxProfile = new ProfilesIni().getProfile("web");
firefoxProfile.setPreference("webdriver.load.strategy", "fast");

Я опубликую, работает ли это после того, как попробую.

ОБНОВЛЕНИЕ 4: в конце ни один из вышеперечисленных методов не сработал. Я заканчиваю тем, что "убью" потоки, которые требуют много времени для завершения. Я планирую попробовать Ghostdriver, который представляет собой удаленный веб-драйвер, использующий PhantomJS в качестве серверной части. PhantomJS — это безголовый сценарий WebKit, поэтому я ожидаю, что у него не будет проблем с настоящим браузером, таким как Firefox. Для людей, которые не обязаны использовать firefox (для сканирования), я сообщу о результатах.

ОБНОВЛЕНИЕ 5: Время для обновления. Используя в течение 5 месяцев ghostdriver 1.1 вместо FirefoxDriver, я могу сказать, что я действительно доволен его производительностью и стабильностью. У меня было несколько случаев, когда у нас не было надлежащего поведения, но, похоже, в целом ghostdriver достаточно стабилен. Поэтому, если вам, как и мне, нужен браузер для сканирования/скрапинга, я рекомендую вам использовать ghostdriver вместо firefox и xvfb, которые доставят вам несколько головных болей...


person ArisRe82    schedule 28.03.2011    source источник
comment
К сожалению, нет. Я заканчиваю тем, что убиваю потоки, у которых есть неостановленная загрузка страницы..   -  person ArisRe82    schedule 08.12.2013


Ответы (8)


Я смог обойти это, сделав несколько вещей.

Во-первых, установите тайм-аут для веб-драйвера. Например.,

WebDriver wd;
... initialize wd ...
wd.manage().timeouts().pageLoadTimeout(5000, TimeUnit.MILLISECONDS);

Во-вторых, при выполнении get оберните его вокруг исключения TimeoutException. (Я добавил туда перехват UnhandledAlertException просто для верности.) Например,

for (int i = 0; i < 10; i++) {
    try {
        wd.get(url);
        break;
    } catch (org.openqa.selenium.TimeoutException te) {
        ((JavascriptExecutor)wd).executeScript("window.stop();");
    } catch (UnhandledAlertException uae) {
        Alert alert = wd.switchTo().alert();
        alert.accept();
    }
 }

Это в основном пытается загрузить страницу, но если время ожидания истекает, страница прекращает загрузку через javascript, а затем пытается снова получить страницу. Это может не помочь в вашем случае, но определенно помогло в моем, особенно при выполнении команды getCurrentUrl() веб-драйвера, которая также может занять слишком много времени, иметь предупреждение и требовать остановки загрузки страницы, прежде чем вы получите URL-адрес.

person Marcus    schedule 18.02.2014
comment
спасибо за Ваш ответ. Выглядит законно. я собираюсь попробовать и дам вам знать. - person ArisRe82; 05.03.2014

Я столкнулся с той же проблемой, и, похоже, нет общего решения. Однако в их системе отслеживания ошибок есть ошибка, которую вы можете «пометить», чтобы проголосовать за нее.

http://code.google.com/p/selenium/issues/detail?id=687

В одном из комментариев к этой ошибке есть обходной путь, который может сработать для вас. По сути, он создает отдельный поток, который ждет необходимое время, а затем пытается имитировать нажатие escape в браузере, но для этого требуется, чтобы окно браузера было самым передним , что может быть проблемой.

http://code.google.com/p/selenium/issues/detail?id=687#c4

person Matt Sheppard    schedule 20.06.2011
comment
Да... я уже пробовал это тоже... не повезло из-за распараллеливания тестов... мне интересно, сделает ли кто-нибудь из WebDriver или Firefox что-нибудь для этого... - person ArisRe82; 21.06.2011

Мое решение — использовать этот класс: WebDriverBackedSelenium;

//When creating a new browser:
WebDriver driver = _initBrowser(); //Just returns firefox WebDriver
WebDriverBackedSelenium backedSelenuium = 
            new WebDriverBackedSelenium(driver,"about:blank");    

//This code has to be put where a TimeOut is detected
//I use ExecutorService and Future<?> Object

void onTimeOut()
{
    backedSelenuium.runScript("window.stop();");
}
person Vincent Bouvier    schedule 06.12.2012
comment
Можете ли вы предоставить совместимое с ruby ​​решение для того же? Я застрял в этой области. - person DoLoveSky; 04.02.2013

Одна странная вещь, которую я обнаружил сегодня, заключается в том, что один веб-сайт, который никогда не перестает загружаться на моем компьютере (FF3.6 - 4.0 и Mac Os 10.6.7), перестает загружаться НОРМАЛЬНО в Chrome на моем компьютере, а также в других Mac O и Windows. машины какого-то моего коллеги!

Я думаю, что проблема тесно связана с ошибками Firefox. См. эту запись в блоге. Детали. Возможно, обновление FireFox до последней версии решит вашу проблему. В любом случае, я хочу увидеть обновление Selenium, которое имитирует кнопку "стоп"...

person gamliela    schedule 19.01.2012

В основном я устанавливаю время ожидания браузера ниже, чем у моего селенового концентратора, а затем ловлю ошибку. А затем остановите загрузку браузера, затем продолжите тест.

webdriver.manage().timeouts().pageLoadTimeout(55000);

function handleError(err){
          console.log(err.stack);
        };


return webdriver.get(url).then(null,handleError).then(function () {
            return webdriver.executeScript("return window.stop()");
        });

person buddy    schedule 18.06.2015

Что ж, у меня в Chrome сработала следующая концепция, попробуйте то же самое:

1) Перейдите к "about:blank" 2) получите элемент "body" 3) на elemënt просто отправьте ключи Ësc

person Ahmed OSama    schedule 24.08.2016

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

driver= webdriver.Firefox()
driver.set_page_load_timeout(5)
driver.get('somewebpage')

У меня это сработало с использованием драйвера Firefox (а также драйвера Chrome).

person Taher Ahmed Ghaleb    schedule 03.11.2018

На всякий случай, если кто-то еще может столкнуться с такой же вечной раздражающей загрузкой, вы можете использовать простые надстройки, такие как Killspinners для Firefox, чтобы без особых усилий выполнять свою работу.

Изменить: это решение не работает, если проблема связана с javascript. Затем вы можете использовать скрипт Greasemonkey, например:

// ==UserScript==
// @name        auto kill
// @namespace   default
// @description auto kill
// @include     *
// @version     1
// @grant       none
// ==/UserScript==

function sleep1() {
  window.stop();
  setTimeout(sleep1, 1500);
}

setTimeout(sleep1, 5000);

person Rocket Jump    schedule 24.09.2016