Airtest 解决图像识别位置与实际点击位置不一致的问题

张全蛋 · May 20, 2019 · Last by 张全蛋 replied at May 28, 2019 · 1103 hits

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

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 9 条回复 时间 点赞

楼主辛苦了,感谢分享,干货满满,不过最好还是不要总熬夜,身体是革命的本钱

最近也在用airetest的selenium,想请问一下楼主做web自动化时,需要验证码登录的场景如何能解决呢?因为我们的web是接入google登录的,没办法让开发弄万能验证码。

张全蛋 #3 · May 20, 2019 作者
Ribosome 回复

之前怎么做的,手动填写?可以不让开发弄万能验证码,但是可以让开发在测试环境注释掉验证码模块吧,个人觉得这块既然是谷歌提供的,那有它与否并不会影响你们的产品其他功能的使用

pyautogui也可以解决

感谢分享

张全蛋 #6 · May 20, 2019 作者
hello 回复

😁 觉得有帮助就请给个赞,谢谢

pynput是个好东西呀

张全蛋 回复

之前没做过呢,因为测试环境也是用的谷歌邮箱登录,研究了一番貌似是没办法解决。然后用selenium自动化倒是没有出现过验证码了。。先用selenium顶着用吧😂

张全蛋 #9 · May 28, 2019 作者
Ribosome 回复

其实airtest用的也是selenium,下载这个场景可能会经常遇到,到时候用这个方法可以解决😁

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up