appium(四)appium-server的使用
1、介绍
appium-server是以前的,现在已经没有更新了,比appium-desktop的有点就是使用脚本启动APP时,不需要启动appium-desktop的服务;
appium-server是用nodejs写的,所以要下载appium-server需要先安装nodejs;
2、appium-server的安装
(1)先安装nodejs
官网下载地址:http://nodejs.cn/download/ ,检查环境变量path中是否自动添加了nodejs所在路劲,没有的话手动添加;在命令行窗口用node –v和npm –v命令验证安装是否成功。
查看npm设置:npm config ls ,下图中的 prefix 就是安装路径
设置npm安装路径:npm config set prefix “安装路径(注意不要带中文和空格)”
(2)appium-server安装
安装方式1:使用npm安装Appium-server:npm --registry http://registry.npm.taobao.org install appium -g ;建议用下面淘宝NPM镜像安装
安装方式2:使用淘宝的cnpm命令安装:先安装cnpm命令:npm --registry http://registry.npm.taobao.org install cnpm -g ;然后使用cnpm安装appium-server: cnpm install appium -g
安装完成后,把npm安装路径配置到path里,然后在cmd中输入appium验证安装成功
3、启动appium-server
(1)appium-server的参数
输入appium -h命令可以获取到命令行参数列表,appium-server的参数以及许多desired capabilities参数都可以在appium命令行启动时指定。
推荐指定--log参数和--local-timezone参数配置appium日志保存路径即可。
(2)使用Java启动和关闭
//启动和关闭appium-server @Test public void startAndKillAppium() throws IOException, InterruptedException { //启动appium-server String startAppium="cmd /c start appium -a 127.0.0.1 -p 4723 -g E:\\appium.log --local-timezone --log-timestamp"; //Runtime.getRuntime().exec() 执行cmd命令 Runtime.getRuntime().exec(startAppium); Thread.sleep(2000); //关闭appium-server和命令行窗口,因为appium-server是用nodejs写的,可以直接关闭node就关闭了appium-server String KillNode="taskkill /F /IM node.exe"; String killCmd="taskkill /F /IM cmd.exe"; Runtime.getRuntime().exec(KillNode); Runtime.getRuntime().exec(killCmd); }
使用Java启动appium-server时踩过的坑
(1)如果报错找不到appium命令,使用admin打开IDEA
(2)如果用Java启动appium-server时,appium的日志出现下面的报错:
"Closing session, cause was 'Unexpected shutdown',Encountered internal error running command: NoSuchDriverError: A session is either terminated or not started";
导致 new AndroidDriver时404,而使用Java启动appium-desktop时就不会出现这个情况,原因是 appium-desktop 和 appium-server 的版本不统一,网上建议使用 cnpm 更新appium-server可以解决此问题,但是我使用此方法没有解决,以下是自己试出来的方法,亲测有效
--1. 首先找到appium-server的安装路径,即上面设置的 npm 安装路径,找到并打开 appium.cmd 批处理文件
--2. 可以看到实际用来启动appium-server的是一个 main.js的文件,可以将启动的文件换成appium-desktop的main.js文件,该文件存在于
C:\Users\HJY\AppData\Local\Programs\Appium\resources\app\node_modules\appium\build\lib\main.js ,替换后
--3. 替换启动路径后,使用Java启动appium-server就不会再报错了
然后我们使用Java启动appium-server并执行自动化,首先要使用 adb 连接模拟器
public class AppTest { //使用appium-server启动APP public static void main(String[] args) throws IOException, InterruptedException { //启动appium-server String startAppium="cmd /c start appium -a 127.0.0.1 -p 4723 -g E:\\appium.log --local-timezone --log-timestamp"; Runtime.getRuntime().exec(startAppium); //启动appium-server需要一定时间,这里需要设置等待时间 Thread.sleep(5000); //设置Capabilities参数 DesiredCapabilities desiredCapabilities=new DesiredCapabilities(); //必要参数 desiredCapabilities.setCapability("deviceName", "127.0.0.1:7555"); desiredCapabilities.setCapability("platformName", "Android"); desiredCapabilities.setCapability("platformVersion","6.0.1"); desiredCapabilities.setCapability("appPackage","com.tencent.mobileqq"); desiredCapabilities.setCapability("appActivity",".activity.LoginActivity"); //可选参数 //不要重置签名 desiredCapabilities.setCapability("noSign",true); //不清除缓存 desiredCapabilities.setCapability("noReset",true); //设置使用unicode键盘,让自动化脚本实现过程中能够输入中文,成对使用,单独使用下面的某一个属性会ignore desiredCapabilities.setCapability("unicodeKeyboard",true); desiredCapabilities.setCapability("resetKeyboard",true); //电脑连接了多个设备时,指定设备 //desiredCapabilities.setCapability("udid","127.0.0.1:7555"); //创建driver对象 AndroidDriver driver=new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), desiredCapabilities); Thread.sleep(3000); //定位并操作元素 driver.findElement(MobileBy.AccessibilityId("请输入QQ号码或手机或邮箱")).sendKeys("123456"); driver.findElement(By.xpath("//android.widget.EditText[@content-desc='密码 安全']")).sendKeys("132456"); driver.findElement(By.id("com.tencent.mobileqq:id/login")).click(); Thread.sleep(5000); //关闭APP和driver driver.closeApp(); driver.quit(); //关闭appium-server 和命令行窗口 String killCmd="taskkill /F /IM cmd.exe"; String killNode="taskkill /F /IM node.exe"; Runtime.getRuntime().exec(killNode); Runtime.getRuntime().exec(killCmd); }