问题1:一直NoSuchElementException: An element could not be located on the page
解决:在findelement之前加一句等待 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
问题2:中文输入是乱码
解决:加入了网上给的两句代码,并没有解决,依然是乱码。
使用CMD启动appium,运行后发现日志是中文了,但是在APP上没有填写出文字,试着点了一下文本框,输出了
中文,但是为什么需要点击一下呢?
先对element进行click操作,发现没反应。最后又试了下用tap,成功
问题3:使用swipe滑动操作没有反应
解决:一方面要调控好滑动两点间的坐标,以及duration这个参量,数字越大,划得越慢。可以先实际用手指体会一下滑动的速度,设置好量。
另一方面,如果一次swipe没有动静,可以再来一句试试。
问题4:怎么能像jmeter一样,可以写多个类,并按照一定顺序进行测试?目前只会写在一个大类里跑,有没有更好的处理办法?
问题5:添加球员,使用tap不管用了,发现点击的位置不是应该的位置
解决:使用xpath,成功定位(偶尔失灵)
问题6:怎样在这样的页面上定位到【+】这个元素?光使用automator viewer是看不到的。目前思路是取得机器屏幕尺寸,询问到【+】所占的百分比,直接点击到上面去
PS 该机型的分辨率参数是720*1280,实际测出来是720*1184,应该是去掉了虚拟按键区
解决:先获取当前机型的分辨率,再手动获取点击区域的坐标,算出所占分辨率的百分比
//获取屏幕分辨率
int width = driver.manage().window().getSize().width;
int height = driver.manage().window().getSize().height;
//点击第一行的+
driver.tap(1, width*5/6, height*100/237, 200);
问题7:怎么加入判断语句,用if(driver.findElementByName("新建收货人地址").isDisplayed()),会报错称找不到这样的元素,后面的语句也不执行了
解决:修改前,默认收货地址是没有的,需要点击“新建收货人地址”,然后新增后返回,点击“确认付款”,后来发现如果选择了一次地址,那么以后下订单时会默认显示上一次的地址,也就是说找不到内容为“新建收货人地址”的元素。所以需要进行判断,当找不到这个元素的时候,直接点击“确认付款”
WebElement address = driver.findElementByName("新建收货人地址");
address.click();
WebElement address1 = driver.findElementByName("//android.widget.FrameLayout[1]/"
+ "android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/"
+ "android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/"
+ "android.widget.RelativeLayout[1]/android.view.View[1]/"
+ "android.widget.ListView[1]/android.view.View[1]");
address1.click();
driver.findElementByName("完成"); }
WebElement toPay = driver.findElementByName("确认付款");
toPay.click();
Thread.sleep(10000);
修改之后,思路是使用查找元素集合,如果没有找到,会返回[],而不是直接报错。
List <WebElement> address = driver.findElementsByName("新建收货人地址");
if(address.size()!=0) //如果size不为0,说明找到了该元素,点击进入选择地址
{
address.get(0).click();
WebElement address1 = driver.findElementByName("//android.widget.FrameLayout[1]/"
+ "android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/"
+ "android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/"
+ "android.widget.RelativeLayout[1]/android.view.View[1]/"
+ "android.widget.ListView[1]/android.view.View[1]");
address1.click();
driver.findElementByName("完成");
}
//如果size为0,说明已经有了地址,直接付款
WebElement toPay = driver.findElementByName("确认付款");
toPay.click();
Thread.sleep(10000);
问题8:怎样检验排名结果?
目前使用的Junit框架,用一个比较简单的断言:
assertEquals(Object expected, Object actual)
如,要检查球员2的总杆是否是61,写为
assertEquals("61", driver.findElementByXPath("//android.widget.FrameLayout[1]/"
+ "android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/"
+ "android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/"
+ "android.widget.RelativeLayout[1]/android.webkit.WebView[1]/"
+ "android.view.View[1]/android.widget.ListView[2]/android.view.View[4]").getAttribute("name"));
这里有个坑,一开始写的不是getAttribute("name"),而是getText(),结果报错,显示返回为[]。原因是对于这个元素来说,
它的属性中“text”确实为空,只有“content-desc”包含了“61”,但是我们也不能写作getAttribute("content-desc"),毕竟在appium里面,有findElementByName(),却没有findElementByDesc()
在检验过程中,如果有不相等的,测试会自动终止,并且在failure trace里记录。
因此在犹豫是否加入error message,毕竟已经给出来了,是否有必要再在控制台输出呢。
测试成功通过后的控制台输出: