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

Как остановить загрузку страницы в программном обеспечении 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, который является удаленным WebDriver, который использует PhantomJS как фоновый. PhantomJS является безгласным WebKit-скриптом, поэтому я ожидаю, что у меня не возникнут проблемы с реальным браузером, таким как firefox. Для людей, которые не обязаны использовать firefox (обходные цели), я обновлю результаты

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

4b9b3361

Ответ 1

Мне удалось обойти это, сделав несколько вещей.

Сначала установите тайм-аут для webdriver. Например.

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, а затем пытается получить страницу снова. Это может не помочь в вашем случае, но это определенно помогло мне, особенно при выполнении команды webdriver getCurrentUrl(), которая также может занять слишком много времени, иметь предупреждение и потребовать, чтобы страница перестала загружаться, прежде чем вы получите URL-адрес.

Ответ 2

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

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

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

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

Ответ 3

Мое решение состоит в том, чтобы использовать этот класс: 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();");
}

Ответ 4

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

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

Ответ 5

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

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()");
        });

Ответ 6

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

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

Ответ 7

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

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

// ==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);