¿Podemos hacer zoom en la ventana del navegador en python selenium webdriver?

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:

  • Selenio 3.6.0
  • Chromedriver 2,33
  • Chrome versión 62.0.3202.75 (comstackción oficial) (64 bits)
  • macOS Sierra 10.12.6

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:

introduzca la descripción de la imagen aquí

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") 

introduzca la descripción de la imagen aquí

 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) 

introduzca la descripción de la imagen aquí

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() 

introduzca la descripción de la imagen aquí

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/") 

introduzca la descripción de la imagen aquí

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:

  1. 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.

  2. 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.

  1. Configure el 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: introduzca la descripción de la imagen aquí

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