背景:Hybrid App(混合模式移动应用)是指介于web-app、native-app这两者之间的app,兼具“Native App良好用户交互体验的优势”和“Web App跨平台开发的优势”。
什么是混合型应用(Hybrid App)
我们可以理解为,在本地应用之上渲染网络组件,混合型应用本质上是被包裹在本地容器中的网络应用。这个容器允许应用程序访问设备的本地功能,如相机、GPS和联系人,并为用户提供类似本地的体验。混合应用程序还可以通过插件或模块访问设备的特定功能。
混合应用的优势
混合应用可以提供比原生或网络应用更多的优势,让我们详细讨论一下这些优势:
1.跨平台兼容性:混合应用程序的最大优势之一是它们可以在多个平台上运行,这意味着开发人员可以建立一个应用程序并将其部署在多个设备上。
2.成本效益高:混合应用程序比本地应用程序更具成本效益,因为它们花费更少的开发时间和精力。这是因为它们使用一个共同的代码库,可以在多个平台上共享。
3.更快的开发:混合应用程序可以比原生应用程序开发得更快,因为它们使用许多开发人员熟悉的网络技术。这可以帮助企业更快地将他们的应用程序推向市场。
4.访问设备功能:混合应用程序可以使用插件访问设备功能,如相机、GPS和加速器。这意味着开发人员可以建立具有高级功能的应用程序,而不必使用本地代码。
5.易于维护:混合型应用程序比本地应用程序更容易维护,因为它们使用一个共同的代码库,可以同时在多个平台上更新。从长远来看,这可以为企业节省时间和金钱。
使用混合应用程序的局限性
它们的性能可能不如本地应用程序,而且可能无法使用底层操作系统的所有特性和能力。
1.性能:混合应用程序可能有性能问题,特别是与本地应用程序相比。这是因为它们依赖于网络技术,而网络技术有时会比原生代码更慢,效率更低。
2.用户体验:混合应用程序可能无法提供与原生应用程序相同水平的用户体验。这是因为它们可能无法访问某些设备功能或提供与原生应用程序相同的性能和响应性。
3.兼容性:混合型应用程序可能无法在所有设备和平台上一致运行,这是因为它们需要在多个平台上进行测试,这可能很费时间和成本。
4.安全性:混合应用程序可能容易受到安全威胁,如数据泄露、黑客攻击和恶意软件攻击。这是因为它们依赖于网络技术,而网络技术可能存在安全漏洞。
5.维护:混合应用程序可能比本地应用程序需要更多的维护。这是因为它们可能需要经常更新,以跟上设备操作系统和新网络技术的变化。
因此,在考虑任何方法之前,我们也应该考虑这些问题。
如何实现混合型应用程序的自动化?
在混合应用程序中,有多个上下文:一个代表应用程序的本地部分,一个或多个代表存在的每个网络视图的上下文(大多数情况下只有一个)。通过Appium客户端,可以获得一个可用上下文的列表,或者可以使用Context API告诉Appium切换到一个给定的上下文:
-
driver.getContextHandles();
-
driver.context("NATIVE_APP");
在上面的例子中,我们已经切换到了Native视图。但是如果想切换到web视图,首先需要知道web视图上下文的名称。在那里使用这个getContextHandles()方法来找出指代web视图上下文的正确字符串。我们可以通过很多方法来实现这一点。我建议使用下面的方法来完成这个任务:
-
private String getWebContextNames(AppiumDriver driver) {
-
ArrayList<String> contexts = newArrayList(driver.getContextHandles());
-
for (String context : contexts) {
-
if (!context.equals("NATIVE_APP")) {
-
return context;
-
}
-
}
-
returnnull;
-
}
另外,我们也可以使用下面的代码来切换到网页视图。
-
//Retrieve all available context names into Set
-
Set<String> contextNames = driver.getContextHandles();
-
for (String contextName : contextNames) {
-
//This will print out all the available contexts
-
System.out.println(contextName); }
-
// This will set context to WEBVIEW. most of the times webview would be at number 1
-
driver.context(contextNames.toArray()[1]);
-
//you can perform web testing actions hereafter
-
String myText = driver.findElement(By.cssSelector(".submit_button")).click();
让我们来理解上面的代码和它的含义。
这意味着,从现在开始,我们从Appium客户端发送的任何命令都将参考网页视图中的网页,而不是本地应用程序。在这一点上,你可以执行所有的操作,并可以使用所有可以用于网页的命令,如getTitle()等,这在本地应用程序中是不可能的,就像我们在自动化任何桌面浏览器一样。
当然,在执行完网页操作后,需要回到本地语境,再次对应到本地元素。为此,我们可以简单地运行下面的命令,使用Native应用程序的上下文名称。
driver.context("NATIVE_APP");
上面的代码是完全跨平台的,你可以在IOS和Android版本的应用程序上使用这个代码。
注意:Chromedriver的每个版本都有其支持的Chrome浏览器的最低版本,这意味着如果你得到的Appium版本捆绑了Chromedriver的X版本,而你设备上的Chrome版本比X版本的最低Chrome版本要老,webviews将无法自动运行,因为Chrome浏览器版本不再与Chromedriver版本兼容。如果你遇到这个问题,你会看到以下错误信息。
在处理该命令时发生了一个未知的服务器端错误。原始错误:未知错误:Chrome版本必须>=55.0.2883.0
从Appium 1.15.0开始,有可能从谷歌官方存储中自动下载必要的chromedriver到chromedriverExecutableDir。该脚本将自动搜索支持给定浏览器/网页视图的最新chromedriver版本,下载并添加到chromedriverChromeMappingFile映射中。你需要做的就是在启用chromedriver_autodownload功能的情况下使用以下命令执行服务器。
appium --allow-insecure chromedriver_autodownload
另外,你也可以参考官方文件来解决这个问题,Appium ChromeDriver设置文件
现在唯一剩下的是,为Android和IOS设置浏览器驱动程序,让我们来看看如何做到这一点。
在IOS系统中设置浏览器驱动程序
-
DesiredCapabilitiescapabilities=newDesiredCapabilities();
-
capabilities.setCapability("platformName", "IOS");
-
capabilities.setCapability("platformVersion", "12.0");
-
capabilities.setCapability("deviceName", "iPhone 12");
-
capabilities.setCapability("app",IOS);
-
IOSDriverdriver=newIOSDriver<>(newURL("http://127.0.0.1::4723"), capabilities);
-
在Android中设置浏览器驱动程序
-
DesiredCapabilitiescapabilities=newDesiredCapabilities();
-
capabilities.setCapability("platformName", "Android"); capabilities.setCapability("deviceName", "Android Emulator");
-
capabilities.setCapability("automationName", "UiAutomator2");
-
capabilities.setCapability("app", ANDROID);
-
AndroidDriverdriver=newAndroidDriver(newURL(""http://127.0.0.1::4723"), capabilities);
-
}
结语
总之,使用Appium实现混合应用的自动化是提高跨平台移动应用质量的有效途径。Appium为开发者提供了一个灵活和用户友好的平台,使他们能够用各种编程语言编写代码,并与应用程序的UI元素进行互动,从而实现混合应用程序的自动化测试。此外,Appium支持在真实设备和仿真器上进行测试。凭借其自动化重复性任务的能力和强大的测试功能,Appium是希望构建和测试高质量混合移动应用程序的开发者和企业的一个基础工具。
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取