如何在Python中使用Selenium WebDriver进行部分屏幕截图?

我已经search了很多,但无法find解决scheme。 这里有一个类似的问题 ,在Java中可能的解决scheme。

Python中是否有类似的解决scheme?

这个问题似乎已经很长时间没有答案,但刚刚工作,我想我会传递一些我学到的东西

注意:除了Selenium之外,这个例子还需要PIL Imaging Library。 有时候,这是作为标准库之一,有时不是,但如果你没有它,你可以在这里得到它

from selenium import webdriver from PIL import Image 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 fox.save_screenshot('screenshot.png') # saves screenshot of entire page fox.quit() im = Image.open('screenshot.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的东西,可能是一个可行的解决scheme。

我写了这个有用的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() 

它以字节的forms返回显示元素的png图像。 限制:元素必须适合视口。
您必须安装魔杖模块才能使用它。

这个名叫“Cherri”的家伙为Seleniumbuild立了一个包括这个function的图书馆 。

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

这是一个function,只是这样做的,大小必须被转移到整数之前被传递给裁剪function:

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