背景介绍
很多移动端应用采用的是混合页面模式,即本地应用代码与网页代码混合在一起,而在进行移动端界面自动化测试时,需要频繁的在两种不同页面类型进行驱动上下文切换,以便顺利进行移动端整体流程的相关自动化测试。
一种方法是操作本地应用代码中的界面元素时调用切换上下文方法,并在两个方法中间嵌入 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();
});


↙↙↙阅读原文可查看相关链接,并与作者交流