-
现象:
-
解决方案:
到谷歌浏览器的【下载内容】页面选择文件是否保留
from selenium import webdriver
import time
import win32con
import win32api
br.get('chrome://downloads/')
js = "return document.querySelector('downloads-manager').shadowRoot.querySelector('#frb0')" \
".shadowRoot.querySelector('#dangerous').querySelector('div[role=gridcell]:nth-child(2)>cr-button')"
a = br.execute_script(js)
a.click()
time.sleep(1)
win32api.keybd_event(0x28, 0, 0, 0)
win32api.keybd_event(0x28, 0, win32con.KEYEVENTF_KEYUP, 0)
time.sleep(1)
win32api.keybd_event(0x0D, 0, 0, 0)
win32api.keybd_event(0x0D, 0, win32con.KEYEVENTF_KEYUP, 0)
- 代码解析:
第29行:跳转到谷歌浏览器的下载内容页面
第30行:使用DOM querySelector()获取DOM元素,不需要额外的JQuery支持,语法类似。获取页面的【保留】元素
第32行:执行JavaScript,返回【保留】按钮对象
第33行:对【保留】对象执行点击操作,弹出系统对话框【确认下载】
第36行:模拟键盘操作,按下键盘上的【DOWN】,使得对话框选中【仍然保留】按钮
第37行:模拟键盘操作,松开键盘上的【DOWN】
第39行:模拟键盘操作,按下键盘上的【ENTER】,模拟点击【仍然保留】按钮
第40行:模拟键盘操作,松开键盘上的【ENTER】
至此即可完成文件的下载保留操作。
- 注意事项
【下载内容】页面源码中使用了#shadow-root封装,使用selenium的xpath定位方式无法定位到元素;需借助DOM querySelector()获取元素。
win32api.keybd_event()传入的键码可以是十进制可以是十六进制,若想操作键盘第二功能键则需要按下shift和功能键,然后再松开shift和功能键 - 键码值对应关系
按键 | 十进制键码 | 十六进制键码 |
---|---|---|
A | 65 | 0x41 |
B | 66 | 0x42 |
C | 67 | 0x43 |
D | 68 | 0x44 |
E | 69 | 0x45 |
F | 70 | 0x46 |
G | 71 | 0x47 |
H | 72 | 0x48 |
I | 73 | 0x49 |
J | 74 | 0x4a |
K | 75 | 0x4b |
L | 76 | 0x4c |
M | 77 | 0x4d |
N | 78 | 0x4e |
O | 79 | 0x4f |
P | 80 | 0x50 |
Q | 81 | 0x51 |
R | 82 | 0x52 |
S | 83 | 0x53 |
T | 84 | 0x54 |
U | 85 | 0x55 |
V | 86 | 0x56 |
W | 87 | 0x57 |
X | 88 | 0x58 |
Y | 89 | 0x59 |
Z | 90 | 0x5a |
0 | 48 | 0x30 |
1 | 49 | 0x31 |
2 | 50 | 0x32 |
3 | 51 | 0x33 |
4 | 52 | 0x34 |
5 | 53 | 0x35 |
6 | 54 | 0x36 |
7 | 55 | 0x37 |
8 | 56 | 0x38 |
9 | 57 | 0x39 |
ENTER | 13 | 0x0d |
BackSpace | 8 | 0x08 |
Tab | 9 | 0x09 |
Shift | 16 | 0x10 |
Ctrl | 17 | 0x11 |
Alt | 18 | 0x12 |
Left Arrow | 37 | 0x25 |
Right Arrow | 39 | 0x27 |
Up Arrow | 38 | 0x26 |
Down Arrow | 40 | 0x28 |
Delete | 46 | 0x2e |
F1 | 112 | 0x70 |
F2 | 113 | 0x71 |
F3 | 114 | 0x72 |
F4 | 115 | 0x73 |
F5 | 116 | 0x74 |
F6 | 117 | 0x75 |
F7 | 118 | 0x76 |
F8 | 119 | 0x77 |
F9 | 120 | 0x78 |
F10 | 121 | 0x79 |
F11 | 122 | 0x7a |
F12 | 123 | 0x7b |