Selenium | 获取canvas画布中的图片

搬运自这里

没办法直接获取,但是JS有获取的方法,详见canvas文档

问题需求

获取极验三代滑动验证的图片
查看官网示例

解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
import random
import base64

driver = webdriver.Chrome()
driver.get('http://127.0.0.1:8000/') #打开本地部署的极验滑动验证

def click(block): # 自定义点击函数,模拟人工点击
action = ActionChains(driver)
action.click_and_hold(block).perform()
time.sleep(random.randint(1,10)/10)
action.release(block).perform()
btn = driver.find_element_by_class_name('geetest_wait') #到点击按钮
click(btn) # 验证第一步,点击按钮进行验证

#下面的js代码根据canvas文档说明而来
JS = 'return document.getElementsByClassName("geetest_canvas_bg geetest_absolute")[0].toDataURL("image/png");'
# 执行 JS 代码并拿到图片 base64 数据
im_info = driver.execute_script(JS) #执行js文件得到带图片信息的图片数据
im_base64 = im_info.split(',')[1] #拿到base64编码的图片信息
im_bytes = base64.b64decode(im_base64) #转为bytes类型
with open('bg.png','wb') as f: #保存图片到本地
f.write(img_data)
# 完毕