type examples example code python selenium

examples - selenium python example code



¿Cómo tomar una captura de pantalla parcial con Selenium WebDriver en python? (6)

He buscado mucho para esto pero no he podido encontrar una solución. Aquí hay una pregunta similar con una posible solución en java.

¿Hay una solución similar en Python?


Ampliando los comentarios en respuesta a la muy buena respuesta de RandomPhobia, aquí hay dos soluciones con declaraciones de importación correctas que abrirán una captura de pantalla completa sin guardar primero en un archivo:

from selenium import webdriver from PIL import Image from StringIO import StringIO import base64 DRIVER = ''chromedriver'' browser = webdriver.Chrome(DRIVER) browser.get( "http:////www.bbc.co.uk" ) img 1 = Image.open(StringIO(base64.decodestring(browser.get_screenshot_as_base64()))) img 2 = Image.open(StringIO(browser.get_screenshot_as_png()))

Y porque estoy seguro de que su próxima pregunta es: "Bueno, eso es genial, pero ¿cuál es el más rápido?", Así es cómo determinarlo (el primer método me parece que es el más rápido a cierta distancia):

import timeit setup = '''''' from selenium import webdriver from PIL import Image from StringIO import StringIO import base64 DRIVER = ''chromedriver'' browser = webdriver.Chrome(DRIVER) browser.get( "http:////www.bbc.co.uk" ) file_name = ''tmp.png'' '''''' print timeit.Timer(''Image.open(StringIO(browser.get_screenshot_as_png()))'', setup=setup).repeat(2, 10) print timeit.Timer(''Image.open(StringIO(base64.decodestring(browser.get_screenshot_as_base64())))'', setup=setup).repeat(2, 10) print timeit.Timer(''browser.get_screenshot_as_file(file_name); pil_img = Image.open(file_name)'', setup=setup).repeat(2, 10)


Aquí hay una función que hace justamente eso. Los tamaños se deben convertir en enteros antes de pasarlos a la función de recorte:

from PIL import Image from StringIO import StringIO def capture_element(element,driver): location = element.location size = element.size img = driver.get_screenshot_as_png() img = Image.open(StringIO(img)) left = location[''x''] top = location[''y''] right = location[''x''] + size[''width''] bottom = location[''y''] + size[''height''] img = img.crop((int(left), int(top), int(right), int(bottom))) img.save(''screenshot.png'')


Escribí esta útil función de python3.

from base64 import b64decode from wand.image import Image from selenium.webdriver.remote.webelement import WebElement from selenium.webdriver.common.action_chains import ActionChains import math def get_element_screenshot(element: WebElement) -> bytes: driver = element._parent ActionChains(driver).move_to_element(element).perform() # focus src_base64 = driver.get_screenshot_as_base64() scr_png = b64decode(src_base64) scr_img = Image(blob=scr_png) x = element.location["x"] y = element.location["y"] w = element.size["width"] h = element.size["height"] scr_img.crop( left=math.floor(x), top=math.floor(y), width=math.ceil(w), height=math.ceil(h), ) return scr_img.make_blob()

Devuelve la imagen png del elemento mostrado como bytes. Limitación: el elemento debe caber en la ventana gráfica.
Debe instalar el módulo de varita para trabajar con él.


Esta pregunta parece haber pasado mucho tiempo sin respuesta, pero después de haber trabajado en ella, pensé que iba a transmitir algunas de las cosas que aprendí

Nota: además de Selenium, este ejemplo también requiere la biblioteca de PIL Imaging. A veces esto se presenta como una de las bibliotecas estándar y otras no, pero si no lo tienes puedes obtenerlo here

from selenium import webdriver from PIL import Image from io import BytesIO fox = webdriver.Firefox() fox.get(''http://.com/'') # now that we have the preliminary stuff out of the way time to get that image :D element = fox.find_element_by_id(''hlogo'') # find part of the page you want image of location = element.location size = element.size png = fox.get_screenshot_as_png() # saves screenshot of entire page fox.quit() im = Image.open(BytesIO(png)) # uses PIL library to open image in memory left = location[''x''] top = location[''y''] right = location[''x''] + size[''width''] bottom = location[''y''] + size[''height''] im = im.crop((left, top, right, bottom)) # defines crop points im.save(''screenshot.png'') # saves new cropped image

y la salida final es .... tambor roll el logo !!!

ahora, por supuesto, esto sería excesivo para obtener una imagen estática, pero si desea obtener algo que requiere Javascript para llegar a esto, podría ser una solución viable.


Este tipo llamado "Cherri" hizo una biblioteca para Selenium que incluye esto.

import SeleniumUrllib as selenium selenium_urllib = selenium() selenium_urllib.element_screenshot(selectbyid(''elementid''),''path.png'') selenium_urllib.driver ## Access normal webdriver


Funcionó para mí en python3.5

from selenium import webdriver fox = webdriver.Firefox() fox.get(''http://.com/'') image = fox.find_element_by_id(''hlogo'').screenshot_as_png