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);
    }
posted @ 2020-01-04 00:35  hjy1995  阅读(2725)  评论(0编辑  收藏  举报