Estoy tratando de ZOOM IN y ZOOM OUT del Chrome (Selenio webdriver) solo usando el teclado. Yo he tratado —
from selenium.webdriver.common.keys import Keys driver.find_element_by_tag_name("body").send_keys(Keys.CONTROL,Keys.SUBTRACT).
Pero no está funcionando. Necesito respuesta en python.
Solo estaba luchando con esto. Me las arreglé para encontrar algo que funciona para mí, espero que funcione para ti:
driver.execute_script("document.body.style.zoom='zoom %'")
Tenga ‘zoom%’ = cualquier nivel de zoom que desee. (por ejemplo, ‘67% ‘)
Ambiente:
Probé las formas (sin usar el CSS) que la gente sugirió en otras preguntas en el pasado. Por ejemplo, las respuestas a esta pregunta: Selenium webdriver aumenta o reduce el contenido de la página .
O esto: Probar los niveles de zoom de la página en los navegadores.
sin éxito.
Entonces, pensé: si no fuera por los atajos, ¿cuál podría ser una forma diferente de hacerlo?
La idea es usar la página “chrome: // settings /” para cambiar el zoom:
Ok, lo sé, por ejemplo, de Ir a través de Chrome: // settings by Selenium , que todas las configuraciones deben establecerse en ChromeOptions .
De esta pregunta noté que en la lista de preferencias el único parámetro (creo) podría ser:
// Double that indicates the default zoom level. const char kPartitionDefaultZoomLevel[] = "partition.default_zoom_level";
Lo intenté, sin éxito.
Quiero repetir que sé que no es el enfoque correcto (y que será diferente con diferentes versiones de navegador), pero funciona y, al menos, me fue útil para entender cómo ir dentro de un elemento raíz de sombra con selenium.
El siguiente método devuelve los elementos dentro de una raíz de sombra:
def expand_shadow_element(element): shadow_root = driver.execute_script('return arguments[0].shadowRoot', element) return shadow_root
Es útil porque en la página chrome://settings/
page hay elementos de raíz de sombra.
Para hacer eso, en mi navegador este es el camino:
root1=driver.find_element_by_xpath("*//settings-ui") shadow_root1 = expand_shadow_element(root1) container= shadow_root1.find_element_by_id("container") root2= container.find_element_by_css_selector("settings-main") shadow_root2 = expand_shadow_element(root2) root3=shadow_root2.find_element_by_css_selector("settings-basic-page") shadow_root3 = expand_shadow_element(root3) basic_page = shadow_root3.find_element_by_id("basicPage")
settings_section= basic_page.find_element_by_xpath(".//settings-section[@section='appearance']") root4= settings_section.find_element_by_css_selector("settings-appearance-page") shadow_root4=expand_shadow_element(root4)
y finalmente:
settings_animated_pages= shadow_root4.find_element_by_id("pages") neon_animatable=settings_animated_pages.find_element_by_css_selector("neon-animatable") zoomLevel= neon_animatable.find_element_by_xpath(".//select[@id='zoomLevel']/option[@value='0.5']") zoomLevel.click()
El código completo:
driver = webdriver.Chrome(executable_path=r'/pathTo/chromedriver') 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_xpath("*//settings-ui") shadow_root1 = expand_shadow_element(root1) container= shadow_root1.find_element_by_id("container") root2= container.find_element_by_css_selector("settings-main") shadow_root2 = expand_shadow_element(root2) root3=shadow_root2.find_element_by_css_selector("settings-basic-page") shadow_root3 = expand_shadow_element(root3) basic_page = shadow_root3.find_element_by_id("basicPage") settings_section= basic_page.find_element_by_xpath(".//settings-section[@section='appearance']") root4= settings_section.find_element_by_css_selector("settings-appearance-page") shadow_root4=expand_shadow_element(root4) settings_animated_pages= shadow_root4.find_element_by_id("pages") neon_animatable=settings_animated_pages.find_element_by_css_selector("neon-animatable") zoomLevel= neon_animatable.find_element_by_xpath(".//select[@id='zoomLevel']/option[@value='0.5']") zoomLevel.click() driver.get("https://www.google.co.uk/")
EDITAR
Según lo sugerido por @Florent B en los comentarios, podemos obtener el mismo resultado simple con:
driver.get('chrome://settings/') driver.execute_script('chrome.settingsPrivate.setDefaultZoom(1.5);') driver.get("https://www.google.co.uk/")
Como mencionaste, lo Need it to work in Chrome. The current solutions are only for Firefox
Need it to work in Chrome. The current solutions are only for Firefox
, aquí hay algunas actualizaciones y opciones:
Acercar el CSS:
driver.execute_script("document.body.style.zoom='150%'")
Esta opción funcionó para mí. Pero amplía el CSS, no el navegador Chrome. Así que probablemente no estés mirando eso.
Acercar y alejar el navegador Chrome:
Después de 4131
, 4133
y 1621
el modo de fullscreen()
fue compatible con Zoom In
través de los Clientes de Selenium-Java, pero aún no se ha publicado públicamente en PyPI .
Puedo ver que está implementado pero no presionado.
Selenium 3.7 (Python)
saldrá pronto. El empuje para sincronizar los números de versión incluirá eso.
webdriver
para abrir el navegador: Si su requisito es ejecutar Test Suite
en el modo de Full Screen
completa, siempre puede usar la Clase de Options
y configurar la instancia de --kiosk
con el argumento --kiosk
siguiente manera:
from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_argument("--kiosk") driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe') driver.get('https://www.google.co.in')
La solución de Firefox para mí,
Navegador de cuerpo de zoom
zoom no es una propiedad estándar, use transformar en su lugar (demo):
driver.execute_script("document.body.style.transform = 'scale(0.8)'")
https://github.com/SeleniumHQ/selenium/issues/4244
driver.execute_script('document.body.style.MozTransform = "scale(0.50)";')
driver.execute_script('document.body.style.MozTransformOrigin = "0 0";')
Sí, puedes invocar el controlador Chrome para hacer zoom sin tener que usar CSS. Hay métodos empaquetados en Chrome DevTools Protocol Viewer, uno de los Input.synthesizePinchGesture
es Input.synthesizePinchGesture
también Input.synthesizePinchGesture
como acercar / alejar.
Para facilitar el uso , con respecto a la API del protocolo de DevTools, usaremos una clase llamada MyChromeDriver
con webdriver.Chrome
como una metaclase y un nuevo método para enviar estos comandos a Chrome:
# selenium from selenium import webdriver # json import json class MyChromeDriver(webdriver.Chrome): def send_cmd(self, cmd, params): resource = "/session/%s/chromium/send_command_and_get_result" % self.session_id url = self.command_executor._url + resource body = json.dumps({'cmd':cmd, 'params': params}) response = self.command_executor._request('POST', url, body) return response.get('value')
1. Configura nuestro webdriver y get
alguna página:
webdriver = MyChromeDriver() webdriver.get("https://google.com")
2. Envíe a Chrome el comando Input.synthesizePinchGesture
junto con sus parámetros a través de nuestro nuevo método send_cmd
:
webdriver.send_cmd('Input.synthesizePinchGesture', { 'x': 0, 'y': 0, 'scaleFactor': 2, 'relativeSpeed': 800, # optional 'gestureSourceType': 'default' # optional })
3. Walla! Se invoca el zoom de Chrome:
Como nota al margen, hay send_cmd
otros comandos que podrías usar con send_cmd
. Encuéntrelos aquí: https://chromedevtools.github.io/devtools-protocol/
Basado en esta respuesta: toma una captura de pantalla de página completa en Chrome con Selenium