由于打印界面出来的保存窗口不属于web页面,所以无法用selenium进行操作。
观察之后发现,保存窗口默认输入位置为File name,模拟按键位置为Save。如果在不更改保留路径的条件下,最简单的方式是通过模拟键盘的方式进行操作,主要是tab和enter两个按键完成,以及输入保存的文件名称。(目前还没有实现更改保存路径)
首先安装需要的三方包:
安装pyHook,官网……3.8版本没有对应的pyhook??
找了好久,终于找到一个共享的,测试后可以使用,链接
pip install pyHook-1.5.1-cp38-cp38-win_amd64.whl
然后安装PyUserInput
pip install PyUserInput
以下为使用的具体操作方法:
PyKeyboard:模拟键盘操作
PyMouse:模拟鼠标操作
操作过程中发现,pykeyboard的操作没办法在windows弹窗中呈现。于是测试了一下针对web的操作,是可以实现的,证明pykeyboard基于win10是可以进行操作的:
from selenium.webdriver.support import expected_conditions as ECfrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitimport timefrom pykeyboard import PyKeyboarddef test(): driver.get(‘http://www.baidu.com/’) WebDriverWait(driver,30).until(EC.visibility_of_element_located((By.ID,’kw’))) k = PyKeyboard() k.tap_key(‘i’) time.sleep(10)if __name__ == ‘__main__’: driver = webdriver.Chrome() test() driver.quit()
所以问题应该是pykeyboard不能直接操作网页弹出的windows下载框。按照这样的思路,需要考虑先获取windows窗口的句柄权,再此基础上再测试一下是否成功。
windows的操作采用win32gui这个三方包。
import win32gui #查看当前windows中的句柄 time.sleep(1) para_hld = win32gui.FindWindow(None,’Save Print Output As’) print(para_hld)
能够成功识别到指定的窗口的句柄权。前面加了一个时间间隔,是因为如果没有间隔的情况下,容易出现获取不计时的问题。
8914604
接下来需要做的是指定的窗口调用到最前端,并激活该窗口,使用win32gui.SetForegroundWindow()。
该部分的整体实现代码如下(其中省略了selenium操作web打开print页面的部分,如果需要测试,自行模拟一下):
from pykeyboard import PyKeyboardimport win32gui #Save file keyboard def keyboard(self,str_key): k = PyKeyboard() #输入文件名称 k.type_string(str_key) #回车保存 k.tap_key(k.enter_key) #查看当前windows中的句柄 time.sleep(1) para_hld = win32gui.FindWindow(None,’Save Print Output As’) if para_hld == 0: print(‘未获取到保存窗口的句柄’) else: time.sleep(1) win32gui.SetForegroundWindow(para_hld) #模拟键盘操作,以身份证号码作为pdf的名称 self.keyboard(‘test’)
pykeyboard的部分使用介绍: