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