Ejemplo n.º 1
0
 def installQuirkClass(cls):
     cls.package_name = 'com.ugen.playquirk'
     apk_path = cls.R('res/app/quirk.apk')
     if cls.package_name not in current_device().list_app():
         install_android_app(current_device().adb, apk_path)
         start_app(cls.package_name)
         time.sleep(30)
Ejemplo n.º 2
0
    def __init__(self, addr=DEFAULT_ADDR):
        try:
            port = int(addr.rsplit(":", 1)[-1])
        except ValueError:
            raise ValueError(
                'Argument `addr` should be a string-like format. e.g. "ws://192.168.1.2:5003". Got {}'
                .format(repr(addr)))

        if not current_device():
            connect_device("Android:///")
        if device_platform() == 'Android':
            local_port, _ = current_device().adb.setup_forward(
                'tcp:{}'.format(port))
            ip = 'localhost'
            port = local_port
        elif device_platform() == 'IOS':
            # Note: ios is now support for now.
            # ip = device.get_ip_address()
            # use iproxy first
            ip = 'localhost'
            local_port, _ = current_device().instruct_helper.setup_proxy(port)
            port = local_port
        else:
            import socket
            ip = socket.gethostbyname(socket.gethostname())

        self.conn = WebSocketClient('ws://{}:{}'.format(ip, port))
        self.c = RpcClient(self.conn)
        self.c.connect()

        hierarchy = FrozenUIHierarchy(Dumper(self.c))
        screen = AirtestScreen()
        inputs = AirtestInput()
        super(CocosJsPocoAgent, self).__init__(hierarchy, inputs, screen, None)
Ejemplo n.º 3
0
def init_app(plat, package_name, app_path, sleep_time):
    dev = None
    if plat.lower().find('android') >= 0:
        if not current_device():
            if plat.lower().find('sim') >= 0:
                dev = connect_device(
                    'Android:///127.0.0.1:{}?cap_method=JAVACAP&ori_method=ADBORI'
                    .format(SD.SIM_PORT))
            else:
                dev = connect_device('Android:///')
        wake()
        install_android_app(current_device().adb, app_path)
        stop_app(package_name)
        start_app(package_name)
        sleep(sleep_time / 1.5)
    elif plat == 'PC_editor':
        w = Windows()
        dev = UnityEditorWindow()
        w.keyevent('^P')  # Ctrl+P运行
        sleep(sleep_time / 2)
        dev.stop_app = w.app  # 用于获取进程id,结束进程用
    elif plat == 'PC_win':
        w = Windows()
        w.start_app(app_path)
        sleep(sleep_time)
        w.connect(process=w.app.process)
        dev = connect_device("Windows:///?class_name=UnityWndClass")
        dev.stop_app = w.app
    # elif plat == 'iOS':
    #     pass
    # elif plat == 'MAC_editor':
    #     pass
    return dev
Ejemplo n.º 4
0
    def __init__(self, addr=DEFAULT_ADDR):
        # init airtest env
        try:
            # new version
            from airtest.core.api import connect_device, device as current_device
            if not current_device():
                connect_device("Android:///")
        except ImportError:
            # old version
            from airtest.cli.runner import device as current_device
            from airtest.core.main import set_serialno
            if not current_device():
                set_serialno()
        # cocos games poco sdk listens on Android localhost:5003
        localport = addr.split(":")[-1]
        current_device().adb.forward("tcp:%s" % localport, "tcp:5003", False)

        self.conn = WebSocketClient(addr)
        self.c = RpcClient(self.conn)
        self.c.DEBUG = False
        self.c.run(backend=True)
        self.c.wait_connected()

        hierarchy = FreezedUIHierarchy(Dumper(self.c))
        screen = AirtestScreen()
        input = AirtestInput()
        super(CocosJsPocoAgent, self).__init__(hierarchy, input, screen, None)
