使用LDTP+Pywinauto实现主机与虚拟机之间的拖拽(DnD: Drag and drop)自动化测试
·
主机和虚拟机之间的拖拽是一个常用功能,比如VMware Workstation, VMware Horizon View 的用户都可以通过拖拽实现主机和虚拟机之间的文件拷贝。最近我进行了调研,并实现在了VMware Horizon view上的DnD自动化测试,做一些经验总结。
为什么使用LDTP + Pywinauto?
LDTP 是我常用的UI自动化测试框架,因此主体的对象识别操作都是用了它,但是对于拖拽的支持上,我的试验结果:
1. DnD 从client端到agent端(就是Host to Guest):
mousemove('paneProgram*’,<拖拽的文件名>)
generatemouseevent(1300,255,'b1p’)
simulatemousemove(1300,255,930,570)
time.sleep(2)
click('W1064_Ent','paneMKS*’) #让打开的虚拟桌面获取焦点
generatemouseevent(930,570,'b1r’)
结果:这种实现可以成功,但是不是太稳定
2. DnD 从agent端到client端(就是Guest to Host):
结果:LDTP 一旦把鼠标点击到虚拟桌面中,后续的鼠标操作就失效了,这种方案不可行。
Pywinauto有关于mouse和keyboard操作的模块,对应的结果为:
1. DnD 从client端到agent端(就是Host to Guest):
mouse.press(coords=(600,255))
mouse.press(coords=(600,255))
time.sleep(2)
mouse.move(coords=(1300,255))
time.sleep(2)
mouse.release(coords=(1300,255))
结果:这种实现可以成功,也相对稳定。
2. DnD 从agent端到client端(就是Guest to Host):
mouse.press(coords=(1300,255))
time.sleep(2)
mouse.move(coords=(930,570))
time.sleep(2)
mouse.release(coords=(930,580))
结果:这种实现可以成功,也相对稳定。
所以,最终我采用了LDTP+Pywinauto的方式来实现DnD的自动化测试。
测试主体步骤:
从 client 到 agent:
- 启动View client,打开远程虚拟桌面。
- 利用远程调用在agent端打开文件浏览器到指定文件目录。
- 在client端打开文件浏览器到指定文件目录。
- 通过LDTP的 getobjectsize(WindowName, objectName) 获取需要拖拽文件的坐标位置(x, y, w, h)和虚拟桌面的坐标位置(j, k, m, n).
- 使client端文件浏览器获取焦点。
- 使用Pywinauto的mouse操作拖拽文件从(x+w/2, y+h/2)到 (j+m/2, k+n/2).
- 使虚拟桌面获取焦点。
- Pywinauto的mouse调用release(),drop文件到虚拟桌面端。
从agent到client:
- 在agent端提前安装了LDTP。
- 启动view client,打开远程虚拟桌面。
- 利用远程调用在agent端打开文件浏览器到指定文件目录。
- 远程调用agent上的LDTP 脚本获取需要拖拽文件在远程虚拟桌面中的坐标位置(x, y, w, h), 返回(u=x+w/2, v=y+h/2)到client端。
- 通过LDTP的 getobjectsize(WindowName, objectName) 虚拟桌面的坐标位置(j, k, m, n)。
- 在client端打开文件浏览器到指定文件目录, 通过LDTP获取文件浏览器的坐标位置(x_1, y_1, w_1, h_1)。
- 使虚拟桌面获取焦点。
- 使用Pywinauto的mouse操作拖拽文件从(j+u, k+v)到 (x_1+w_1/2, y_1+h_1/2).
- 使client端文件浏览器获取焦点。
- Pywinauto的mouse调用release(),drop文件到client端。
备注:
- 由于拖拽的文件被识别到可以进行DnD需要一点时间,为了更加稳定,我们在拖拽和释放前会稍微移动鼠标,另外加一点等待时间:
-
ExplorerWnd.activateWindow() ExplorerWnd.mouseLeftClick(fileName_c) mouse.press(coords=(x + w / 2, y + h / 2)) time.sleep(2) #稍微移动鼠标 mouse.move(coords=(x + 5 + w / 2, y + 5 + h / 2)) mouse.move(coords=(x + w / 2, y + h / 2)) time.sleep(2) DesktopWnd.grabFocus(btnOptions) time.sleep(2) mouse.move(coords=(j + m / 2, k + n / 2)) #稍微移动鼠标 mouse.move(coords=(j + 5+ m / 2, k + 5+ n / 2)) mouse.move(coords=(j + m / 2, k + n / 2)) time.sleep(2) mouse.release(coords=(j + m / 2, k + n / 2))
-
- 从agent到client的拖拽是,发现有时候一次mouse.press()没法选中制定文件,所以推荐做两次操作。
- 让窗口获取焦点,通常使用LDTP的 activatewindow(), 但是我发现在win7上view client打开的虚拟桌面无法获取焦点,因此使用grabfocus(WindowName, objName) 替代。如备注1中的代码,文件浏览器获取焦点是直接使用的activewindow(),而虚拟桌面获取焦点则用的是grabfocus().
- 代码中部分LDTP函数是自己封装过的,所以与LDTP官方文档中的大小写不一样。
链接:
LDTP: https://ldtp.freedesktop.org/wiki/
Pywinauto:http://pywinauto.github.io/
更多推荐



所有评论(0)