基于Spring的Appium配置应用
本文主要是讲述,使用Spring框架,优化Appium的Driver调用,并将写在代码里的大量配置参数定义到配置文件当中,还可灵活的控制调用AndroidDriver还是IOSDriver。
Spring的环境,请自行搭建。
下面的用例是基于spring4.3,appium java client 4.1.2, selenium 3.0.1
首先,我们写一个Driver,定义一些Bean属性,这些属性都和创建AndroidDriver,IOSDriver相关:
package test; import java.net.URL;
import java.util.ArrayList;
import java.util.List; import org.openqa.selenium.remote.DesiredCapabilities;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.ios.IOSDriver; @Component
@Scope("prototype")
public class Driver { private List<ArrayList<String>> capabilityList;
private DesiredCapabilities capabilities;
private URL url;
private AndroidDriver<MobileElement> androidDriver;
private IOSDriver<MobileElement> iOSDriver; public List<ArrayList<String>> getCapabilityList() {
return capabilityList;
} public void setCapabilityList(List<ArrayList<String>> capabilityList) {
this.capabilityList = capabilityList;
} public DesiredCapabilities getCapabilities() {
return capabilities;
} public void setCapabilities(DesiredCapabilities capabilities) {
this.capabilities = capabilities;
} public URL getUrl() {
return url;
} public void setUrl(URL url) {
this.url = url;
} public AndroidDriver<MobileElement> getAndroidDriver() {
return androidDriver;
} public void setAndroidDriver(AndroidDriver<MobileElement> androidDriver) {
this.androidDriver = androidDriver;
} public IOSDriver<MobileElement> getiOSDriver() {
return iOSDriver;
} public void setiOSDriver(IOSDriver<MobileElement> iOSDriver) {
this.iOSDriver = iOSDriver;
} }
然后我们创建一个DriverAdaptor,用来初始化和关闭Driver
package test; import java.util.ArrayList;
import java.util.List; import javax.annotation.Resource; import org.openqa.selenium.remote.DesiredCapabilities;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component; import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.ios.IOSDriver; @Component
public class DriverAdaptor { private AndroidDriver<MobileElement> androidDriver = null;
private IOSDriver<MobileElement> iOSDriver = null; @Resource
private Driver driver; public Driver getDriver() {
return driver;
} public void setDriver(Driver driver) {
this.driver = driver;
} @Resource
ApplicationContext ctx; @Value("#{baseconfig.environment}")
String environment; @SuppressWarnings("unchecked")
public void initAndroidDriverByConfigFile() throws Exception {
for (ArrayList<String> arg : (List<ArrayList<String>>) ctx.getBean(environment)) {
ctx.getBean("capabilities", DesiredCapabilities.class).setCapability(arg.get(0), arg.get(1));
}
androidDriver = new AndroidDriver<>(driver.getUrl(), driver.getCapabilities());
driver.setAndroidDriver(androidDriver);
} public void quitAndoridSession() {
if (androidDriver != null)
androidDriver.quit();
} @SuppressWarnings("unchecked")
public void initIOSDriverByConfigFile() throws Exception {
for (ArrayList<String> arg : (List<ArrayList<String>>) ctx.getBean(environment)) {
ctx.getBean("capabilities", DesiredCapabilities.class).setCapability(arg.get(0), arg.get(1));
}
iOSDriver = new IOSDriver<>(driver.getUrl(), driver.getCapabilities());
driver.setiOSDriver(iOSDriver);
} public void quitIOSService() {
if (iOSDriver != null)
iOSDriver.quit();
} }
接着,我们把Spring的配置文件写一下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"> <!-- 组件扫描 -->
<context:component-scan base-package="test"></context:component-scan>
<!-- aspect -->
<aop:aspectj-autoproxy proxy-target-class="false" /> <!-- 定义配置文件properties -->
<util:properties id="android" location="classpath:android.properties" />
<util:properties id="ios" location="classpath:ios.properties" />
<util:properties id="baseconfig" location="classpath:baseconfig.properties" />
<!-- Android -->
<util:list id="androidCapabilityList">
<list>
<value>platformName</value>
<value>#{android.platformName}</value>
</list>
<list>
<value>deviceName</value>
<value>#{android.deviceName}</value>
</list>
<list>
<value>platformVersion</value>
<value>#{android.platformVersion}</value>
</list>
<list>
<value>appPackage</value>
<value>#{android.appPackage}</value>
</list>
<list>
<value>appActivity</value>
<value>#{android.appActivity}</value>
</list>
</util:list>
<!-- IOS -->
<util:list id="iOScapabilityList">
<list>
<value>platformName</value>
<value>#{ios.platformName}</value>
</list>
<list>
<value>deviceName</value>
<value>#{ios.deviceName}</value>
</list>
<list>
<value>automationName</value>
<value>#{ios.automationName}</value>
</list>
<list>
<value>platformVersion</value>
<value>#{ios.platformVersion}</value>
</list>
<list>
<value>app</value>
<value>#{ios.app}</value>
</list>
</util:list>
<!-- appium driver -->
<bean id="url" class="java.net.URL">
<constructor-arg index="0" value="#{baseconfig.url}"></constructor-arg>
</bean>
<bean id="capabilities" class="org.openqa.selenium.remote.DesiredCapabilities"></bean>
<bean id="driver" class="test.Driver">
<property name="capabilityList" ref="#{baseconfig.environment}"></property>
<property name="capabilities" ref="capabilities"></property>
<property name="url" ref="url"></property>
</bean>
</beans>
在这个配置文件中,我们定义了两个.properties,分别用来存放Android,IOS的相关配置
第三个配置文件,通过
<property name="capabilityList" ref="#{baseconfig.environment}"></property>
来获取加载哪个配置文件
.properties配置文件如下:
android.properties 这里面我们模拟调起微信
#APPium Android Driver
platformName:Android
deviceName:HUAWEIP8
platformVersion:6.0
appPackage:com.tencent.mm
appActivity:.ui.LauncherUI
ios.properties .app的路径请自己配一下
#APPium IOS Driver
platformName:iOS
deviceName:iPhone Simulator
automationName:XCUITest
platformVersion:10.2
app:/X/X/X.app
baseconfig.properties
environment:androidCapabilityList
# Driver url
url:http://127.0.0.1:4723/wd/hub
最后写一个测试类看一下能不能调起微信
package test; import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver; public class TestDemo { static ApplicationContext ctx;
static AndroidDriver<MobileElement> driver;
static DriverAdaptor driverAdaptor; @Before
public void before() throws Exception {
ctx = new ClassPathXmlApplicationContext("spring.xml");
driverAdaptor = ctx.getBean("driverAdaptor", DriverAdaptor.class);
driverAdaptor.initAndroidDriverByConfigFile();
} @After
public void after() throws Exception {
if (driverAdaptor != null)
driverAdaptor.quitAndoridSession();
} @Test
public void test1() throws InterruptedException {
Thread.sleep(5000);
} }
测试方法里面只写了个延迟,如果微信能调起来,说明流程上是成功的。
基于Spring的Appium配置应用的更多相关文章
- 实战:基于 Spring 的应用配置如何迁移至阿里云应用配置管理 ACM
最近遇到一些开发者朋友,准备将原有的Java Spring的应用配置迁移到 阿里云应用配置管理 ACM 中.迁移过程中,遇到不少有趣的问题.本文将通过一个简单的样例来还原迁移过程中遇到的问题和相关解决 ...
- 基于spring的shiro配置
shiro是一个特别简单,易用的框架,在此记录一下shiro的使用配置. 首先,创建四张表:user role user_role permission,分别为用户.角色.用户与角色关系表和权限 ...
- 简单两步快速实现shiro的配置和使用,包含登录验证、角色验证、权限验证以及shiro登录注销流程(基于spring的方式,使用maven构建)
前言: shiro因为其简单.可靠.实现方便而成为现在最常用的安全框架,那么这篇文章除了会用简洁明了的方式讲一下基于spring的shiro详细配置和登录注销功能使用之外,也会根据惯例在文章最后总结一 ...
- 基于注解的Spring多数据源配置和使用
前一段时间研究了一下spring多数据源的配置和使用,为了后期从多个数据源拉取数据定时进行数据分析和报表统计做准备.由于之前做过的项目都是单数据源的,没有遇到这种场景,所以也一直没有去了解过如何配置多 ...
- 基于xml的Spring多数据源配置和使用
上一篇讲了<基于注解的Spring多数据源配置和使用>,通过在类或者方法上添加@DataSource注解就可以指定某个数据源.这种方式的优点是控制粒度细,也更灵活. 但是当有些时候项目分模 ...
- 基于注解的Spring AOP的配置和使用
摘要: 基于注解的Spring AOP的配置和使用 AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不 ...
- 基于Spring的可扩展Schema进行开发自定义配置标签支持
一.背景 最近和朋友一起想开发一个类似alibaba dubbo的功能的工具,其中就用到了基于Spring的可扩展Schema进行开发自定义配置标签支持,通过上网查资料自己写了一个demo.今天在这里 ...
- Spring IoC — 基于Java类的配置
普通的POJO只要标注@Configuration注解,就可以为Spring容器提供Bean定义的信息了,每个标注了@Bean的类方法都相当于提供一个Bean的定义信息. 基于Java类的配置方法和基 ...
- Spring Boot自动配置源码解析(基于Spring Boot 2.0.2.RELEASE)
在Spring Boot官方介绍中,首一段话是这样的(如下图).我们可以大概了解到其所表达的含义:我们可以利用Spring Boot写很少的配置来创建一个非常方便的基于Spring整合第三方类库的单体 ...
随机推荐
- js前端获取页面传递的参数
转载的,先记下: UrlParm = function () { // url参数 var data, index; (function init() { data = []; index = {}; ...
- Cobbler自动化部署最佳实践
第1章 Cobbler自动化部署最佳实践 运维自动化在生产环境中占据着举足轻重的地位,尤其是面对几百台,几千台甚至几万台的服务器时,仅仅是安装操作系统,如果不通过自动化来完成,根本是不可想象的. 面对 ...
- 【Flex】读取本地JSON,然后JSON数据转成XML数据
package utils { import flash.xml.XMLDocument; import flash.xml.XMLNode; import mx.rpc.xml.SimpleXMLE ...
- Visual Studio 2017创建.net standard类库编译出错原因
正式版上个月已经Release了,从那时到现在经常会收到更新提示,估计问题还不少吧!其中最吸引我的当然是.net standard与.net core. 刚好最近接触.net standard项目,新 ...
- JavaScript数组基础编程题归纳
之前的随笔"JavaScript中数组类型的属性和方法"中有介绍很多数组类型的方法,但都是一些理论.最近在练习在线编程题,发现自己还是习惯于用常规的循环来答题,对于数组的方法的使用 ...
- elasticsearch5.3安装插件head
1.下载并配置nodejscd /usr/local/src/wget https://nodejs.org/dist/v6.9.5/node-v6.9.5-linux-x64.tar.xz & ...
- windows下使用wineshark分析抓取本地回环包
## 摘要 由于windows系统没有提供本地回环网络的接口,用Wireshark监控网络的话看不到localhost的流量. 想要获取本地的网络数据包,可以通过一款小巧的开源软件RawCap来进行抓 ...
- Extjs6(特别篇)——项目自带例子main.js拆分详解
本文基于extjs6.0.0 一.拆分代码来看看 1.主页面main是个tab页: 写一些页面的依赖: 标明页面的controller和viewModel Ext.define('Learning.v ...
- React-Native 之 redux 与 react-redux
前言 本文 有配套视频,可以酌情观看. 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我讨论. 文中所有内容仅供学习交流之用,不可用于商业用途,如因此引起的相关法律法规责任,与我无关,如文中内 ...
- bzoj4817 [Sdoi2017]树点涂色
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...