Ejemplo n.º 5
0
    def applyMotionEvents(self, events):
        if device_platform() != 'Android':
            raise NotImplementedError

        # Android minitouch only, currently
        from airtest.core.android.minitouch import DownEvent, MoveEvent, UpEvent, SleepEvent

        mes = []
        for e in events:
            t = e[0]
            if t == 'd':
                contact = e[2]
                x, y = e[1]
                pos = self.get_target_pos(x, y)
                me = DownEvent(pos, contact)
            elif t == 'm':
                contact = e[2]
                x, y = e[1]
                pos = self.get_target_pos(x, y)
                me = MoveEvent(pos, contact)
            elif t == 'u':
                contact = e[1]
                me = UpEvent(contact)
            elif t == 's':
                how_long = e[1]
                me = SleepEvent(how_long)
            else:
                raise ValueError('Unknown event type {}'.format(repr(t)))
            mes.append(me)

        current_device().minitouch.perform(mes, interval=0)
Ejemplo n.º 6
0
    def __init__(self, addr=DEFAULT_ADDR, unity_editor=False):
        if not unity_editor:
            # init airtest env
            try:
                # new version
                from airtest.core.api import connect_device, device as current_device
                if not current_device():
                    connect_device("Android:///")
            except ImportError:
                # old version
                from airtest.cli.runner import device as current_device
                from airtest.core.main import set_serialno
                if not current_device():
                    set_serialno()
            # unity games poco sdk listens on Android localhost:5001
            current_device().adb.forward("tcp:%s" % addr[1], "tcp:5001", False)

        self.conn = TcpClient(addr)
        self.c = RpcClient(self.conn)
        self.c.DEBUG = False
        self.c.run(backend=True)
        self.c.wait_connected()

        hierarchy = FreezedUIHierarchy(Dumper(self.c), UnityAttributor(self.c))
        if unity_editor:
            screen = UnityScreen(self.c)
        else:
            screen = AirtestScreen()
        input = AirtestInput()
        super(UnityPocoAgent, self).__init__(hierarchy, input, screen, None)
Ejemplo n.º 7
0
    def setUp(self):
        if not current_device():
            connect_device('Android:///')

        self.package_name = 'com.google.android.calculator'
        apk_path = self.R('res/app/com.google.android.calculator.apk')
        install_android_app(current_device().adb, apk_path)
        start_app(self.package_name)
Ejemplo n.º 8
0
    def setUp(self):
        if not current_device():
            connect_device('Android:///')

        self.package_name = 'com.ugen.playquirk'
        apk_path = self.R('res/app/quirk.apk')
        install_android_app(current_device().adb, apk_path)
        start_app(self.package_name)
        time.sleep(30)
Ejemplo n.º 9
0
 def _get_touch_resolution(self):
     """
     get real time resolution on device if full screen
      or window size if running in window mode
     """
     if device_platform() == 'Android':
         if self.use_render_resolution:
             return current_device().get_render_resolution()
     w, h = current_device().get_current_resolution()
     return 0, 0, w, h
Ejemplo n.º 10
0
    def __init__(self, device=None, **kwargs):
        device = device or current_device()
        if not device or device.__class__.__name__ != 'IOS':
            raise RuntimeError('Please call `connect_device` to connect an iOS device first')

        agent = iosPocoAgent(device)
        super(iosPoco, self).__init__(agent, **kwargs)
Ejemplo n.º 11
0
    def __init__(self, port=DEFAULT_PORT, device=None, **kwargs):
        self.device = device or current_device()
        if not self.device:
            self.device = connect_device("Android:///")

        platform_name = device_platform(self.device)
        if platform_name == 'Android':
            # always forward for android device to avoid network unreachable
            local_port, _ = self.device.adb.setup_forward(
                'tcp:{}'.format(port))
            ip = self.device.adb.host or 'localhost'
            port = local_port
        elif platform_name == 'IOS':
            # ip = device.get_ip_address()
            # use iproxy first
            ip = 'localhost'
            local_port, _ = self.device.instruct_helper.setup_proxy(port)
            port = local_port
        else:
            try:
                ip = self.device.get_ip_address()
            except AttributeError:
                try:
                    ip = socket.gethostbyname(socket.gethostname())
                except socket.gaierror:
                    # 某些特殊情况下会出现这个error,无法正确获取本机ip地址
                    ip = 'localhost'

        agent = StdPocoAgent((ip, port))
        super(StdPoco, self).__init__(agent, **kwargs)
