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

我去催饭 · May 20, 2019 · Last by 我去催饭 replied at October 16, 2020 · 2693 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

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

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

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

Ribosome 回复

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

pyautogui 也可以解决

感谢分享

hello 回复

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

pynput 是个好东西呀

我去催饭 回复

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

Ribosome 回复

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

Author only
dyy2011014331 回复

怎么跑到这个贴子回了呢……不要挖坟哈,这个问题是由于我 jenkins 配置有点问题导致,加上这段就好了,路径按照你自己的来,希望能帮到你,如果你本地运行不了,那我猜应该也是环境变量的问题,导致执行的时候没找到你的依赖:
# 避免 jenkins 无法读取环境变量导致语言设置没有读到
export LANG="en_US.UTF-8"
PATH=$PATH:$HOME/bin:/user/local/python3:/usr/local/python3/lib/python3.7/site-packages:/usr/local/python3/bin
export black=/usr/local/python3/bin
export PATH
export PYTHONPATH=/user/local/python3,/usr/local/python3/lib/python3.7/site-packages,/usr/local/python3/bin
source $PATH

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