Skip to content

about

win10 + python3.6 + selenium + chrome

前提是Windows平台。 今天有个在浏览器的某个网站提交图片的需求,说来也简单,就是从本地截取一张图片,复制并粘贴到富文本的文本框,但操蛋的是,由于提交的标签是body,并不是input标签,selenium无法直接send_key图片,思考了一番,想到了一个解决办法,用selenium模拟出来一个复制粘贴的操作:

  1. 读取图片并将其暂放到系统的剪贴板。
  2. selenium做一个Ctrl+V的操作就完了。

想到就干,Python操作剪贴板,可以用pyperclip和pywin32这两个模块可以做,后来进一步确定使用win32这个包。 注意,经过我踩了一天坑(尝试在Python3.9+pywin32-225/302这两个版本的包)后,发现,降级万事大吉! 最后,我选择在Python3.6的解释器中,直接安装pywin32的225版本,不敢用302,怕再报错! 所以:

pip install pywin32==225

完事之后,尝试着导一下:

Python 3.6.13 |Anaconda, Inc.| (default, Mar 16 2021, 11:37:27) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import win32con
>>> import win32clipboard

我就用到了这两个,其他的也不太熟悉。 如果你导包报错,建议重启电脑!

应用:将图片复制到剪贴板

以下示例,基本照抄百度的,然后对着我自己的需求改了改。 你只需要准备一张图片路径,替换到下面的代码中,然后执行......你就可以直接CTRL+V将这个图片粘贴到你想要粘贴的地方了。好神奇!

python
import win32clipboard as clip
import win32con
from PIL import Image  # pip install pillow
from io import BytesIO

img_path = "image-20211122170524041.png"


def get_img(imp_path):
    img = Image.open(img_path)
    bt_io = BytesIO()
    img.convert('RGB').save(bt_io, 'BMP')  # 这些我都是照抄百度的!
    img_content = bt_io.getvalue()[14:]   # 好神奇,不从14切,得到的图片不能用
    bt_io.close()
    cl(img_content)


def cl(img_content):
    # 打开剪贴板
    clip.OpenClipboard()

    # 清空剪贴板
    clip.EmptyClipboard()

    # 将图片放入剪贴板
    clip.SetClipboardData(win32con.CF_DIB, img_content)  # 照抄百度 
    clip.CloseClipboard()


if __name__ == '__main__':
    get_img(img_path)

see also: https://blog.csdn.net/betty_xfy/article/details/80321518