不希望图像加载和 CSS 在 Selenium WebDriver 中的 Firefox 上呈现 - Python
Posted
技术标签:
【中文标题】不希望图像加载和 CSS 在 Selenium WebDriver 中的 Firefox 上呈现 - Python【英文标题】:Do not want the Images to load and CSS to render on Firefox in Selenium WebDriver - Python 【发布时间】:2011-11-01 17:56:17 【问题描述】:我正在使用 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 的建议。
【讨论】:
禁用图像的解决方案不再适用于最新版本的 firefox - 请参阅下面的答案(感谢 Alecxe 指出了正确的方向) @kyrenia 还是不行吗?如果没有,我将接受现在实际有效的答案。 是的 - 我相信,至少对于图像,更改“设置首选项”标志在所有最新版本的 firefox 中都被阻止(我认为您仍然可以禁用 css 和 flash) css 在我使用时没有被禁用!【参考方案2】:新编辑
自从我写这篇文章以来已经很久了,我可以说网络自动化领域(无论是用于测试还是用于抓取/抓取目的)已经发生了很大变化。主流浏览器已经提供了--headless
标志,甚至是交互式shell。无需再更改 Linux 上的旧 DISPLAY
变量。
Firefox 也发生了变化,迁移到使用 Rust 编写的 Servo 引擎。我已经使用现代版本(特别是 62.0)尝试了下面的配置文件。有些工作,有些没有。请记住这一点。
我只是在这个问题中扩展the answer of kyrenia。但是,禁用 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
它有什么作用?您实际上可以在注释行中看到它的作用。但是,我还发现了一些 about:config 条目来提高性能。例如,上面的代码不会加载文档的字体或颜色,但会加载 CSS,因此 Jquery - 或任何其他库 - 可以操作 DOM 元素并且不会引发错误。 (为了进一步调试,您仍然下载 CSS,但您的浏览器将跳转包含特殊字体系列或颜色定义的行。因此浏览器将下载并加载 CSS,但在样式中使用系统默认值并更快地呈现页面。 )
欲了解更多信息,check out this article。
编辑(测试)
我刚刚做了一个性能测试。你不需要认真对待结果,因为我只做了一次这个测试,让你有一个想法。
我在一台旧机器上进行了测试,使用 2.2 gHZ Intel Pentium 处理器、3 gB RAM 和 4gB 交换区、Ubuntu 14.04 x64 系统。
测试分三个步骤:
驱动程序加载性能:在webdriver
模块中加载驱动程序所浪费的秒数。
页面加载性能:加载页面所浪费的秒数。它还包括互联网速度,但也包括渲染过程。
DOM Inspecting Performance:页面上的 DOM 检查速度。
我使用this page 作为主题并检查.xxy a
作为 CSS 选择器。然后我一个一个地用了一个特殊的过程。
Selenium、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
编辑(关于无头)
我可能在一个月前进行了测试,但我无法获得结果。但是,我想提一下,当 Firefox 无头使用时,驱动程序加载、页面加载和 DOM 检查速度会在 10 秒 内下降。那真是太棒了。
【讨论】:
【参考方案3】:不幸的是,firefox_profile.set_preference('permissions.default.image', 2)
选项似乎不再适用于使用最新版本的 Firefox 禁用图像 - [原因请参阅 Alecxe 对我的问题Can't turn off images in 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)
【讨论】:
设置permissions.default.image
在 Firefox 66.0.5 上适用于我。【参考方案4】:
您可以使用 Web Developer 工具栏插件禁用图像/css。
https://addons.mozilla.org/en-US/firefox/addon/web-developer/
转到 CSS->禁用和图像->禁用
【讨论】:
谢谢西蒙,我会试一试,但我可以通过 Firefox 配置文件来完成。我将使用 selenium grid 2 创建一个机器集群,为我获取这些数据。我想通过配置或代码更改来完成此操作(即在我正在编写的硒代码中)。如果这可行,请告诉我。 我假设一个 Greasemonkey 脚本删除 css/images 一样吗? 您可以使用插件并创建自定义配置文件,然后使用seleniumhq.org/docs/03_webdriver.html 的“修改 Firefox 配置文件”部分中的信息加载配置文件。添加为评论,因为我没有测试自定义配置文件位。 . . 感谢 ernie 和 Simon,我将尝试这两种方法并将结果发布到小组中。【参考方案5】:对于仍然有兴趣使用 Anupam 建议的原始直接方法的每个人:
只需安装 Firefox 版本 20.0.1 (https://ftp.mozilla.org/pub/firefox/releases/20.0.1/) - 工作得很好。
其他版本也可以工作(32 及更高版本和 3.6.9 及更低版本不工作)
【讨论】:
【参考方案6】:扔进我的 2 美分。
最好用javascript sn-ps来完成。
driver.execute_script(
'document.querySelectorAll("img").forEach(function(ev)ev.remove());'
);
这将删除 img 元素。如果您在加载页面后立即执行此操作,他们将几乎没有机会下载图像数据。
这是我在 *** 其他地方找到的类似解决方案。 (找不到了)
driver.execute_script(
"document.head.parentNode.removeChild(document.head)"
);
【讨论】:
以上是关于不希望图像加载和 CSS 在 Selenium WebDriver 中的 Firefox 上呈现 - Python的主要内容,如果未能解决你的问题,请参考以下文章
selenium模块无头化浏览器 设置不加载页面css图片js
Selenium:如何使用 firefox 和 python 禁用图像加载?