你的位置:首页 > Java教程

[Java教程]让ChromeDriver支持TouchActions


0x01 背景

最近接到页面自动化测试的需求,要求对线上的手机网页进行自动化的测试与监控。

查了一下资料,对比了一下Selendroid、Appium和比较流行的Genymotion,结论如下:

优点:他们都是基于真机或者虚拟机的自动化测试,能够真实模拟用户的操作环境

缺点:真机需要一直将手机连到电脑上,虚拟机的效率又太低,Genymotion的免费版还不能联网……

考虑到平时很少出现兼容性的问题,且手机浏览器都是基于Webkit的,桌面版Chrome也是,所以最终把技术方案定为Java+Selenium+Chrome模拟手机浏览器

0x02 杀出拦路虎——TouchActions

根据ChromeDriver的官方文档,很快实现了手机浏览器的模拟,展示、点击、插入JS等玩的不亦乐乎,H5的特性支持的都非常不错。

但是,当模拟触摸事件,开始使用TouchActions的时候,出现了报错:

image

由于没怎么写过Java,查了下,好像是个类型转换的错误,跟着错误信息,发现是TouchActions.java初始化的时候报错:

image

认真看了遍官方文档,没找到说法……

0x03 万能的Github给出答案

找了一圈,发现有人在Github上给Selenium起了一个分支,专门修复这个问题

https://github.com/rovner/selenium/tree/chrome-has-touch-screen

image

大意是说:为了让ChromeDriver支持TouchActions,要让ChromeDriver实现HasTouchScreen接口

0x04 解决方案

大神的repo里给出了方案,不过对Selenium源码进行了改动,需要自己重新打成jar包才能用。

这里给出我的解决方案:新建一个MobileChromeDriver,继承ChromeDriver并实现HasTouchScreen接口

// a ChromeDriver that enables TouchActionpublic class MobileChromeDriver extends ChromeDriver implements HasTouchScreen {  private RemoteTouchScreen touch;  public MobileChromeDriver(Capabilities capabilities) {    super(capabilities);    touch = new RemoteTouchScreen(getExecuteMethod());  }  public TouchScreen getTouch() {    return touch;  }}

然后把之前调用ChromeDriver都改成调用MobileChromeDriver就可以实现TouchActions里面的操作了。