Ejemplo n.º 12
0
    def __init__(self, port, device=None):
        self.device = device or current_device()
        if not self.device:
            self.device = connect_device("Android:///")

        platform_name = device_platform(self.device)
        if platform_name == 'Android':
            local_port, _ = self.device.adb.setup_forward(
                'tcp:{}'.format(port))
            ip = self.device.adb.host or 'localhost'
            port = local_port
        elif platform_name == 'IOS':
            # Note: ios is now support for now.
            # ip = device.get_ip_address()
            # use iproxy first
            ip = 'localhost'
            local_port, _ = self.device.instruct_helper.setup_proxy(port)
            port = local_port
        else:
            ip = self.device.get_ip_address()

        # transport
        self.conn = WebSocketClient('ws://{}:{}'.format(ip, port))
        self.c = RpcClient(self.conn)
        self.c.connect()

        hierarchy = FrozenUIHierarchy(Dumper(self.c))
        screen = AirtestScreen()
        inputs = AirtestInput()
        super(CocosJsPocoAgent, self).__init__(hierarchy, inputs, screen, None)
Ejemplo n.º 13
0
    def setUpClass(cls):
        super(AndroidAppCase, cls).setUpClass()
        if not current_device():
            connect_device('Android:///')

        dev = current_device()
        meta_info_emitter = cls.get_result_emitter('metaInfo')
        if device_platform() == 'Android':
            meta_info_emitter.snapshot_device_info(dev.serialno,
                                                   dev.adb.get_device_info())

        cls.poco = AndroidUiautomationPoco(screenshot_each_action=False)

        action_tracker = ActionTracker(cls.poco)
        cls.register_addon(action_tracker)
        cls.site_capturer = SiteCaptor(cls.poco)
        cls.register_addon(cls.site_capturer)
Ejemplo n.º 14
0
    def __init__(self,
                 addr=DEFAULT_ADDR,
                 unity_editor=False,
                 connect_default_device=True):
        # init airtest env
        try:
            # new version
            from airtest.core.api import connect_device, device as current_device
            from airtest.core.helper import device_platform
            if unity_editor and not current_device():
                connect_device(
                    "Windows:///?class_name=UnityWndClass&title_re=Unity.*")
                game_window = current_device().app.top_window().child_window(
                    title="UnityEditor.GameView")
                current_device()._top_window = game_window.wrapper_object()
                current_device().focus_rect = (0, 40, 0, 0)

            if connect_default_device and not current_device():
                # currently only connect to Android as default
                # can apply auto detection in the future
                connect_device("Android:///")

            if device_platform() == "Android":
                # always forward port for Android
                # unity games poco sdk listens on Android localhost:5001
                current_device().adb.forward("tcp:%s" % addr[1], "tcp:5001",
                                             False)

        except ImportError:
            # old version, 逐渐废弃
            from airtest.cli.runner import device as current_device
            from airtest.core.main import set_serialno
            if not current_device():
                set_serialno()
            # unity games poco sdk listens on Android localhost:5001
            current_device().adb.forward("tcp:%s" % addr[1], "tcp:5001", False)

        self.conn = TcpClient(addr)
        self.c = RpcClient(self.conn)
        self.c.DEBUG = False
        self.c.wait_connected()

        hierarchy = FrozenUIHierarchy(Dumper(self.c), UnityAttributor(self.c))
        screen = UnityScreen(self.c)
        input = AirtestInput()
        super(UnityPocoAgent, self).__init__(hierarchy, input, screen, None)
Ejemplo n.º 15
0
    def __init__(self,
                 addr=DEFAULT_ADDR,
                 ue4_editor=False,
                 connect_default_device=True,
                 device=None,
                 **options):
        if 'action_interval' not in options:
            options['action_interval'] = 0.5

        if ue4_editor:
            dev = UE4EditorWindow()
        else:
            dev = device or current_device()

        if dev is None and connect_default_device and not current_device():
            dev = connect_device("Android:///")

        super(UE4Poco, self).__init__(addr[1], dev, **options)
