Je passe beaucoup de temps à chercher à ce sujet… .. À la fin de la journée, j'ai combiné plusieurs réponses et cela fonctionne. Je partage ma réponse et je l'apprécierai si quelqu'un la modifie ou nous fournit un moyen plus simple de le faire.
1- La réponse dans Désactiver les images dans Selenium Google ChromeDriver fonctionne en Java. Nous devrions donc faire la même chose en Python:
opt = webdriver.ChromeOptions()
opt.add_extension("Block-image_v1.1.crx")
browser = webdriver.Chrome(chrome_options=opt)
2- Mais télécharger "Block-image_v1.1.crx" est un peu délicat, car il n’existe aucun moyen direct de le faire. Pour cela, au lieu d'aller à: https://chrome.google.com/webstore/detail/block-image/pehaalcefcjfccdpbckoablngfkfgfgj
vous pouvez aller à http://chrome-extension-downloader.com/ et coller l'URL d'extension ici pour pouvoir télécharger le fichier d'extension.
3- Ensuite, vous pourrez utiliser le code mentionné ci-dessus avec le chemin du fichier d'extension que vous avez téléchargé.
Voici un autre moyen de désactiver les images:
from Selenium import webdriver
chrome_options = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images": 2}
chrome_options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(chrome_options=chrome_options)
Je l'ai trouvé ci-dessous:
Il existe un autre moyen qui vient probablement à l'esprit pour tout le monde d'accéder à chrome://settings
, puis de passer en revue les paramètres avec Selenium. J'ai commencé de cette façon juste pour la curiosité didactique, mais je me suis heurté à une forêt d'éléments d'ombres lorsque vous rencontrez plus de 3 ombres. L'élément racine associé à un contenu dynamique est clairement un moyen de masquer et d'empêcher l'automatisation, bien que cela puisse sembler théoriquement possible au moins théoriquement, cette approche ressemble davantage à une impasse, je laisserai cette réponse avec l'exemple de code, uniquement pour à des fins d’apprentissage pour faire connaître les personnes tentées de relever le défi. . Non seulement il était difficile de trouver uniquement les paramètres de contenu en raison des changements rapides et dynamiques lorsque vous trouvez que le bouton n'est pas cliquable à ce stade.
driver = webdriver.Chrome()
def expand_shadow_element(element):
shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
return shadow_root
driver.get("chrome://settings")
root1 = driver.find_element_by_tag_name('settings-ui')
shadow_root1 = expand_shadow_element(root1)
root2 = shadow_root1.find_element_by_css_selector('[page-name="Settings"]')
shadow_root2 = expand_shadow_element(root2)
root3 = shadow_root2.find_element_by_id('search')
shadow_root3 = expand_shadow_element(root3)
search_button = shadow_root3.find_element_by_id("searchTerm")
search_button.click()
text_area = shadow_root3.find_element_by_id('searchInput')
text_area.send_keys("content settings")
root0 = shadow_root1.find_element_by_id('main')
shadow_root0_s = expand_shadow_element(root0)
root1_p = shadow_root0_s.find_element_by_css_selector('settings-basic-page')
shadow_root1_p = expand_shadow_element(root1_p)
root1_s = shadow_root1_p.find_element_by_css_selector('settings-privacy-page')
shadow_root1_s = expand_shadow_element(root1_s)
content_settings_div = shadow_root1_s.find_element_by_css_selector('#site-settings-subpage-trigger')
content_settings = content_settings_div.find_element_by_css_selector("button")
content_settings.click()
Java: Avec ce Chrome, ni Firefox ne chargerait des images. La syntaxe est différente mais les chaînes de paramètres sont les mêmes.
chromeOptions = new ChromeOptions();
HashMap<String, Object> images = new HashMap<String, Object>();
images.put("images", 2);
HashMap<String, Object> prefs = new HashMap<String, Object>();
prefs.put("profile.default_content_setting_values", images);
chromeOptions.setExperimentalOption("prefs", prefs);
driver=new ChromeDriver(chromeOptions);
firefoxOpt = new FirefoxOptions();
FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("permissions.default.image", 2);
firefoxOpt.setProfile(profile);