在Selenium Python中禁用图片

11 投票
4 回答
15028 浏览
提问于 2025-04-18 16:37

因为Webdriver在继续执行下一行代码之前,会等整个页面加载完,所以我觉得关闭图片、CSS和JavaScript可以加快速度。

from selenium import webdriver
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)

我从StackOverflow上找到了这段代码,链接是 在Selenium WebDriver测试中不想让Firefox加载图片和渲染CSS

但是当我在最后加上

driver = webdriver.Firefox()
driver.get("http://www.stackoverflow.com/")

后,它还是会加载图片 :/

4 个回答

2

我知道这是一个关于 的问题,但它对我使用 facebook/php-webdriver 有帮助。(在搜索引擎中搜索 php webdriver disable javascript 的第一个结果)

我想把我的代码分享出来(这是 @kyrenia 的答案的修改版,适用于 ),希望能帮助其他人快速上手。


安装所有东西

  1. 下载并安装 facebook/php-webdriver。可以用命令 composer require facebook/webdriver 来安装。

  2. 下载 Selenium 并启动它。可以用命令 java -jar selenium-server-standalone-#.jar 来运行。

  3. 下载 Quick Java,并把它放到你的项目目录里。


使用方法

use Facebook\WebDriver\Firefox\FirefoxProfile;
use Facebook\WebDriver\Firefox\FirefoxDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;

// Change this to the path of you xpi
$extensionPath = $this->container->getParameter('kernel.root_dir').'/../bin/selenium/quickjava-2.0.6-fx.xpi';

// Build our firefox profile
$profile = new FirefoxProfile();
$profile->addExtension($extensionPath);
$profile->setPreference('thatoneguydotnet.QuickJava.curVersion', '2.0.6.1');
$profile->setPreference('thatoneguydotnet.QuickJava.startupStatus.Images', 2);
$profile->setPreference('thatoneguydotnet.QuickJava.startupStatus.AnimatedImage', 2);
$profile->setPreference('thatoneguydotnet.QuickJava.startupStatus.CSS', 2);
//$profile->setPreference('thatoneguydotnet.QuickJava.startupStatus.Cookies', 2);
$profile->setPreference('thatoneguydotnet.QuickJava.startupStatus.Flash', 2);
$profile->setPreference('thatoneguydotnet.QuickJava.startupStatus.Java', 2);
//$profile->setPreference('thatoneguydotnet.QuickJava.startupStatus.JavaScript', 2);
$profile->setPreference("thatoneguydotnet.QuickJava.startupStatus.Silverlight", 2);

// Create DC
$dc = DesiredCapabilities::firefox();
$dc->setCapability(FirefoxDriver::PROFILE, $profile);

// Create our new driver
$driver = RemoteWebDriver::create($host, $dc);
$driver->get('http://stackoverflow.com');

// The HTML Source code
$html = $driver->getPageSource();

// Firefox should be open and you can see no images or css was loaded

想了解更多的偏好设置,可以查看这里: https://github.com/ThatOneGuyDotNet/QuickJava/blob/master/defaults/preferences/defaults.js

4

我发现大家认可的答案对我也没用。从kyrenia提到的“原因”链接中,我了解到Firefox在第一次启动时会覆盖“permissions.default.image”这个设置。为了防止这种情况发生,我采取了以下措施:

# Arbitrarily high number
profile.set_preference('browser.migration.version', 9001)

这样做似乎没问题,因为我每次启动驱动时都会创建一个新的配置文件,所以其实没有什么需要迁移的东西。

20

很遗憾,选项 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)

你还可以通过添加以下几行代码来关闭其他功能:

  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)  ## Silverlight
18

更新: 这个答案可能不再有效,因为 permissions.default.image 现在是一个固定的设置,无法更改。请尝试使用 quickjava 插件(链接到答案)。


你需要把 firefox_profile 实例传递给 webdriver 的构造函数:

from selenium import webdriver

firefox_profile = webdriver.FirefoxProfile()
firefox_profile.set_preference('permissions.default.stylesheet', 2)
firefox_profile.set_preference('permissions.default.image', 2)
firefox_profile.set_preference('dom.ipc.plugins.enabled.libflashplayer.so', 'false')

driver = webdriver.Firefox(firefox_profile=firefox_profile)
driver.get('http://www.stackoverflow.com/')

driver.close()

这就是它的显示方式:

在这里输入图片描述

撰写回答