Ejemplo n.º 16
0
 def __init__(self, port=DEFAULT_PORT, device=None, **kwargs):
     device = device or current_device()
     if not device:
         raise RuntimeError(
             'Please call `connect_device` first. see airtest.core.api.connect_device to get '
             'more infomation')
     ip = device.get_ip_address()
     agent = StdPocoAgent((ip, port))
     super(StdPoco, self).__init__(agent, **kwargs)
Ejemplo n.º 17
0
    def __init__(self,
                 addr=DEFAULT_ADDR,
                 unity_editor=False,
                 connect_default_device=True,
                 device=None,
                 **options):
        if 'action_interval' not in options:
            options['action_interval'] = 0.5

        if unity_editor:
            dev = UnityEditorWindow()
        else:
            dev = device or current_device()

        if dev is None and connect_default_device and not current_device():
            # currently only connect to Android as default
            # can apply auto detection in the future
            dev = connect_device("Android:///")

        super(UnityPoco, self).__init__(addr[1], dev, **options)
Ejemplo n.º 18
0
 def _get_touch_resolution(self):
     """
     get real time resolution on device if full screen
      or window size if running in window mode
     """
     if device_platform() == 'Windows':
         if self.surface is None:
             raise RuntimeError(
                 'Please initialize AirtestInput with surface object, '
                 'when running test suites on windows as target device.')
         return self.surface.getPortSize()
     else:
         display_info = current_device().display_info
         w, h = display_info["width"], display_info["height"]
         if display_info["orientation"] in (1, 3):
             return h, w
         else:
             return w, h
Ejemplo n.º 19
0
    def __init__(self, port=DEFAULT_PORT, device=None, **kwargs):
        device = device or current_device()
        if not device:
            raise RuntimeError(
                'Please call `connect_device` first. see airtest.core.api.connect_device to get '
                'more infomation')

        # always forward for android device to avoid network unreachable
        if device_platform() == 'Android':
            local_port, _ = device.adb.setup_forward('tcp:{}'.format(port))
            ip = 'localhost'
            port = local_port
        else:
            import socket
            ip = socket.gethostbyname(socket.gethostname())
            # Note: ios is not support for now.

        agent = StdPocoAgent((ip, port))
        super(StdPoco, self).__init__(agent, **kwargs)
Ejemplo n.º 20
0
def init_app(plat=SD.PLAT, package_name=SD.PACKAGE_NAME, app_path=SD.APP_PATH[SD.PLAT], sleep_time=SD.SLEEP_TIME,
             serialno=SD.SERIALNO):
    dev = None
    if plat == 'android':
        if SD.USE_ATX_SERVER2:
            atx_server2 = AtxServer2()
            device_info = atx_server2.get_usable_device_info()
            SD.UDID = device_info['udid']
            serialno = device_info['source']['remoteConnectAddress']
        if serialno and serialno.strip() != '':
            if re.search(r'127.0.0.1:\d+', serialno):
                logger.debug('模拟器用JAVACAP和ADBORI')
                dev = connect_device(f'Android:///{serialno}?cap_method=JAVACAP&ori_method=ADBORI')
            else:
                logger.debug(f'指定连接serialno: {serialno}')
                dev = connect_device(f'Android:///{serialno}')
        else:
            dev = connect_device('Android:///')
        wake()
        install_android_app(current_device().adb, app_path)
        stop_app(package_name)
        logger.debug(f'启动app:{package_name}')
        start_app(package_name)
        sleep(sleep_time / 1.5)
    elif plat == 'pc_editor':
        w = Windows()
        dev = UnityEditorWindow()
        w.keyevent('^P')  # Ctrl+P运行
        sleep(sleep_time / 2)
        dev.stop_app = w.app  # 用于获取进程id,结束进程用
    elif plat == 'pc_win':
        w = Windows()
        w.start_app(app_path)
        sleep(sleep_time)
        w.connect(process=w.app.process)
        dev = connect_device("Windows:///?class_name=UnityWndClass")
        dev.stop_app = w.app
    # elif plat == 'ios':
    #     pass
    # elif plat == 'mac_editor':
    #     pass
    return dev
