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
'IT Share you' 카테고리의 다른 글
N 문자마다 문자열에 구분 기호를 추가 하시겠습니까? (0) | 2020.11.16 |
---|---|
Nginx를 통한 EventSource / 서버 전송 이벤트 (0) | 2020.11.16 |
bootstrap-datepicker로 선택한 날짜에 대한 변경 감지 (0) | 2020.11.16 |
“지원되는 최소 Gradle 버전은 2.14.1입니다. (0) | 2020.11.16 |
Vim에서 언어별로 다른 탭 설정을 어떻게 설정합니까? (0) | 2020.11.16 |