IT Share you

Python에서 Selenium WebDriver로 부분 스크린 샷을 찍는 방법은 무엇입니까?

shareyou 2020. 11. 16. 23:13
반응형

Python에서 Selenium WebDriver로 부분 스크린 샷을 찍는 방법은 무엇입니까?


나는 이것을 많이 검색했지만 해결책을 찾지 못했습니다. 다음 은 Java에서 가능한 솔루션과 유사한 질문 입니다.

Python에 유사한 솔루션이 있습니까?


이 질문은 답없이 오랜 시간이 지난 것 같지만, 방금 작업을 마치고 배운 것 중 일부를 전달할 것이라고 생각했습니다.

참고 : Selenium 이외의이 예제에는 PIL Imaging 라이브러리도 필요합니다. 때때로 이것은 표준 라이브러리 중 하나로 삽입되고 때로는 그렇지 않은 경우도 있지만,없는 경우 여기에서 얻을 수 있습니다.

from selenium import webdriver
from PIL import Image
from io import BytesIO

fox = webdriver.Firefox()
fox.get('http://stackoverflow.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

그리고 마지막 출력은 .... 드럼 롤 Stackoverflow 로고 !!!

여기에 이미지 설명 입력

이제 물론 이것은 정적 이미지를 잡기에는 과잉이지만 Javascript가 필요한 것을 잡으려면 실행 가능한 솔루션이 될 수 있습니다.


python3.5에서 나를 위해 일했습니다.

from selenium import webdriver


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

이 유용한 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()

표시된 요소의 png 이미지를 바이트로 반환합니다. 제한 : 요소는 뷰포트에 맞아야합니다.
작업하려면 지팡이 모듈을 설치해야합니다.


다음은이를 수행하는 함수입니다. 크기는 자르기 함수로 전달되기 전에 정수로 캐스팅되어야합니다.

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

RandomPhobia의 아주 좋은 대답에 대한 응답으로 주석을 확장하면 다음과 같이 파일에 먼저 저장하지 않고 전체 화면 스크린 샷을 여는 올바른 import 문이있는 두 가지 솔루션이 있습니다.

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

그리고 다음 질문은 "좋지만 어느 것이 가장 빠릅니까?"라고 확신하기 때문에이를 결정하는 방법은 다음과 같습니다 (먼 거리에서 가장 빠른 방법을 찾습니다).

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)

"Cherri"라는 사람 은 이것을 포함 하는 Selenium 용 라이브러리를 만들었습니다 .

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

참고 URL : https://stackoverflow.com/questions/15018372/how-to-take-partial-screenshot-with-selenium-webdriver-in-python

반응형