Ejemplo n.º 21
0
 def __init__(self,
              game_name,
              phone_name="",
              on_connect=None,
              on_close=None):
     """address is (host, port) tuple"""
     self.game_name = game_name
     self.info = Information()
     self.phone_name = phone_name
     self.on_connect = on_connect
     self.on_close = on_close
     self.sock = None
     self.buf = b""
     self.prot = SimpleProtocolFilter()
     self.device = None or current_device()
     if not self.device and self.phone_name != None:
         self.device = connect_device("Android:///" + self.phone_name)
     self.platform_name = device_platform(self.device)
     self.connect_phone()
     self.address = (self.ip, self.port)
Ejemplo n.º 22
0
    def __init__(self, port=DEFAULT_PORT, device=None, **kwargs):
        device = device or current_device()
        ip = socket.gethostbyname(socket.gethostname())
        if not device:
            import warnings
            warnings.warn(
                "no airtest device connected, please connect_device first")
        elif device_platform(device) == 'Android':
            # always forward for android device to avoid network unreachable
            local_port, _ = device.adb.setup_forward('tcp:{}'.format(port))
            ip = device.adb.host or 'localhost'
            port = local_port
        elif device_platform(device) == 'IOS':
            # ip = device.get_ip_address()
            # use iproxy first
            ip = 'localhost'
            local_port, _ = device.instruct_helper.setup_proxy(port)
            port = local_port

        agent = StdPocoAgent((ip, port))
        super(StdPoco, self).__init__(agent, **kwargs)
Ejemplo n.º 23
0
    def __init__(self,
                 addr=DEFAULT_ADDR,
                 unity_editor=False,
                 connect_default_device=True,
                 **options):
        if 'action_interval' not in options:
            options['action_interval'] = 0.5

        dev = None
        if unity_editor:
            dev = connect_device(
                "Windows:///?class_name=UnityWndClass&title_re=Unity.*")
            game_window = dev.app.top_window().child_window(
                title="UnityEditor.GameView")
            dev._top_window = game_window.wrapper_object()
            dev.focus_rect = (0, 40, 0, 0)

        if connect_default_device and not current_device():
            # currently only connect to Android as default
            # can apply auto detection in the future
            dev = connect_device("Android:///")

        super(UnityPoco, self).__init__(addr[1], dev, **options)
Ejemplo n.º 24
0
 def _get_touch_resolution(self):
     """
     get real time resolution on device if full screen
      or window size if running in window mode
     """
     return current_device().get_current_resolution()
Ejemplo n.º 25
0
 def setUp(self):
     if not current_device():
         connect_device('Android:///')
     apk_path = self.R('res/app/com.sogou.androidtool.apk')
     install_android_app(current_device().adb, apk_path)
Ejemplo n.º 26
0
 def getPortSize(self):
     disp = current_device().display_info
     if disp['orientation'] in (1, 3):
         return [disp['height'], disp['width']]
     else:
         return [disp['width'], disp['height']]
Ejemplo n.º 27
0
 def setUpClass(cls):
     super(CalculatorCase, cls).setUpClass()
     cls.package_name = 'com.google.android.calculator'
     apk_path = cls.R('res/app/com.google.android.calculator.apk')
     install_android_app(current_device().adb, apk_path)
     start_app(cls.package_name)
Ejemplo n.º 28
0
 def setUpClass(cls):
     super(Case, cls).setUpClass()
     if not current_device():
         connect_device('Android:///')
