83

私はこれをたくさん検索しましたが、解決策を見つけることができませんでした。これは、Javaで可能な解決策を持つ同様の質問です。

Pythonに同様のソリューションはありますか?

4

8 に答える 8

7

この便利な 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 画像をバイトとして返します。制限: 要素はビューポートに収まる必要があります。
これを使用するには、ワンド モジュールをインストールする必要があります。

于 2016-06-20T14:17:52.643 に答える
6

これを行う関数を次に示します。サイズは、crop 関数に渡す前に整数にキャストする必要があります。

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')
于 2017-06-21T21:38:16.160 に答える