Как остановить загрузку страницы в firefox программно? - PullRequest
16 голосов
/ 28 марта 2011

Я провожу несколько тестов с 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 (в целях сканирования), я обновлюсь с результатами

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

Ответы [ 8 ]

6 голосов
/ 18 февраля 2014

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

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

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.

2 голосов
/ 06 декабря 2012

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

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

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

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

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

0 голосов
/ 03 ноября 2018

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

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

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

0 голосов
/ 24 сентября 2016

На тот случай, если кто-то еще застрянет с таким же постоянным раздражением при загрузке, вы можете использовать простые дополнения, такие как Killspiners для 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);
0 голосов
/ 24 августа 2016

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

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

0 голосов
/ 18 июня 2015

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

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()");
        });
0 голосов
/ 19 января 2012

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

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

...