Ejemplo n.º 29
0
    def __init__(self, device=None, using_proxy=True, **options):
        if not device:
            try:
                # new version
                from airtest.core.api import connect_device, device as current_device
                if not current_device():
                    connect_device("Android:///")
            except ImportError:
                # old version
                from airtest.cli.runner import device as current_device
                from airtest.core.main import set_serialno
                if not current_device():
                    set_serialno()
            self.android = current_device()
        else:
            self.android = device
        self.adb_client = self.android.adb
        if using_proxy:
            self.device_ip = self.adb_client.host or "127.0.0.1"
        else:
            if new_airtest_api:
                self.device_ip = self.adb_client.get_ip_address()
            else:
                self.device_ip = get_ip_address(self.adb_client)

        # save current top activity (@nullable)
        current_top_activity_package = self.android.get_top_activity_name()
        if current_top_activity_package is not None:
            current_top_activity_package = current_top_activity_package.split(
                '/')[0]

        # install ime
        self.ime = YosemiteIme(self.adb_client)
        self.ime.start()

        # install
        self._instrument_proc = None
        self._install_service()

        # forward
        if using_proxy:
            p0, _ = self.adb_client.setup_forward("tcp:10080")
            p1, _ = self.adb_client.setup_forward("tcp:10081")
        else:
            p0 = 10080
            p1 = 10081

        # start
        if self._is_running('com.github.uiautomator'):
            warnings.warn(
                '{} should not run together with "uiautomator". "uiautomator" will be killed.'
                .format(self.__class__.__name__))
            self.adb_client.shell(
                ['am', 'force-stop', 'com.github.uiautomator'])

        ready = self._start_instrument(p0)
        if not ready:
            # 启动失败则需要卸载再重启,instrument的奇怪之处
            uninstall(self.adb_client, PocoServicePackage)
            self._install_service()
            ready = self._start_instrument(p0)

            if current_top_activity_package is not None:
                current_top_activity2 = self.android.get_top_activity_name()
                if current_top_activity2 is None or current_top_activity_package not in current_top_activity2:
                    self.android.start_app(current_top_activity_package,
                                           activity=True)

            if not ready:
                raise RuntimeError("unable to launch AndroidUiautomationPoco")

        endpoint = "http://{}:{}".format(self.device_ip, p1)
        agent = AndroidPocoAgent(endpoint, self.ime)
        super(AndroidUiautomationPoco, self).__init__(agent, **options)
Ejemplo n.º 30
0
    def __init__(self,
                 device=None,
                 using_proxy=True,
                 force_restart=False,
                 use_airtest_input=False,
                 **options):
        # 加这个参数为了不在最新的pocounit方案中每步都截图
        self.screenshot_each_action = True
        if options.get('screenshot_each_action') is False:
            self.screenshot_each_action = False

        self.device = device or current_device()
        if not self.device:
            self.device = connect_device("Android:///")

        self.adb_client = self.device.adb
        if using_proxy:
            self.device_ip = self.adb_client.host or "127.0.0.1"
        else:
            self.device_ip = self.device.get_ip_address()

        # save current top activity (@nullable)
        current_top_activity_package = self.device.get_top_activity_name()
        if current_top_activity_package is not None:
            current_top_activity_package = current_top_activity_package.split(
                '/')[0]

        # install ime
        self.ime = YosemiteIme(self.adb_client)
        self.ime.start()

        # install
        self._instrument_proc = None
        self._install_service()

        # forward
        if using_proxy:
            p0, _ = self.adb_client.setup_forward("tcp:10080")
            p1, _ = self.adb_client.setup_forward("tcp:10081")
        else:
            p0 = 10080
            p1 = 10081

        # start
        if self._is_running('com.github.uiautomator'):
            warnings.warn(
                '{} should not run together with "uiautomator". "uiautomator" will be killed.'
                .format(self.__class__.__name__))
            self.adb_client.shell(
                ['am', 'force-stop', 'com.github.uiautomator'])

        ready = self._start_instrument(p0, force_restart=force_restart)
        if not ready:
            # 启动失败则需要卸载再重启,instrument的奇怪之处
            uninstall(self.adb_client, PocoServicePackage)
            self._install_service()
            ready = self._start_instrument(p0)

            if current_top_activity_package is not None:
                current_top_activity2 = self.device.get_top_activity_name()
                if current_top_activity2 is None or current_top_activity_package not in current_top_activity2:
                    self.device.start_app(current_top_activity_package,
                                          activity=True)

            if not ready:
                raise RuntimeError("unable to launch AndroidUiautomationPoco")

        endpoint = "http://{}:{}".format(self.device_ip, p1)
        agent = AndroidPocoAgent(endpoint, self.ime, use_airtest_input)
        super(AndroidUiautomationPoco, self).__init__(agent, **options)