def app_start_adb(self, package_name, allow_failure=False): """ Args: package_name (str): allow_failure (bool): Returns: bool: If success to start """ result = self.adb_shell([ 'monkey', '-p', package_name, '-c', 'android.intent.category.LAUNCHER', '1' ]) if 'No activities found' in result: # ** No activities found to run, monkey aborted. if allow_failure: return False else: logger.error(result) possible_reasons( f'"{package_name}" not found, please check setting Emulator.PackageName' ) raise RequestHumanTakeover else: # Events injected: 1 # ## Network stats: elapsed time=4ms (0ms mobile, 0ms wifi, 4ms not connected) return True
def adb_connect(self, serial): """ Connect to a serial, try 3 times at max. If there's an old ADB server running while Alas is using a newer one, which happens on Chinese emulators, the first connection is used to kill the other one, and the second is the real connect. Args: serial (str): Returns: bool: If success """ if 'emulator' in serial: return True else: for _ in range(3): msg = self.adb_client.connect(serial) logger.info(msg) if 'connected' in msg: # Connected to 127.0.0.1:59865 # Already connected to 127.0.0.1:59865 return True elif 'bad port' in msg: # bad port number '598265' in '127.0.0.1:598265' logger.error(msg) possible_reasons('Serial incorrect, might be a typo') raise RequestHumanTakeover logger.warning(f'Failed to connect {serial} after 3 trial, assume connected') return False
def app_start_wsa(self, package_name, display, allow_failure=False): """ Args: package_name (str): display (int): allow_failure (bool): Returns: bool: If success to start """ self.adb_shell(['svc', 'power', 'stayon', 'true']) activity_name = self.get_main_activity_name(package_name=package_name) result = self.adb_shell([ 'am', 'start', '--display', display, package_name + '/' + activity_name ]) if 'No activities found' in result: # ** No activities found to run, monkey aborted. if allow_failure: return False else: logger.error(result) possible_reasons( f'"{package_name}" not found, please check setting Emulator.PackageName' ) raise RequestHumanTakeover else: # Events injected: 1 # ## Network stats: elapsed time=4ms (0ms mobile, 0ms wifi, 4ms not connected) return True
def app_start_uiautomator2(self, package_name): try: self.u2.app_start(package_name) except u2.exceptions.BaseError as e: # BaseError: package "com.bilibili.azurlane" not found logger.error(e) possible_reasons(f'"{package_name}" not found, please check setting Emulator.PackageName') raise RequestHumanTakeover
def retry_wrapper(self, *args, **kwargs): """ Args: self (Uiautomator2): """ init = None sleep = True for _ in range(RETRY_TRIES): try: if callable(init): if sleep: self.sleep(RETRY_DELAY) sleep = True init() return func(self, *args, **kwargs) # Can't handle except RequestHumanTakeover: break # When adb server was killed except ConnectionResetError as e: logger.error(e) def init(): self.adb_disconnect(self.serial) self.adb_connect(self.serial) # In `device.set_new_command_timeout(604800)` # json.decoder.JSONDecodeError: Expecting value: line 1 column 2 (char 1) except JSONDecodeError as e: logger.error(e) sleep = False def init(): self.install_uiautomator2() # AdbError except AdbError as e: if handle_adb_error(e): def init(): self.adb_disconnect(self.serial) self.adb_connect(self.serial) else: break # RuntimeError: USB device 127.0.0.1:5555 is offline except RuntimeError as e: if handle_adb_error(e): def init(): self.adb_disconnect(self.serial) self.adb_connect(self.serial) else: break # In `assert c.read string(4) == _OKAY` # ADB on emulator not enabled except AssertionError as e: logger.exception(e) possible_reasons( 'If you are using BlueStacks or LD player, ' 'please enable ADB in the settings of your emulator') break # Unknown, probably a trucked image except Exception as e: logger.exception(e) def init(): pass logger.critical(f'Retry {func.__name__}() failed') raise RequestHumanTakeover