精华内容
下载资源
问答
  • 手机(模拟器,andrroid手机) 软件: appiun(已配置完成相关环境变量) 使用方法 点击appium图标进入首页 默认端口号:4723 点击启动服务按钮跳转服务运行页面 点击开始进入配置信息页面 json文本如下,可根据...

    物料清单
    硬件:
    电脑(mac,windows)
    手机(模拟器,andrroid手机)
    软件:
    appiun(已配置完成相关环境变量)
    使用方法
    点击appium图标进入首页
    默认端口号:4723
    点击启动服务
    点击启动服务按钮跳转服务运行页面
    点击此按钮进入信息页
    点击开始进入配置信息页面
    在这里插入图片描述
    json文本如下,可根据实际情况粘贴复制:
    {
    “platformName”: “Android”,
    “platformVersion”: “10.0.0”,
    “deviceName”: “309b589a”,
    “appPackage”: “com.ktakilat.loan”,
    “appActivity”: “com.pendanaan.kta.ui.activity.home.Home2018Activity”
    }
    上图信息获取方法
    2,android版本查看方法路径:手机-关于手机-安卓版本
    3,设备号查看方法:手机打开开发者模式,连接电脑,在终端输入(adb devices)
    在这里插入图片描述
    4,5 包名启动信息查看方法:打开所用的app在终端输入(adb shell dumpsys window w | grep / | grep name=)如下图,包名和activity信息
    在这里插入图片描述
    ok,点击开始,启动app
    在这里插入图片描述
    过程中会安装一个这样的app勿删
    到这里就结束了,从这里开启你的自动化之旅吧

    展开全文
  • 在app自动化的过程中,可能会需要通过自动化来做一些手机的兼容性测试,但是需要同时在多个手机启动app 环境搭建 1、模拟器选择的是雷电模拟器多开器。 2、两台设备都安装淘宝 3、安装appium命令行 配置手机信息 ...

    在app自动化的过程中,可能会需要通过自动化来做一些手机的兼容性测试,但是需要同时在多个手机启动app

    环境搭建

    1、模拟器选择的是雷电模拟器多开器。
    在这里插入图片描述
    在这里插入图片描述
    2、两台设备都安装淘宝

    3、安装appium命令行

    配置手机信息

    需要把手机信息,就是通常我们启动手机的desired_caps配置信息。这里安静通过yaml的方式进行配置

    - devices: emulator-5554
      port: 4730
      desired_caps:
        platformName: Android
        deviceName: emulator-5554
        appPackage: com.taobao.taobao
        noReset:  !!bool True
        appActivity: com.ali.user.mobile.login.ui.UserLoginActivity
    
    - devices: emulator-5556
      port: 4740
      desired_caps:
        platformName: Android
        deviceName: emulator-5556
        appPackage: com.taobao.taobao
        noReset:  !!bool True
        appActivity: com.ali.user.mobile.login.ui.UserLoginActivity
        automationName: uiautomator2
    

    多线程启动appium

    这里和前面写的多线程进行启动,其实类型的,只是单独的把启动appium封装起来,其中也包括了一些读取设备信息,以及获取设备的端口号和设备信息

    # coding:utf-8
    # coding:utf-8
    import time
    from common.dos_cmd import Dos_adb
    from common.read_yaml import GetYaml
    import os
    from appium import webdriver
    import threading
    path  =os.path.dirname(os.getcwd())
    app = os.path.join(os.path.join(path,'config'),'app.yaml')
    class Server():
        def __init__(self):
            self.adb = Dos_adb()
            self.yaml = GetYaml(app)
        def get_driver(self):
            '''获取设备列表'''
            devices_list = self.adb.get_device()
            return devices_list
    
        def get_dos(self):
            '''命令行启动appium'''
            result = self.yaml.get_data()
            dos_list = []
            android_list = []
            for j in result:
                port = j['port']
                devices = j['desired_caps']['deviceName']
                android_list.append(j['desired_caps'])
                for i in range(1):
                    a = 'appium -p %s -U %s' %(port,devices)
                    dos_list.append(a)
            return dos_list
    
        def get_commad(self):
            '''执行appium启动'''
            self.dos_list = self.get_dos()
            for i  in  self.dos_list:
                self.adb.get_adb(i)
    
        def get_android(self,devicesName):
            '''获取port和设备信息'''
            desired_caps = self.yaml.get_data()
            for i in desired_caps:
                if devicesName in i['devices']:
                    port = i['port']
                    desired_cap = i['desired_caps']
                    return (port,desired_cap)
    
        def main(self):
            '''多线程启动'''
            thread_list = []
            for i in range(2):
                appium_server = threading.Thread(target=self.get_commad)
                thread_list.append(appium_server)
            for j in thread_list:
                j.start()
            time.sleep(5)
    
        def android_start(self,deviceName):
            '''启动webdriver'''
            android = self.get_android(deviceName)
            driver = webdriver.Remote('http://127.0.0.1:%s/wd/hub' % android[0], android[1])
            return driver
    
    if __name__ == '__main__':
        xx = Server()
        devices = xx.get_driver()
        print(devices)
        for i in devices:
            xx.main()
            time.sleep(5)
            xx.android_start(i)
    

    编写测试用例

    用例还是用的以前的那个用例,然后直接进行通过设备的方式进行启动appium

    # coding:utf-8
    from pages.login_page import LoginPage
    import time
    import os
    from common.aa import Server
    path  =os.path.dirname(os.getcwd())
    # 获取到yaml文件路径
    yaml_path = os.path.join(os.path.join(path,'config'),'element.yaml')
    class BaseDriver:
        def login(self,driver):
            page =LoginPage(driver)
            time.sleep(8)
            # 获取用户名元素以及输入内容
            use = page.get_username_element(yaml_path)
            use.send_keys('1111')
            # 获取密码元素以及输入内容
            pas = page.get_password_element(yaml_path)
            pas.send_keys('22222')
            # 进行点击登录
            button = page.get_login_button_element(yaml_path)
            button.click()
    
    if __name__ == '__main__':
        x = BaseDriver()
        server = Server()
        server.main()
        drivers = server.get_driver()
        for i in drivers:
            driver = server.android_start(i)
            x.login(driver)
    
    

    这里虽然用到了多线程,但是还是上一个用例结束,才会去执行下一台机器。

    注:这里代码只上传了部分代码,完整代码可以去前面定位封装中进行查看。

    点赞关注~~持续分享,加入我们,642830685,免费领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。

    展开全文
  • <div><p>app_start启动APP会打开手机自动旋转(下拉通知栏可以看到的“自动旋转”) 举例: d.app_start("com.android.chrome") d.app_start("com.android.mms") <p>...
  • 测试手机app启动时间

    2019-10-31 23:58:29
    测试手机app启动时间 首先讲一下冷启动和热启动的区别 冷启动:指 app 被后台杀死后,在这个状态打开 app,这种启动方式叫做冷启动。 热启动:指 app 没有被后台杀死,仍然在后台运行,通常我们再次去打开这个 app,...

    测试手机app启动时间

    首先讲一下冷启动和热启动的区别
    冷启动:指 app 被后台杀死后,在这个状态打开 app,这种启动方式叫做冷启动。
    热启动:指 app 没有被后台杀死,仍然在后台运行,通常我们再次去打开这个 app,这种启动方式叫热启动。

    测试方法:
    1、前提 电脑已经安装adb 并用数据线连接手机(至于开发者模式啥的我就不说了)
    2、
    (1)先获取测试应用的包名和activity
    (2)adb shell am start -W -n app包名/activity
    比如这是我测试抖音的启动时间:
    adb shell am start -W -n com.ss.android.ugc.aweme/com.ss.android.ugc.aweme.main.MainActivity
    在这里插入图片描述
    thistime就是启动时间单位毫秒

    另外,如果测试结果差距较大,建议多试几次,然后取平均值

    展开全文
  • android监听手机app启动

    2016-12-02 18:30:47
    android监听app启动,在API20以前用ActivityManager获取栈顶最近的应用,但API20以后捕捉不到手机上软件包名,这个更改可以获取最近打开app的包名,从而监听打开的APP
  • android启动手机指定app

    2019-06-28 12:04:49
    主界面: package ... import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widg...

    主界面:

    package com.example.administrator.testz;
    
    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
        private Button btn_text, btn_clear;
        public static String PACKAGE_NAME = "package";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    
            btn_text = (Button) findViewById(R.id.btn_text);
            btn_clear = (Button) findViewById(R.id.btn_clear);
            initSp();
            btn_text.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    try {
                        Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage(SPUtils.get(getApplicationContext(),
                                MainActivity.PACKAGE_NAME, "").toString());
                        startActivity(LaunchIntent);
                    } catch (Exception e) {
                        Toast.makeText(getApplicationContext(), "启动APP失败", Toast.LENGTH_SHORT).show();
                    }
    
                }
            });
            btn_clear.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    SPUtils.clear(getApplicationContext());
                }
            });
    
        }
    
        private void initSp() {
            if (SPUtils.get(this, PACKAGE_NAME, "").equals("")) {
                //默认包名为网易云音乐   com.netease.cloudmusic
                //qq  com.tencent.mobileqq
                SPUtils.put(this, PACKAGE_NAME, "com.netease.cloudmusic");
            }
        }
    }
    

    缓存类:

    package com.example.administrator.testz;
    
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Map;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    
    public class SPUtils {
        /**
         * 保存在手机里面的文件名
         */
        public static final String FILE_NAME = "share_data";
    
        /**
         * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
         *
         * @param context
         * @param key
         * @param object
         */
        public static void put(Context context, String key, Object object) {
    
            SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                    Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sp.edit();
    
            if (object instanceof String) {
                editor.putString(key, (String) object);
            } else if (object instanceof Integer) {
                editor.putInt(key, (Integer) object);
            } else if (object instanceof Boolean) {
                editor.putBoolean(key, (Boolean) object);
            } else if (object instanceof Float) {
                editor.putFloat(key, (Float) object);
            } else if (object instanceof Long) {
                editor.putLong(key, (Long) object);
            } else {
                editor.putString(key, object.toString());
            }
    
            SharedPreferencesCompat.apply(editor);
        }
    
        /**
         * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
         *
         * @param context
         * @param key
         * @param defaultObject
         * @return
         */
        public static Object get(Context context, String key, Object defaultObject) {
            SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                    Context.MODE_PRIVATE);
    
            if (defaultObject instanceof String) {
                return sp.getString(key, (String) defaultObject);
            } else if (defaultObject instanceof Integer) {
                return sp.getInt(key, (Integer) defaultObject);
            } else if (defaultObject instanceof Boolean) {
                return sp.getBoolean(key, (Boolean) defaultObject);
            } else if (defaultObject instanceof Float) {
                return sp.getFloat(key, (Float) defaultObject);
            } else if (defaultObject instanceof Long) {
                return sp.getLong(key, (Long) defaultObject);
            }
    
            return null;
        }
    
        /**
         * 移除某个key值已经对应的值
         *
         * @param context
         * @param key
         */
        public static void remove(Context context, String key) {
            SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                    Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sp.edit();
            editor.remove(key);
            SharedPreferencesCompat.apply(editor);
        }
    
        /**
         * 清除所有数据
         *
         * @param context
         */
        public static void clear(Context context) {
            SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                    Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sp.edit();
            editor.clear();
            SharedPreferencesCompat.apply(editor);
        }
    
        /**
         * 查询某个key是否已经存在
         *
         * @param context
         * @param key
         * @return
         */
        public static boolean contains(Context context, String key) {
            SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                    Context.MODE_PRIVATE);
            return sp.contains(key);
        }
    
        /**
         * 返回所有的键值对
         *
         * @param context
         * @return
         */
        public static Map<String, ?> getAll(Context context) {
            SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                    Context.MODE_PRIVATE);
            return sp.getAll();
        }
    
        /**
         * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
         *
         * @author zhy
         */
        private static class SharedPreferencesCompat {
            private static final Method sApplyMethod = findApplyMethod();
    
            /**
             * 反射查找apply的方法
             *
             * @return
             */
            @SuppressWarnings({"unchecked", "rawtypes"})
            private static Method findApplyMethod() {
                try {
                    Class clz = SharedPreferences.Editor.class;
                    return clz.getMethod("apply");
                } catch (NoSuchMethodException e) {
                }
    
                return null;
            }
    
            /**
             * 如果找到则使用apply执行,否则使用commit
             *
             * @param editor
             */
            public static void apply(SharedPreferences.Editor editor) {
                try {
                    if (sApplyMethod != null) {
                        sApplyMethod.invoke(editor);
                        return;
                    }
                } catch (IllegalArgumentException e) {
                } catch (IllegalAccessException e) {
                } catch (InvocationTargetException e) {
                }
                editor.commit();
            }
        }
    
    }

     

    展开全文
  • 手机桌面隐藏App的Icon并启动App

    千次阅读 2018-01-19 18:10:09
    手机桌面隐藏App的Icon并启动App
  • webapp 启动 手机app

    2015-08-19 11:22:19
    --APP下载端--> .download-con{position:fixed;left:0;bottom:0;} .download-con img{width:100%;display:block} .downAPP{position:relative} .nowOpen{right:0;top:0;width:25%;height:100%} ....
  • 要让app在开机之后自动启动,故需要去接收一个开机的广播;所以app首先需要去注册一个关于接送开机启动的广播(android.intent.action.BOOT_COMPLETED);而且必须要注意的一点是:这个广播必须的静态注册的,不能是...
  • 1、在手机上打开app 2、命令:adb shell dumpsys window w |findstr \/ |findstr name= 3、如下图,我在手机上打开了UC浏览器,查出来的包名应用名
  • 使用手机APP,智能钥匙、无钥匙进入、一键启动、遥控启动、手机启动、手机熄火、手机开关门锁、手机断油、车辆报警提示、系统防拆除警示等;  中山迈易科技提供的专车专用一键启动、免接线、远程防盗、手机远程掌控...
  • Flutter app启动黑屏

    2020-06-03 14:06:31
    在flutter 1.12.13版本中,Android手机启动APP会先出现黑屏,大概一两秒钟,再出现启动页。 为什么会出现这样的情况,据说是框架自身bug。 只需要在Androidmanifest.xml文件下添加如下代码即可解决此问题 <meta-...
  • 手机web启动本地APP

    2015-05-15 18:24:50
    Android Intents with Chrome A little known feature in Android lets you launch apps directly from a web page via an Android ... One scenario is launching an app when the user lands on a page, wh
  • 报错信息:An unknown server-side error occurred while processing the command. Original error: Failed to launch Appium Settings app: Condition unmet after 5399 ms. Timing out.
  • 启动APP的设置页面 Intent localIntent = new Intent(); localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); ...
  • 使用appium启动手机app时,如何查看appappPackage和appActivity的值? 一、配置aapt环境变量 1.在cmd输入: vim ~/.bash_profile 2.在打开的文件最后输入: export PATH=$android_home/build-tools/...
  • AS以前默认都是安装完APP之后自动打开APP的,现在每次安装完成之后都要手动点开比较麻烦,是不是我在哪里设置搞错...AS报错不能启动APP![图片说明](https://img-ask.csdn.net/upload/201703/10/1489077275_556518.png)
  • #coding=utf-8 from appium import webdriver desired_caps = { ‘platformName’: ‘Android’, ‘platformVersion’: ‘10.0.0’, ...‘appActivity’: ‘.ui.LauncherUI’, ‘automationName’: ‘UiAutomator
  • 最近有个小项目需要实现开机自动启动手机中预装的APP...还是先来温习一下吧啊,安卓手机启动的时候会发出一个系统广播,广播内容为ACTIN_BOOT_COMPLETED,其字符串常量为android.intent.action.BOOT_COMPLETED,,只要接
  • 真机云平台有时候会出现网络延迟现象这就很难受了,测试的时候有时候卸载一个app点来点去拖拽没有反应,懒人自有懒人的办法,打开后台。找到该设备的序列号,在adb窗口中输入。 adb -s 手机序列号 shell dumpsys ...
  • 1. 手机链接电脑时遇到的问题,设备一直显示不出来,运行命令adb devices,只显示:List of devices attached,后来换了数据线可以显示了。 2. 有些手机一直显示:xxxxx unauthorized, 后来重启电脑解决问题。 1,...
  • 在公司中,有一次看到一个APP项目中用的是关于积分墙模块中,有个可以启动手机上的应用的地方,突然就想了解这么弄,今天刚好有空写文章,希望能跟大家一起探讨学习!!! 其中可分成两类: 只知道项目的APP包名而不知道APP...
  • 本代码适应于手机浏览器判断当前手机中是否安装了某app应用,如果app已经安装则开启app,如果尚未安装app,则跳转到app对应的下载地址页面。
  • 一、设备信息配置  脚本如下: 1 from appium import webdriver ... 3 class my_app(): 4 def __init__(self): 5 desired_caps = {} 6 # 使用的手机或模拟器操作系统 7 desired_caps["platf...
  • H5网页启动APP

    千次阅读 2018-11-14 14:10:11
    功能需求描述:在手机端web页面点击一个按钮(或者a标签),...启动APP&lt;/a&gt;  &lt;/div&gt; Android端:  ​​​​​ //指定文档类型及编码格式,由系统已安装的解释器解析。  &lt;?...
  • 先配置好fiddler和手机(模拟器也可以),然后用手机或者模拟器运行app,用fiddler抓包找到自己想要的内容,然后可以自定义script保存数据。(实属无奈,用python模拟不了一些东西) 电脑最好是笔记本,这样能和手机...
  • 手机浏览器启动你的app

    千次阅读 2018-01-11 11:13:31
    原理是当通过schema方式打开客户端后,手机当前聚焦的视图就不是浏览器了,浏览器就暂时不会执行setTimeout和setInterval方法 下面以腾讯微博为例 function redirect(){ location.href="TencentWeibo://xxx";
  • 每当我们冷启动打开app的时候,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如手机QQ,微信。 为什么会出现这样的现象呢?:主要是由于在应用启动的时候需要加载相关资源,在还没有执行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,492
精华内容 1,396
关键字:

手机启动app