之前用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