之前用 Airtest_Selenium 做 Web 自动化测试,一直很顺利。直到遇到一个导出数据的功能:这个功能会将数据导出生成一个 excel 文件,显示在窗口的下部,然后继续执行脚本的时候会出现一个奇怪的现象,从日志截图看识别到的元素位置是没问题的,但是实际点击的位置却向下偏移了一些,几次尝试发现原来是这个下载框搞的鬼。
我首先尝试了使用 Airtest 自带的图像识别功能尝试对这个下载对话框进行操作,结果运行时报错:找不到该元素。
和群里的朋友讨论,原来 Airtest 在做 PC 端的 web 测试时使用的也是 selenium 的框架,而这个下载框不属于浏览器的组件,所以 Airtest 也没法对它进行操作。于是我 Google 了一番,发现 Selenium 其实是有对键盘的操作的,比如
from selenium.webdriver.common.keys import Keys
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
但是实际尝试时发现这个操作需要基于一个 element 来进行,而我当前的页面又没有一个合适的 element 满足条件,导致实际运行要么提示该 element 没有指定的 attribute,或者干脆没有任何效果,这条路也走不通。
后来我继续 Google 以及和群里的同学讨论研究,终于发现了一个库来解决这个问题:就是 pynput。
安装非常简单,pip install pynput 直接搞定,可能还需要额外安装一个 pywin32,毕竟是要操作 windows 键盘鼠标来的。
这个场景下我只需要做两个键盘操作:首先按组合键 Ctrl+J 打开下载列表,然后再按 Ctrl+W 关闭打开的下载列表 tab 页,这样就自动回到了之前的主页,下面也不会有这个下载框了。需要注意的一点是,pynput 对键盘的操作分为 press 和 release 两步,千万不要忘了 release 操作,否则忙乎半天出了错还是一头雾水。代码实例如下:
from pynput.keyboard import Controller as Keyboard
def export_handler():
with keyboard.pressed(Key.ctrl):
#通过快捷键Ctrl+J打开下载详清tab,再按Ctrl+W关闭该tab
keyboard.press('j')
keyboard.release('j')
sleep(3.0)
keyboard.press('w')
keyboard.release(Key.ctrl)
keyboard.release('w')
深夜发稿,拖了两天的锅。代码写的很 low,见笑。以上就是我处理 web 自动化遇到的一个小坑的过程,也希望 Airtest 的同学能够把这块的支持加进去,让产品越做越好。https://github.com/AirtestProject/Airtest/issues/406