目录
[1.2 应用:滑动停止判断](#1.2 应用:滑动停止判断)
问题:怎么判断加载完成,不能一直没停止的滑动呀,怎么停止滑动呢
[toast定位实例:(显示等待 等待元素存在:presenceOfElementLocated)](#toast定位实例:(显示等待 等待元素存在:presenceOfElementLocated))
[⚠️在我们等待元素可见的时候,不要用 visibility_of_element_located,因为它对 Toast 的可见处理并不支持,会直接报错命令无法执行。](#⚠️在我们等待元素可见的时候,不要用 visibility_of_element_located,因为它对 Toast 的可见处理并不支持,会直接报错命令无法执行。)
「也就是等待的时候,要用元素存在的条件------presenceOfElementLocated。不能用元素可见的条件。」
[2、不定时弹窗 Popups](#2、不定时弹窗 Popups)
说明:以下均以java示例
一、手势操作------滑动
1、实战示例:向上滑动
java
/**
* 向上滑动
* @param seconds 滑动时长 秒级
*/
public static void SlideUp(int seconds) {
//滑动
int height = driver.manage().window().getSize().height;
int width = driver.manage().window().getSize().width;
//定位开始滑动的位置
//⚠️每个app滑动的开始滑动和结束滑动的相对位置不一样,有的是1/4有的是1/5有的是1/7,需要试
PointOption startPoint = PointOption.point(width/2,height*3/4);
PointOption endPoint = PointOption.point(width/2,height/4);
TouchAction action = new TouchAction(driver);
//⚠️如果滑动操作很快,就不起滑动操作,需要慢一点滑动
//不设置滑动时长 没有滑动的效果
//action.press(startPoint).moveTo(endPoint).release().perform();
//设置滑动时长
//⚠️配置问题:Duration需要maven1.8
WaitOptions wait = WaitOptions.waitOptions(Duration.ofSeconds(seconds));
//从startPoint 滑动到 endPoint 需要 wait时间
action.press(startPoint).waitAction(wait).moveTo(endPoint).release().perform();
}
1.2 应用:滑动停止判断
问题:怎么判断加载完成,不能一直没停止的滑动呀,怎么停止滑动呢
------方法一:判断加载后的pagesource是否包含"全部加载完成",如果出现了,跳出滑动的循环
------方法二: 判断页面源过码是否有变化,如果有变化证明还在加载新的内容
java
//滑动问题:怎么判断加载完成,不能一直没停止的滑动呀,怎么停止滑动呢
解决方法一:判断加载后的pagesource是否包含"全部加载完成",如果出现了,跳出滑动的循环
while (true){
// String pageSource1 = driver.getPageSource();
// if(pageSource1.contains("全部加载完成")){
// break;
// }
滑动前后/或者滑动之后加一个判断
SlideUp(2);
String pageSource2 = driver.getPageSource();
if(pageSource2.contains("全部加载完成")){
break;
}
}
解决方法二: 判断页面源过码是否有变化,如果有变化证明还在加载新的内容,
//如果滑动前和滑动后源码一致,说明已经到最底,没有新的内容加载停止滑动。
while (true){
String beforePageSource = driver.getPageSource();
SlideUp(2);
//防止无效滑动,所以等2秒,滑2秒 等2秒
Thread.sleep(2000);
String afterPageSource = driver.getPageSource();
if(beforePageSource.equals(afterPageSource)){
break;
}
}
二、特殊场景元素定位
1、toast元素定位
Android中的Toast是一种简易的消息提示框。 当视图显示给用户,在应用程序中显示为浮动。和Dialog不一样的是,它永远不会获得焦点,无法被点击。
获取方式:
//匹配所有的元素,找对应的text属性值中有包含tips关键字
java
androidDriver.findElement(MobileBy.xpath("//*[contains(@text, 'tips')]"));
等同于
androidDriver.findElement(MobileBy.xpath("//*[@text='tips')]"));
toast定位实例:(显示等待 等待元素存在:presenceOfElementLocated)
⚠️在我们等待元素可见的时候,不要用 visibility_of_element_located,因为它对 Toast 的可见处理并不支持,会直接报错命令无法执行。
「也就是等待的时候,要用元素存在的条件------presenceOfElementLocated。不能用元素可见的条件。」
java
定位toast元素 特点:n秒后消失
方式一: 硬等待 Thread.sleep(3000);不好控制时长,5秒就报错了
WebElement toast = driver.findElement(By.xpath("//*[@text=\"手机号码或密码不能为空\"]"));
System.out.println(toast);
方式二1:显式等待 ------ elementToBeClickable等待页面元素可被单击 ------!!!无法定位
WebDriverWait wait = new WebDriverWait(driver,5);
WebElement toast = wait.until(ExpectedConditions
.elementToBeClickable(By.xpath("//*[@text=\"手机号码或密码不能为空\"]")));
System.out.println(toast);
方式二2: 显示等待 等待元素存在 可以定位 ok
WebDriverWait wait = new WebDriverWait(driver,5);
WebElement toast = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[contains(@text,'手机号码或密码不能为空')]")));
//.presenceOfElementLocated(By.xpath("//*[@text=\"手机号码或密码不能为空\"]")));
System.out.println(toast);
方式二3: 显示等待 visibilityOfElementLocated 页面元素在页面存在并且可见 ------ !!!无法定位
WebDriverWait wait = new WebDriverWait(driver,5);
WebElement toast = wait.until(ExpectedConditions.
visibilityOfElementLocated(By.xpath("//*[@text=\"手机号码或密码不能为空\"]")));
System.out.println(toast);
2、不定时弹窗 Popups
App运行时,页面不定时会有弹窗出来(评价弹窗、升级弹窗、广告弹窗、提示弹窗),如果不对其进行处理就会出现正常元素定位超时导致自动化脚本执行中断。
解决方案:
try...catch...异常捕获,正常元素定位 超时进入到异常处理机制,在其内部处理掉弹窗再继续后续的流程
try里面放正常流程 ,元素定位 catch里面放可能会引起元素抓取有问题的弹窗处理,不定时的弹窗,不定时弹窗的定位
实例:
⚠️当有好几个弹窗在每次重启app的时候弹出的话,可以设置⚠️记录app用户信息,使其不去重置
java
capabilities.setCapability("noReset", true);
java
//try里面放正常流程
//catch里面放可能会引起元素抓取有问题的弹窗处理,不定时的弹窗
try {
driver.findElementByXPath("//*[@text=\"天猫新品\"]").click();
}catch (Exception e) {
driver.findElementByXPath("//*[@text=\"同意\"]").click();
Thread.sleep(1000);
driver.findElementByXPath("//*[@text=\"同意\"]").click();
Thread.sleep(1000);
driver.findElementByXPath("//*[@text=\"好的\"]").click();
Thread.sleep(1000);
driver.findElementByXPath("//*[@text=\"天猫新品\"]").click();
}