在用Appium编写自动化case的时候会遇到这种场景:测试跑到某一步,验证页面上的元素应该存在。但是实际结果是页面上找不到这个元素,所以此时这个case应该fail了,后面的步骤不应该被执行。但是这个功能是需要我们自己实现的,Appium本身并不知道什么时候应该停止这个case的运行。
下面就来说说怎么实现上述功能,话不多说,直接上代码:
package modules;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
import org.openqa.selenium.WebElement;
import io.appium.java_client.TouchAction;
import io.appium.java_client.android.AndroidDriver;
import junit.framework.TestCase;
import modules.AndroidModules;
import testcase_andriod.push.OpenAppTestCase;
public class AndroidModules {
public static Logger log = Logger.getLogger(OpenAppTestCase.class);
// 验证Id存在
private boolean isIdExist(AndroidDriver<WebElement> driver, String id) {
boolean isFind = false;
try {
List<WebElement> cells = driver.findElementsById(id);
if (!cells.isEmpty()) {
isFind = true;
}
} catch (Exception e) {
log.info("页面找不到id值 - " + id + ",预期存在");
isFind = false;
}
return isFind;
}
// 判断ID应该存在
public void verifyIdExist(AndroidDriver<WebElement> driver, String id) {
boolean isFind = isIdExist(driver, id);
if (!isFind) {
failCase("页面找不到id - " + id);
}
}
// Fail case
public void failCase(String msg) {
log.info("ERROR! " + msg);
TestCase.fail("ERROR! " + msg);
}
}
应该很清楚了吧!其实用的就是junit中TestCase类的fail方法,只是在实现上做了下封装:
// Fail case
public void failCase(String msg) {
log.info("ERROR! " + msg);
TestCase.fail("ERROR! " + msg);
}
封装的好处就是无论在哪里调用这个方法,所有的输出都是包含“ERROR!”字段的,这样为我们日后的结果分析提供了方便,同时省去了重复代码编写。
有个细节还是要说下:
// 验证Id存在
private boolean isIdExist(AndroidDriver<WebElement> driver, String id) {
boolean isFind = false;
try {
List<WebElement> cells = driver.findElementsById(id);
if (!cells.isEmpty()) {
isFind = true;
}
} catch (Exception e) {
log.info("页面找不到id值 - " + id + ",预期存在");
isFind = false;
}
return isFind;
}
这里用的appium本身的查找元素的方法是findElementsById,所以用不用try块都无所谓,基本不会出现什么错误。但是如果你用的是findElementById,如果找不到就会直接报异常了,所以一定要加try块才行,除非你很喜欢那些exception信息😄
网友评论