横岗网站建设公司,快速网站空间,优秀的网站建设公司,dz论坛如何seoApp 自动化测试中有些常见痛点问题#xff0c;如果框架不能很好的处理#xff0c;就可能出现元素定位超时找不到的情况#xff0c;自动化也就被打断终止了。很容易打消做自动化的热情#xff0c;导致从入门到放弃。比如下面的两个问题#xff1a;
一是 App 启动加载时间较…
App 自动化测试中有些常见痛点问题如果框架不能很好的处理就可能出现元素定位超时找不到的情况自动化也就被打断终止了。很容易打消做自动化的热情导致从入门到放弃。比如下面的两个问题
一是 App 启动加载时间较久(可能 App 本身加载慢可能移动设备本身加载应用速度慢也可能首页广告时间较长)。
另一个是各种弹框的出现广告弹框升级弹框评价弹框等。在框架中如果不能处理好上面的情况
以雪球 App 出现的几种弹框举例
弹框一
弹框二
弹框三
弹框的影响范围弹框对我们自动化的影响主要是用例执行的打断而至于弹框中广告内容的跳转或评价信息填写等属于另外的测试因此我们主要是要将弹框处理消失使应用回到用例执行的 PO弹框的消失方式观察弹框我们会发现一般为了保证用户体验弹框都会方便用户进行一键消除例如上述中雪球的各种弹框可能点击一个叉号可能任意点击其他地方或者评价框这种直接点击“下次再说”等。弹框的处理效果自动化执行的任何时候任意的弹框都可能出现在这个时候用例不能失败需要将对应的弹框正确处理后继续执行原用例原用例的执行过程不受影响。
将需要处理的弹框元素加入到一个黑名单List中遍历List通过findElements方法得到的List大小来判断弹框元素是否存在存在即点击处理
public static void handleAlert(){ListBy alertBox new ArrayList();alertBox.add(By.id(ib_close)); //广告弹框alertBox.add(By.id(md_buttonDefaultNegative)); //评价弹框alertBox.forEach(alert-{By adsLocator alert;ListWebElement ads driver.findElements(adsLocator);if (ads.size() 1) {ads.get(0).click();}});}将handleAlert()方法加到driver.findElement方法之前使定位前先判断弹框的存在与否并进行处理
public static WebElement findElement(By by) {System.out.println(by);handleAlert();return driver.findElement(by);}上述方法初步解决了弹框问题但是缺点也很明显。
缺点每次定位元素前都需要处理弹框影响执行效率速度较慢 因此我们引入try catch来解决此问题
现在我也找了很多测试的朋友做了一个分享技术的交流群共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源没人解答问题坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化性能安全测试开发等等方面有一定建树的技术大牛
分享他们的经验还会分享很多直播讲座和技术沙龙
可以免费学习划重点开源的
qq群号691998057【暗号csdn999】 我们利用try catch的异常捕获处理的机制让元素仅在定位失败时才进入弹框处理handleAlert()方法处理完毕后重新返回driver.findElement(by)对原case元素继续进行定位执行这样就大大提升了处理效率使处理更为精准。
public static WebElement findElement(By by) {try {System.out.println(by);return driver.findElement(by);} catch (Exception e) {System.out.println(进入弹框处理);handleAlert();return driver.findElement(by); }}递归处理 一般情况下我们一次只会出现一个弹框但是例外的是可能有一个以上的弹框同时出现这样的话虽然处理了其中一个弹框但是剩下的弹框依然会阻断用例的正常执行这个时候就可以使用递归的方法在处理完弹框后返回findElement方法自身继续进行try catch使之进入弹框处理逻辑
public static WebElement findElement(By by) {try {System.out.println(by);return driver.findElement(by);} catch (Exception e) {System.out.println(进入弹框处理);handleAlert();return findElement(by); }}注意 使用递归方法后有一个问题就是假如并不是因为某个弹框的出现而导致的定位失败而这个时候通过try catch进入到弹框处理逻辑后由于并未匹配到弹框元素所以递归就会进入一个死循环不断重复着弹框处理的逻辑所以使用递归时我们也需要对其次数进行限制一般两个弹框同时出现已经算多的了所以建议可以将递归的次数限制到最多两次便退出。
static int i 1;
public static WebElement findElement(By by) {try {System.out.println(by);return driver.findElement(by);} catch (Exception e) {if (i 2){ //设置最多递归两次i 1;return driver.findElement(by);}System.out.println(进入弹框处理第i次);handleAlert();i;return findElement(by); //最后调用自身完成递归防止多弹框同时出现造成定位失败}
}按照上面的方法看似已经很好的解决了弹框的处理但是可以注意到的是
在检查弹框的时候依然使用的是appium的定位在当前页面中根据元素的属性去一一查找定位所有的黑名单中的弹框都会被定位查找一遍
而我们实际中最想要的也是最有效率的方法应该是
只有在当前页面中存在的弹框才对其进行定位、操作、处理。为了达到我们想要的效果就需要借助于PageSource了。
1appium的driver提供了一个getPageSource方法此方法可以在当前页面可以得到一个文本字符串也可以理解为当前页面的xml我们利用这种xml文本来进行判断就比用appium一一定位的方式要快速和精准的多了
String pageSource driver.getPageSource();2设置黑名单黑名单要使用元素的xpath用来和PageSource文本做匹配判断此弹框是否存在当前页面
String adBox com.xueqiu.android:id/ib_close;
String gesturePromptBox com.xueqiu.android:id/snb_tip_text;
String evaluateBox com.xueqiu.android:id/md_buttonDefaultNegative;HashMapString,By map new HashMap();
map.put(adBox,By.id(ib_close));
map.put(gesturePromptBox,By.id(snb_tip_text));
map.put(evaluateBox,By.id(md_buttonDefaultNegative));4遍历map判断黑名单弹框元素是否存在于当前pageSource存在即根据弹框处理方式进行点击或其他操作(如上述中的新功能提示弹框点击弹框自身无法消除需点击页面其余部分方可消除)处理
map.entrySet().forEach(entry -{if (pageSource.contains(entry.getKey())){if (entry.getKey().equals(com.xueqiu.android:id/snb_tip_text)){System.out.println(gesturePromptBox found);Dimension size driver.manage().window().getSize();//点击屏幕的中心位置消除新功能提示弹框new TouchAction(driver).tap(PointOption.point(size.width/2,size.height/2)).perform();}else {//其余弹框直接点击消除driver.findElement(entry.getValue()).click();}}
});//很多弹框的话最好的是直接定位到到底哪个弹框在界面上元素的判断使用xpathpublic static void handleAlertByPageSource(){String pageSource driver.getPageSource();//可以得到一个文本字符串也可以理解为当前页面的xml//黑名单String adBox com.xueqiu.android:id/ib_close;String gesturePromptBox com.xueqiu.android:id/snb_tip_text;String evaluateBox com.xueqiu.android:id/md_buttonDefaultNegative;//将标记和定位符存入mapHashMapString,By map new HashMap();map.put(adBox,By.id(ib_close));map.put(gesturePromptBox,By.id(snb_tip_text));map.put(evaluateBox,By.id(md_buttonDefaultNegative));//临时修改隐式等待时间防止查找黑名单中元素过久driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//遍历map判断黑名单弹框元素是否存在于当前pageSource存在即点击处理map.entrySet().forEach(entry -{if (pageSource.contains(entry.getKey())){if (entry.getKey().equals(com.xueqiu.android:id/snb_tip_text)){System.out.println(gesturePromptBox found);Dimension size driver.manage().window().getSize();new TouchAction(driver).tap(PointOption.point(size.width/2,size.height/2)).perform();}else {driver.findElement(entry.getValue()).click();}}});//判断完成后将隐式等待时间恢复driver.manage().timeouts().implicitlyWait(8,TimeUnit.SECONDS);}6最后将findElement方法中的handleAlert方法替换为handleAlertByPageSource方法即可
static int i 1;
public static WebElement findElement(By by) {try {System.out.println(by);return driver.findElement(by);} catch (Exception e) {if (i 2){ //设置最多递归两次i 1;return driver.findElement(by);}System.out.println(进入弹框处理第i次);handleAlertByPageSource();i;return findElement(by); //最后调用自身完成递归防止多弹框同时出现造成定位失败}
}再来解决首页加载时可能出现的坑。
App 启动加载时间较久(可能 App 本身加载慢也可能是移动设备本身加载应用速度慢也可能首页广告时间较长)导致定位超时用例失败。对此我们又如下两步解决办法。
如标题所述对首页进入使用显示等待利用搜索控件的出现来判断是否进入了首页这样不影响其他元素隐式等待的时间也解决了首页初始化加载时间过长的问题。
例如雪球仅在进入首页后会出现 id为user_profile_container的用户信息控件那么我们就可以以此为依据来判断应用是否加载完成进入了首页。
在启动方法中加入显示等待上述首页控件 30 秒到控件可被定位时确认进入首页。
new WebDriverWait(driver,30).until(ExpectedConditions.visibilityOfElementLocated(By.id(user_profile_container)));缺点 但是这样有个情况不能解决若加载完成后有弹框出现可能就一直无法定位到首页元素但是实际上已经加载完成比如下图的首页广告弹框 。
文章第二部分介绍了利用 PageSource 来判断弹框是否存在的方法在这里依然适用还是熟悉的味道还是同样的套路将弹框元素 xpath 也加入 PageSource 判断这样无论首页控件和首页弹框哪一个被发现就都可以判断应用已经加载完成成功进入首页剩下的就可以交给用例和其他处理逻辑了
new WebDriverWait(driver,30).until(x -{String xml driver.getPageSource();Boolean checkResult xml.contains(user_profile_container) || xml.contains(com.xueqiu.android:id/ib_close);System.out.println(主页元素查找的结果是: checkResult);return checkResult;});好了经过上面的分析之后我们终于搞定了入门 APP 自动化测试时的老大难问题。搞定了弹框及首页启动时加载完成如何判断处理。
下面是配套资料对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴我走过了最艰难的路程希望也能帮助到你 最后 可以在公众号自动化测试老司机 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
如果我的博客对你有帮助、如果你喜欢我的博客内容请 “点赞” “评论” “收藏” 一键三连哦