背景介绍
很多移动端应用采用的是混合页面模式,即本地应用代码与网页代码混合在一起,而在进行移动端界面自动化测试时,需要频繁的在两种不同页面类型进行驱动上下文切换,以便顺利进行移动端整体流程的相关自动化测试。
一种方法是操作本地应用代码中的界面元素时调用切换上下文方法,并在两个方法中间嵌入 webview 相关的语句
…
beginwebview ()
…
endwebview()
…
还有一种是基于方法封装模式,外层方法操作本地 UI,调用操作 webview 的内层方法
void uitest()
{
…
webview1();
…
}
public static void weview1()
{
beginwebview ()
…
endwebview()
}
现有方式的缺点
第一种基于方法成对匹配的模式,编写用例过程简单,代码量少,但如果代码编写中产生匹配错误,会导致运行后续代码报错,而且该类错误也不易排查。
第二种基于方法封装模式,这种模式会导致自动化测试用例编写过程中产生大量的冗余代码,也会产生一些潜在的错误,如定义了网页代码操作的方法,但在本地代码用例中未调用该方法,在封装方法内未将驱动上下文切换方法引入等。
我们采用的简约设计——基于 Java 的 Lambda 表达式的封装方法
private static void beginWebView()
{
Set<String> contextset= ((AppiumDriver)driver).getContextHandles();
for(String context:contextset)
{
if(context.toUpperCase().startsWith("WEBVIEW_")) ((AppiumDriver)driver).context(context);
}
}
private static void endWebView()
{
((AppiumDriver)driver).context("NATIVE_APP");
}
public static <T> void webView(Consumer<? super T> codes) beginWebView();
{
try {codes.accept(null);}catch (Exception e){e.printStackTrace();}
endWebView();
}
自动化测试用例中可以这样调用,是不是很方便。写错了会报编译错误,还可以方便的引用外层变量,简单了很多。
webView(
w -> {
driver.findElement(By.id(“search")).click();
});