• 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:UsersHJYAppDataLocalProgramsAppium esourcesapp ode_modulesappiumuildlibmain.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);
        }
  • 相关阅读:
    面试题--十进制转换成2进制
    c++基础--如何将函数作为参数传递
    面试题--完全二叉树的的最后一层的最右节点
    数据库原理--故障恢复
    数据库原理--事务并发控制
    数据库原理--事务(一)
    数据库原理--1nf 2nf 3nf
    数据库原理--外键和主键
    数据库原理--函数依赖和范式
    人人都有极客精神
  • 原文地址:https://www.cnblogs.com/yjh1995/p/12147647.html
Copyright © 2020-2023  润新知