Не хотите, чтобы изображения загружались и CSS отображался в Firefox в Selenium WebDriver - Python
Я использую Selenium 2 с привязками python для получения некоторых данных с нашего сайта-партнера. Но в среднем это занимает около 13 секунд для выполнения этой операции.
Я искал способ отключения изображений css, flash и т.д.
Я использую Firefox 3.6, а также используя pyvirtualdisplay для предотвращения открытия окна firefox. Также будет полезной любая другая оптимизация для ускорения работы Firefox.
Я уже пробовал опции network.http.*
, но не очень помог.
А также установите permissions.default.image = 2
Ответы
Ответ 1
Я выяснил, как запретить Firefox загружать CSS, изображения и Flash.
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
def disableImages(self):
## get the Firefox profile object
firefoxProfile = FirefoxProfile()
## Disable CSS
firefoxProfile.set_preference('permissions.default.stylesheet', 2)
## Disable images
firefoxProfile.set_preference('permissions.default.image', 2)
## Disable Flash
firefoxProfile.set_preference('dom.ipc.plugins.enabled.libflashplayer.so',
'false')
## Set the modified profile while creating the browser object
self.browserHandle = webdriver.Firefox(firefoxProfile)
Еще раз спасибо @Simon и @ernie за ваши предложения.
Ответ 2
К сожалению, опция firefox_profile.set_preference('permissions.default.image', 2)
больше не работает, чтобы отключить изображения с последней версией Firefox - [для причины см. Alecxe ответ на мой вопрос Невозможно отключить изображения в Selenium/Firefox]
Лучшим решением было использовать расширение firefox quickjava, которое, среди прочего, может отключить образы - https://addons.mozilla.org/en-us/firefox/addon/quickjava/
Мой код Python:
from selenium import webdriver
firefox_profile = webdriver.FirefoxProfile()
firefox_profile.add_extension(folder_xpi_file_saved_in + "\\quickjava-2.0.6-fx.xpi")
firefox_profile.set_preference("thatoneguydotnet.QuickJava.curVersion", "2.0.6.1") ## Prevents loading the 'thank you for installing screen'
firefox_profile.set_preference("thatoneguydotnet.QuickJava.startupStatus.Images", 2) ## Turns images off
firefox_profile.set_preference("thatoneguydotnet.QuickJava.startupStatus.AnimatedImage", 2) ## Turns animated images off
driver = webdriver.Firefox(firefox_profile)
driver.get(web_address_desired)
Отключение CSS (и, я думаю, flash) по-прежнему работает с файлами firefox. но они и другие части также могут быть отключены путем добавления строк:
firefox_profile.set_preference("thatoneguydotnet.QuickJava.startupStatus.CSS", 2) ## CSS
firefox_profile.set_preference("thatoneguydotnet.QuickJava.startupStatus.Cookies", 2) ## Cookies
firefox_profile.set_preference("thatoneguydotnet.QuickJava.startupStatus.Flash", 2) ## Flash
firefox_profile.set_preference("thatoneguydotnet.QuickJava.startupStatus.Java", 2) ## Java
firefox_profile.set_preference("thatoneguydotnet.QuickJava.startupStatus.JavaScript", 2) ## JavaScript
firefox_profile.set_preference("thatoneguydotnet.QuickJava.startupStatus.Silverlight", 2)
Ответ 3
Новое редактирование
Прошло так много времени с тех пор, как я написал это, и я могу сказать, что область веб-автоматизации (в целях тестирования или сканирования/сканирования) сильно изменилась. Основные браузеры уже представили флаг --headless
и даже интерактивную оболочку. Больше не нужно менять старую добрую переменную DISPLAY
в Linux.
Firefox также изменился и перешел на движок Servo, написанный на Rust. Я попробовал профиль ниже с современной версией (в частности, 62.0). Некоторые работали, некоторые нет. Имейте это в виду.
Я просто расширяю ответ кирении в этом вопросе. Однако отключение CSS может привести к тому, что Jquery не сможет манипулировать элементами DOM. Используйте QuickJava и те, что ниже:
profile.set_preference("network.http.pipelining", True)
profile.set_preference("network.http.proxy.pipelining", True)
profile.set_preference("network.http.pipelining.maxrequests", 8)
profile.set_preference("content.notify.interval", 500000)
profile.set_preference("content.notify.ontimer", True)
profile.set_preference("content.switch.threshold", 250000)
profile.set_preference("browser.cache.memory.capacity", 65536) # Increase the cache capacity.
profile.set_preference("browser.startup.homepage", "about:blank")
profile.set_preference("reader.parse-on-load.enabled", False) # Disable reader, we won't need that.
profile.set_preference("browser.pocket.enabled", False) # Duck pocket too!
profile.set_preference("loop.enabled", False)
profile.set_preference("browser.chrome.toolbar_style", 1) # Text on Toolbar instead of icons
profile.set_preference("browser.display.show_image_placeholders", False) # Don't show thumbnails on not loaded images.
profile.set_preference("browser.display.use_document_colors", False) # Don't show document colors.
profile.set_preference("browser.display.use_document_fonts", 0) # Don't load document fonts.
profile.set_preference("browser.display.use_system_colors", True) # Use system colors.
profile.set_preference("browser.formfill.enable", False) # Autofill on forms disabled.
profile.set_preference("browser.helperApps.deleteTempFileOnExit", True) # Delete temprorary files.
profile.set_preference("browser.shell.checkDefaultBrowser", False)
profile.set_preference("browser.startup.homepage", "about:blank")
profile.set_preference("browser.startup.page", 0) # blank
profile.set_preference("browser.tabs.forceHide", True) # Disable tabs, We won't need that.
profile.set_preference("browser.urlbar.autoFill", False) # Disable autofill on URL bar.
profile.set_preference("browser.urlbar.autocomplete.enabled", False) # Disable autocomplete on URL bar.
profile.set_preference("browser.urlbar.showPopup", False) # Disable list of URLs when typing on URL bar.
profile.set_preference("browser.urlbar.showSearch", False) # Disable search bar.
profile.set_preference("extensions.checkCompatibility", False) # Addon update disabled
profile.set_preference("extensions.checkUpdateSecurity", False)
profile.set_preference("extensions.update.autoUpdateEnabled", False)
profile.set_preference("extensions.update.enabled", False)
profile.set_preference("general.startup.browser", False)
profile.set_preference("plugin.default_plugin_disabled", False)
profile.set_preference("permissions.default.image", 2) # Image load disabled again
Что это делает? Вы можете увидеть, что он делает в комментариях. Тем не менее, я также нашел пару записей о: config для увеличения производительности. Например, приведенный выше код не загружает шрифт или цвета документа, но загружает CSS, поэтому Jquery -or любой другой library- может манипулировать элементами DOM и не вызывает ошибку. (Для дальнейшей отладки вы все равно загружаете CSS, но ваш браузер будет переходить по строкам, содержащим специальное семейство шрифтов или определение цвета. Таким образом, браузер будет загружать и загружать CSS, но использовать системные настройки по умолчанию и стилизовать страницу быстрее. )
Для получения дополнительной информации ознакомьтесь с этой статьей.
Изменить (Тесты)
Я только что сделал тест производительности. Вам не нужно серьезно относиться к результатам, так как я сделал этот тест только один раз, чтобы у вас была идея.
Я провел тест на старой машине на процессоре Intel Pentium с тактовой частотой 2,2 ГГц, оперативной памяти 3 ГБ с областью подкачки 4 ГБ, системе Ubuntu 14.04 x64.
Тест состоит из трех этапов:
- Производительность загрузки драйвера: секунды, потраченные на загрузку драйвера в модуле
webdriver
.
- Производительность загрузки страницы: количество секунд, потраченных на загрузку страницы. Он также включает в себя скорость интернета, однако процесс рендеринга также включен.
- DOM Проверка производительности: DOM проверяет скорость на странице.
Я использовал эту страницу как тему и осмотрел .xxy a
как селектор CSS. Затем я использовал специальный процесс один за другим.
Селен, Firefox, без профиля
Driver Loading Performance: 13.124099016189575
Page Loading Performance: 3.2673521041870117
DOM Inspecting Performance: 67.82778096199036
Selenium, Firefox, профиль выше
Driver Loading Performance: 7.535895824432373
Page Loading Performance: 2.9704301357269287
DOM Inspecting Performance: 64.25136017799377
Изменить (О безголовости)
Я сделал тест, может быть, месяц назад, но я не мог взять результаты. Тем не менее, я хочу упомянуть, что загрузка драйвера, загрузка страниц и скорость проверки DOM снижаются менее чем за десять секунд, когда Firefox используется без заголовка. Это было действительно круто.
Ответ 4
Вы можете отключить изображения /css с помощью панели инструментов веб-разработчика.
https://addons.mozilla.org/en-US/firefox/addon/web-developer/
перейти к CSS- > Disable и Images- > Disable
Ответ 5
Для всех, кто заинтересован в использовании оригинального прямого подхода, предложенного Anupam:
Просто установите firefox версию 20.0.1 (https://ftp.mozilla.org/pub/firefox/releases/20.0.1/) - отлично работает.
Другие версии могут работать (версии 32 и выше и версии 3.6.9 и ниже НЕ работают)
Ответ 6
Бросаю в свои 2 ¢.
Лучше использовать фрагменты JavaScript для выполнения.
driver.execute_script(
'document.querySelectorAll("img").forEach(function(ev){ev.remove()});'
);
Это удалит элементы img. Если вы сделаете это сразу после загрузки страницы, у них будет мало шансов загрузить данные изображения.
Вот аналогичное решение, которое я нашел в другом месте на Кару. (Больше не могу его найти)
driver.execute_script(
"document.head.parentNode.removeChild(document.head)"
);