当前位置: 首页 > 工具软件 > LDTP > 使用案例 >

使用LDTP+Pywinauto实现主机与虚拟机之间的拖拽(DnD: Drag and drop)自动化测试

郝玄天
2023-12-01

主机和虚拟机之间的拖拽是一个常用功能,比如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:

  1. 启动View client,打开远程虚拟桌面。
  2. 利用远程调用在agent端打开文件浏览器到指定文件目录。
  3. 在client端打开文件浏览器到指定文件目录。
  4. 通过LDTP的 getobjectsize(WindowName, objectName) 获取需要拖拽文件的坐标位置(x, y, w, h)和虚拟桌面的坐标位置(j, k, m, n).
  5. 使client端文件浏览器获取焦点。
  6. 使用Pywinauto的mouse操作拖拽文件从(x+w/2, y+h/2)到 (j+m/2, k+n/2).
  7. 使虚拟桌面获取焦点。
  8. Pywinauto的mouse调用release(),drop文件到虚拟桌面端。

从agent到client:

  1.  在agent端提前安装了LDTP。
  2. 启动view client,打开远程虚拟桌面。
  3. 利用远程调用在agent端打开文件浏览器到指定文件目录。
  4. 远程调用agent上的LDTP 脚本获取需要拖拽文件在远程虚拟桌面中的坐标位置(x, y, w, h), 返回(u=x+w/2, v=y+h/2)到client端。
  5. 通过LDTP的 getobjectsize(WindowName, objectName) 虚拟桌面的坐标位置(j, k, m, n)。
  6. 在client端打开文件浏览器到指定文件目录, 通过LDTP获取文件浏览器的坐标位置(x_1, y_1, w_1, h_1)。
  7. 使虚拟桌面获取焦点。
  8. 使用Pywinauto的mouse操作拖拽文件从(j+u, k+v)到 (x_1+w_1/2, y_1+h_1/2).
  9. 使client端文件浏览器获取焦点。
  10. Pywinauto的mouse调用release(),drop文件到client端。

备注:

  1. 由于拖拽的文件被识别到可以进行DnD需要一点时间,为了更加稳定,我们在拖拽和释放前会稍微移动鼠标,另外加一点等待时间:
    1. 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))
  2. 从agent到client的拖拽是,发现有时候一次mouse.press()没法选中制定文件,所以推荐做两次操作。
  3. 让窗口获取焦点,通常使用LDTP的 activatewindow(), 但是我发现在win7上view client打开的虚拟桌面无法获取焦点,因此使用grabfocus(WindowName, objName) 替代。如备注1中的代码,文件浏览器获取焦点是直接使用的activewindow(),而虚拟桌面获取焦点则用的是grabfocus().
  4. 代码中部分LDTP函数是自己封装过的,所以与LDTP官方文档中的大小写不一样。

链接:

LDTP: https://ldtp.freedesktop.org/wiki/

Pywinauto:http://pywinauto.github.io/

 类似资料: