def __init__(self):
     self.log4py = LoggingController()
     self.clear = shutil
     self.report_path = FilePathUtil().get_report_path()
     self.script_log = FilePathUtil().get_scripts_log_path()
     self.logcat_path = FilePathUtil().get_logcat_path()
     self.crash_log_path = FilePathUtil().get_crash_log_path()
     self.screeshot_path = FilePathUtil().get_screenshot_path()
     self.anr_path = FilePathUtil().get_anr_path()
Esempio n. 2
0
 def __init__(self):
     self.system = platform.system()
     self.find_type = None
     if self.system is "Windows":
         self.find_type = "findstr"
     else:
         self.find_type = "grep"
     self.command = "adb"
     self.__serialno = ""
     self.crash_log_path = FilePathUtil().get_crash_log_path()
     self.screenshot_path = FilePathUtil().get_screenshot_path()
     self.dt = DateTimeManager().getCurrentDateTime()
     self.log4py = LoggingController()
     self.xml_path = FilePathUtil().get_xml_path()
     self.parm = ParamCheckUtil()
     self.yml_path = FilePathUtil().get_yml_path()
     self.anr_path = FilePathUtil().get_anr_path()
Esempio n. 3
0
class InitDriver(object):
    def __init__(self):
        self.log4py = LoggingController()
        self.run_config = InitConfiger()
        self.cmd = Cmd()
        self.service_path = FilePathUtil().get_service_path()
        self.config = ConfigController(self.service_path)

    def init_driver(self):

        desired_caps_dict = self.run_config.get_desired_caps_dict()
        sno_list = self.cmd.get_device_list()
        port = 4723
        print(sno_list)

        if not len(sno_list):
            return None
        for sno in sno_list:
            # self.cmd.set_serialno(sno)
            os.system('appium -p %d' % port)
            self.cmd.serialno = sno
            desired_caps = desired_caps_dict[sno]

            url = 'http://127.0.0.1:%d/wd/hub' % port

            num = 0
            while num <= 5:
                try:
                    driver = webdriver.Remote(url, desired_caps)
                except Exception as e:
                    self.log4py.error(
                        "连接appium服务,实例化driver时出错,尝试重连...({})".format(num))
                    num = num + 1
                    continue
                self.log4py.info("webdriver连接信息:{}:{}".format(
                    url, str(desired_caps)))

                while True:
                    if self.cmd.port_is_used(port):
                        port = port + 1
                    else:
                        break
                print(port)

                return driver
Esempio n. 4
0
 def __init__(self, env):
     self.log4py = LoggingController()
     self.poi_type = {
         '交通检查': '10002',
         '封路': '10003',
         '施工': '10006',
         '拥堵': '10007',
         '积水': '10008',
         '浓雾': '10010',
         '结冰': '10011',
         '交通事故': '10013',
         '实时路况': '10015'
     }
     self.__env = env
     self.path = None
     if self.__env == 'online':
         self.path = r'https://dzt.xxxxxxxxxx.com/deva/pc/pathAndPoi/no/addInfo'
     else:
         self.path = r'https://dzt-test.xxxxxxxxx.com/deva/pc/pathAndPoi/no/addInfo'
Esempio n. 5
0
class Cmd(object):
    def __init__(self):
        self.system = platform.system()
        self.find_type = None
        if self.system is "Windows":
            self.find_type = "findstr"
        else:
            self.find_type = "grep"
        self.command = "adb"
        self.__serialno = ""
        self.crash_log_path = FilePathUtil().get_crash_log_path()
        self.screenshot_path = FilePathUtil().get_screenshot_path()
        self.dt = DateTimeManager().getCurrentDateTime()
        self.log4py = LoggingController()
        self.xml_path = FilePathUtil().get_xml_path()
        self.parm = ParamCheckUtil()
        self.yml_path = FilePathUtil().get_yml_path()
        self.anr_path = FilePathUtil().get_anr_path()

    @property
    def serialno(self):
        return self.__serialno

    @serialno.setter
    def serialno(self, sno):
        self.__serialno = sno

    def adb(self, args):
        if self.__serialno == "" or self.__serialno is None:
            cmd = "%s %s" % (self.command, str(args))
        else:
            cmd = "%s -s %s %s" % (self.command, self.__serialno, str(args))
        return subprocess.Popen(cmd,
                                shell=True,
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)

    def shell(self, args):
        if self.__serialno == "" or self.__serialno is None:
            cmd = "%s shell %s" % (self.command, str(args))
        else:
            cmd = "%s -s %s shell %s" % (self.command, self.__serialno,
                                         str(args))
        return subprocess.Popen(cmd,
                                shell=True,
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)

    def get_device_state(self):
        """
        获取设备状态
        """
        return self.adb("get-state").stdout.read().decode('utf-8').strip()

    def get_device_sno(self):
        """
        获取设备id
        """
        return self.adb("get-serialno").stdout.read().decode('utf-8').strip()

    def get_device_list(self):
        """
        获取设备列表
        """
        devices = []
        result = subprocess.Popen("adb devices",
                                  shell=True,
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.PIPE).stdout.readlines()
        result.reverse()
        for line in result[1:]:
            if "attached" not in line.decode('utf-8').strip(
            ) and "daemon" not in line.decode('utf-8').strip():
                devices.append(line.decode('utf-8').split()[0])
            else:
                break
        # print(devices)
        return devices

    def get_device_num(self):
        return len(self.get_device_list())

    def get_android_os_version(self):
        """
        获取设备中的Android版本号
        """
        return self.shell("getprop ro.build.version.release").stdout.read(
        ).decode('utf-8').strip()

    def get_sdk_version(self):
        """
        获取设备SDK版本号
        """
        return self.shell("getprop ro.build.version.sdk").stdout.read().decode(
            'utf-8').strip()

    def get_device_model(self):
        """
        获取设备型号
        """
        return self.shell("getprop ro.product.model").stdout.read().decode(
            'utf-8').strip()

    def get_device_brand(self):
        """
        获取设备品牌
        """
        return self.shell("getprop ro.product.brand").stdout.read().decode(
            'utf-8').strip()

    def get_device_name(self):
        """
        获取设备名称
        """
        return self.shell("getprop ro.product.name").stdout.read().decode(
            'utf-8').strip()

    def get_device_board(self):
        """
        获取设备处理器型号
        """
        return self.shell("getprop ro.product.board").stdout.read().decode(
            'utf-8').strip()

    def get_screen_size(self):
        """
        获取屏幕分辨率
        """
        return self.shell("wm size").stdout.read().decode('utf-8').split(
            ": ")[1].strip()

    def get_device_dpi(self):
        """
        获取屏幕dpi
        """
        return self.shell("wm density").stdout.read().decode('utf-8').split(
            ": ")[1].strip()

    def get_device_ip(self):
        """
        获取ip
        """
        ip = self.shell("ifconfig wlan0").stdout.readlines()[1].decode(
            'utf-8').split()[1].split(":")[1]
        return ip

    def get_device_mac(self):
        """
        获取MAC地址
        """
        return self.shell("cat /sys/class/net/wlan0/address").stdout.read(
        ).decode('utf-8').strip()

    def get_device_cpu(self):
        """
        获取CPU信息
        """
        return self.shell("cat /proc/cpuinfo").stdout.read().decode(
            'utf-8').strip()

    def get_device_memory(self):
        """
        获取系统内存信息
        """
        return self.shell("cat /proc/meminfo").stdout.read().decode(
            'utf-8').strip()

    def get_device_ram(self):
        """
        获取ram信息
        """
        ram_k = int(self.shell("cat /proc/meminfo").stdout.readlines()[0].decode('utf-8').\
            split()[1])
        ram_g = ram_k // 1000000
        if ram_k % 10000000 >= 500000:
            ram_g += 1
        return ram_g

    def get_app_memory(self, packageName):
        """
        获取应用内存信息
        """
        return self.shell("cat dumpsys meminfo %s | %s TOTAL" % (packageName, self.find_type))\
            .stdout.read().decode('utf-8').strip()

    def get_cpu_time(self):
        """
        获取总的cpu使用时间
        """
        return self.shell("cat /proc/stat").stdout.read().decode(
            'utf-8').strip()

    def get_pid_cpu_jiff(self, pid):
        """
        获取进程cpu时间片
        """
        return self.shell("cat /proc/%s/stat" %
                          pid).stdout.read().decode('utf-8').strip()

    def get_pid_fps(self, packageName):
        """
        获取进程fps
        """
        return self.shell("dumpsys gfxinfo %s" %
                          packageName).stdout.read().decode('utf-8').strip()

    def get_pid_flow(self):
        pass

    def get_uid(self):
        pass

    def get_app_version(self, packageName):

        return self.shell(
            "dumpsys package %s | %s versionName" %
            (packageName,
             self.find_type)).stdout.read().decode('utf-8').split('=')[1]

    def get_app_pid(self, packageName):
        """
        获取进程pid
        """
        if self.system is "Windows":
            pidinfo = self.shell("ps | findstr %s$" %
                                 packageName).stdout.read()
        else:
            pidinfo = self.shell("ps | grep -w %s" % packageName).stdout.read()

        if pidinfo == '':
            return "the process doesn't exist."

        pattern = re.compile(r"\d+")
        result = pidinfo.decode('utf-8').split(" ")
        result.remove(result[0])

        return pattern.findall(" ".join(result))[0]

    # def is_app_running(self, packageName):
    #     if self

    def get_focused_package_and_activity(self):
        """
        获取当前应用包名和Activity
        :return:
        """
        return self.shell("dumpsys window | %s mCurrentFocus" % self.find_type).stdout.\
                   read().decode('utf-8').split()[-1][:-1]

    def get_current_package_name(self):
        """
        获取当前应用包名
        """
        return self.get_focused_package_and_activity().split('/')[0]

    def get_current_activity(self):
        """
        获取当前应用Activity
        """
        return self.get_focused_package_and_activity().split('/')[1]

    def get_system_app_list(self):
        """
        获取设备中安装的系统应用包名列表
        """
        sysApp = []
        for packages in self.shell("pm list packages -s").stdout.readlines():
            sysApp.append(
                packages.split(
                    str.encode(":"))[-1].decode('utf-8').splitlines()[0])

        return sysApp

    def get_all_app_list(self):
        """
        获取设备中安装的所有应用列表
        """
        allApp = []
        for packages in self.shell("pm list packages").stdout.readlines():
            allApp.append(
                packages.split(
                    str.encode(":"))[-1].decode('utf-8').splitlines()[0])

        return allApp

    def get_third_app_list(self):
        """
        获取设备中安装的第三方应用包名列表
        """
        thirdApp = []
        for packages in self.shell("pm list packages -3").stdout.readlines():
            thirdApp.append(
                packages.split(
                    str.encode(":"))[-1].decode('utf-8').splitlines()[0])
        return thirdApp

    def get_matching_app_list(self, keyword):
        """
        模糊查询与keyword匹配的应用包名列表
        """
        matApp = []
        for packages in self.shell("pm list packages %s" %
                                   keyword).stdout.readlines():
            matApp.append(
                packages.split(
                    str.encode(":"))[-1].decode('utf-8').splitlines()[0])
        return matApp

    def get_app_start_total_time(self, component):
        """
        获取启动应用所花时间
        """

        time = self.shell("am start -W %s | %s TotalTime" % (component, self.find_type)) \
            .stdout.read().split(str.encode(": "))[-1]

        return int(time)

    def do_install_app(self, appFile, packageName):
        """
        安装app,app名字不能含中文字符
        args:- appFile -: app路径
        usage: install("d:\\apps\\Weico.apk")
        """
        self.adb("install %s" % appFile)
        if not self.is_install_app(packageName):
            return True
        else:
            return False

    def do_uninstall_app(self, packageName):
        """
        卸载应用
        """
        self.adb(" uninstall %s" % packageName)
        if not self.is_install_app(packageName):
            return True
        else:
            return False

    def is_install_app(self, packageName):
        """
        判断应用是否安装,已安装返回True,否则返回False
        """
        flag = False
        result = self.get_third_app_list()
        if result is None or len(result) < 0:
            return None
        for i in result:
            if re.search(packageName, i.strip()):
                flag = True
        return flag

    def do_pull_file(self, remote, local):
        """
        pull文件
        """
        self.adb(" pull %s %s" % (remote, local))

    def do_push_file(self, local, remote):
        """
        push文件
        """
        self.adb(" push %s %s" % (local, remote))

    def do_clear_app_data(self, packageName):
        """
        清除应用用户数据
        """
        if "Success" in self.shell(
                "pm clear %s" %
                packageName).stdout.read().decode('utf-8').splitlines():
            return "clear user data success "
        else:
            return "make sure package exist"

    def do_start_activity(self, component):
        """
        启动一个Activity
        """
        self.shell("am start -n %s" % component)

    def do_reset_current_app(self):
        """
        重置当前应用
        """
        packageName = self.get_current_package_name()
        component = self.get_focused_package_and_activity()
        self.do_clear_app_data(packageName)
        self.do_start_activity(component)

    def do_reboot(self):
        """
        重启设备
        """
        self.adb("reboot")

    def do_kill_process(self, pid):
        """
        杀死应用进程
        """
        if self.shell("kill %s" %
                      str(pid)).stdout.read().decode().split(": ")[-1] == "":
            return "kill success"

        else:
            return self.shell("kill %s" %
                              str(pid)).stdout.read().decode().split(": ")[-1]

    def do_quit_app(self, packageName):
        """
        退出app,类似于kill掉进程
        """
        self.shell("am force-stop %s" % packageName)

    def get_adb_process_pid(self):
        """
        获取adb进程pid
        """
        pid = os.popen("lsof -i tcp:5037").readlines()[1].split()[1]
        return pid

    def port_is_used(self, port):
        flag = False
        port_res = subprocess.Popen('lsof -i tcp:%s' % port,
                                    shell=True,
                                    stdout=subprocess.PIPE,
                                    stderr=subprocess.PIPE).stdout.readlines()
        print(port_res)
        if len(port_res):
            return True

        return flag

    def do_stop_and_restart_5037(self):
        """
        杀掉并重启adb进程,目前只适配了mac
        """
        pid = os.popen("lsof -i tcp:5037").readlines()[1].split()[1]
        os.system("kill 9 %s" % pid)
        os.system("adb start-server")

    def get_crash_log(self):

        self.adb(r" pull /sdcard/crash/ %s" % self.crash_log_path)
        self.log4py.debug("pull crash to result/logs/crash")

    def clear_crash_log(self):
        self.shell(r" rm -rf sdcard/crash/")
        self.log4py.debug("clear device crash")

    def get_anr(self):
        self.adb(r" pull /data/anr/ %s" % self.anr_path)
        self.log4py.debug("pull anr to result/logs/anr")

    def clear_anr(self):
        self.shell(r" rm -rf /data/anr/")
        self.log4py.debug("clear device anr")

    def close_logcat(self):
        self.shell("killall -2 logcat")
        # os.system("adb shell killall -2 logcat")

    def clear_logcat(self):
        os.popen('adb logcat -b all -c')

    # 封装截图方法
    def get_screenshot(self):
        path = self.screenshot_path + self.dt + r".png"
        self.adb("exec-out screencap -p > %s" % path)
        return path

    def get_uidump_xml(self, yml_name):

        if float(self.get_sdk_version()) >= 19:
            self.shell(
                "uiautomator dump --compressed /data/local/tmp/uidump.xml"
            ).wait()
        else:
            self.shell("uiautomator dump /data/local/tmp/uidump.xml").wait()

        self.adb("pull /data/local/tmp/uidump.xml %s" %
                 (self.xml_path + str(self.get_current_package_name()) +
                  ".xml")).wait()
        self.shell("rm /data/local/tmp/uidump.xml").wait()

        xml_file_name = str(self.get_current_package_name()) + ".xml"
        print(xml_file_name)

        dict = {}

        dict1 = self.parm.load_xml_data(xml_file_name)

        dict[self.get_current_package_name()] = dict1

        self.parm.write_yaml_data(yml_name, dict)
Esempio n. 6
0
 def __init__(self):
     self.log4py = LoggingController()
     self.run_config = InitConfiger()
     self.cmd = Cmd()
     self.service_path = FilePathUtil().get_service_path()
     self.config = ConfigController(self.service_path)
Esempio n. 7
0
 def __init__(self):
     self.cmd = Cmd()
     self.path = FilePathUtil().get_config_run_path()
     self.config = ConfigController(self.path)
     self.log4py = LoggingController()
     self.dev_info = DeviceInfo().get_infos_as_dict()
Esempio n. 8
0
from page_ddox.set_ll_obj import set_ll_page_obj
from common.utils.LoggingUtil import LoggingController
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
from common.utils.DateTimeUtil import DateTimeManager
from common.baseapi.BaseAppiumApi import BaseAppiumApi
from common.base.BroadcastCommand import BroadcastCommand

DATE_FORMAT = '%Y-%m-%d %H:%M:%S'
driver = None

cmd = Cmd()
bccmd = BroadcastCommand()
fc = FileClearUtil()
fp = FilePathUtil()
dt = DateTimeManager()
log = LoggingController()


def pytest_addoption(parser):
    parser.addoption("--cmdopt",
                     action="store",
                     default="device_info",
                     help=None)


@pytest.fixture
def cmdopt(pytestconfig):
    #两种写法
    return pytestconfig.getoption("--cmdopt")
    #return pytestconfig.option.cmdopt
class BaseAppiumApi():
    def __init__(self, driver):
        self.adb = Cmd()
        self.driver = driver
        self.log4py = LoggingController()
        self.ta = TouchAction()
        self.pauseTime = 5

    # find_element_by_name 1.5以上的版本已弃用
    # 替代方法 BY.XPATH  "//*[contains(@text, '开启')]"
    def find_element_I(self,loc,timeout=10,poll=0.5):
        try:
            self.log4py.debug("【定位元素】元素:%s" % str(loc))
            return WebDriverWait(self.driver,timeout,poll).until(lambda x:x.find_element(*loc))
        except Exception as e:
            print(e)
            self.log4py.error("【定位元素失败】元素:%s 超时时间:%ds" % (str(loc), timeout))
            return None

    def find_elements_I(self,loc,timeout=10,poll=0.5):
        try:
            self.log4py.debug("【定位元素】元素:%s" % str(loc))
            return WebDriverWait(self.driver,timeout,poll).until(lambda x:x.find_elements(*loc))
        except Exception as e:
            print(e)
            self.log4py.error("【定位元素失败】元素:%s 超时时间:%ds" % (str(loc), timeout))
            return None

    def click_element(self,loc):
        self.find_element_I(loc).click()
        self.log4py.info("【点击】元素:%s" % str(loc))

    def click_elements(self,loc,num):
        self.find_elements_I(loc)[num].click()
        self.log4py.info("【点击】元素:%s 索引:%d" % (str(loc), num))

    def input_text(self,loc,text):
        """
        在元素中模拟输入(开启appium自带的输入法并配置了appium输入法后,可以输入中英文)
        """
        input = self.find_element_I(loc)
        # self.do_clear(input)
        input.send_keys(text)
        self.log4py.info("【输入】元素:%s 文本:%s" % (str(loc), str(text)))

    def get_toast(self, loc, timeout=30, poll=0.5):
        """
        获取toast
        """
        if self.find_element_I(loc, timeout, poll) is None:
            self.log4py.error("Toast get fail")
            return False
        else:
            self.log4py.info("Toast get success")
            return True

    def swipe(self,start_x, start_y, end_x, end_y, duration):
        """
        滑动屏幕
        """
        self.log4py.info("【滑动】起:x-%s y-%s 止:x-%s y-%s" % (start_x, start_y, end_x, end_y))
        self.driver.swipe(start_x, start_y, end_x, end_y, duration)

    def is_enabled(self, loc):
        """
        返回元素是否可用
        """
        element = self.find_element_I(loc)
        isEnabled = element.is_enabled()
        self.log4py.info("%s 是否可用: %s" % (loc, isEnabled))
        return isEnabled

    def is_selected(self, loc):
        """
        返回元素是否选择。
        可以用来检查一个复选框或单选按钮被选中。
        """
        is_selected = self.find_element_I(loc).is_selected()
        self.log4py.debug("%s 是否被选中: %s" % (loc, is_selected))
        return is_selected

    def is_element_exist(self, el):
        """
        判断元素是否存在
        """
        # element = self.find_element_I(loc)
        source = self.get_page_source()
        if el in source:
            self.log4py.debug("元素%s 存在" % el)
            return True
        else:
            self.log4py.error("元素%s 不存在" % el)
            return False

    def do_sleep(self, millisecond=3):
        """
        time.sleep
        """
        try:
            self.log4py.info("【sleep】%ss" % millisecond)
            time.sleep(millisecond)
        except Exception as e:
            self.log4py.error("sleep error:" + str(e))

    def do_navigate_back(self):
        """
        返回
        """
        self.driver.back()
        self.log4py.info("【返回】")

    def get_current_activity(self):
        """
        获取Activity,调用时不需要括号
        """
        activity = self.driver.current_activity
        self.log4py.debug("【当前Activity】%s" % activity)
        return activity

    def get_current_url(self):
        """
        获取当前页面的网址
        """
        url = self.driver.current_url()
        self.log4py.debug("【当前页面网址】%s" % url)
        return url

    def get_page_source(self):
        """
        获取当前页面的源
        """
        # source = self.driver.page_source()
        source = self.driver.page_source
        self.log4py.debug("【当前页面的源】%s" % source)
        return source

    def get_tag_name(self, loc):
        """
        经实践返回的是class name
        """
        tag_name = self.driver.find_element_I(loc).tag_name
        self.log4py.debug("%s TagName: %s" % (loc, tag_name))
        return tag_name

    def get_text(self, loc):
        """
        返回元素的文本值
        """
        text = self.driver.find_element_I(loc).text
        self.log4py.debug("%s text: %s" % (loc, str(text)))
        return text

    def get_screen_size(self):
        """
        返回屏幕分辨率(长和宽)
        """
        x = self.driver.get_window_size()['width']
        y = self.driver.get_window_size()['height']
        self.log4py.debug("屏幕分辨率:x-%s y-%s" % (x, y))
        return (x, y)

    def do_clear(self, loc):
        """
        清除输入的内容
        """
        element = self.find_element_I(loc)
        element.clear()
        self.log4py.info("【清空输入】%s" % str(loc))

    def do_swipe_up(self, duration_time):
        """
        向上滑动
        """
        size_screen = self.driver.get_screen_size()
        x_start = int(size_screen[0] * 0.5)
        x_end = x_start
        y_start = int(size_screen[1] * 0.75)
        y_end = int(size_screen[1] * 0.25)
        self.driver.swipe(x_start, y_start, x_end, y_end, duration_time)
        self.log4py.debug("【向上滑动屏幕】")

    def do_swipe_down(self, duration_time):
        """
        向下滑动
        """
        size_screen = self.driver.get_screen_size()
        x_start = int(size_screen[0] * 0.5)
        x_end = x_start
        y_start = int(size_screen[1] * 0.25)
        y_end = int(size_screen[1] * 0.75)
        self.driver.swipe(x_start, y_start, x_end, y_end, duration_time)
        self.log4py.debug("【向下滑动屏幕】")

    def do_swipe_left(self, duration_time):
        """
        向左滑动
        """
        size_screen = self.driver.get_screen_size()
        y_start = int(size_screen[1] * 0.5)
        y_end = y_start
        x_start = int(size_screen[0] * 0.75)
        x_end = int(size_screen[0] * 0.25)
        self.driver.swipe(x_start, y_start, x_end, y_end, duration_time)
        self.log4py.debug("【向左滑动屏幕】")

    def do_swipe_right(self, driver, duration_time):
        """
        向右滑动屏幕
        """
        size_screen = self.driver.get_screen_size()
        y_start = int(size_screen[0] * 0.5)
        y_end = y_start
        x_start = int(size_screen[0] * 0.25)
        x_end = int(size_screen[0] * 0.75)
        self.driver.swipe(x_start, y_start, x_end, y_end, duration_time)
        self.log4py.debug("【向右滑动屏幕】")

    def do_tap(self, x, y, count = 500) :
        """
        点击坐标位置
        """
        self.ta.tap(x, y, count)
        self.log4py.info("【点击】坐标:x-%s y-%s" % (x, y))

    def do_pinch(self,element):
        '''
        双指缩放屏幕
        '''
        self.driver.pinch(element=element)
        self.log4py.debug("【双指缩放屏幕】")

    def do_zoom(self, element):
        '''
        放大操作
        '''
        self.driver.zoom(element=element)
        self.log4py.debug("【放大操作】")

    def do_shake(self):
        """
        摇一摇设备
        """
        self.log4py.debug("【摇一摇设备】")
        self.driver.shake()

    def do_flick(self, start_x, start_y, end_x, end_y):
        """
        快速滑动
        """
        self.log4py.debug("x:%s  y:%s 快速滑动至 x:%s  y:%s" % (start_x, start_y, end_x, end_y))
        return self.driver.flick(start_x, start_y, end_x, end_y)

    def get_screenshot(self, filepath):
        """
        截取当前窗口的截图,如果有写入错误会返回False,其它返回True
        """
        try:
            self.driver.get_screenshot_as_file(filepath)
            self.log4py.debug("保存屏幕截图成功,地址:%s" % filepath)
        except Exception as e:
            self.log4py.error("保存屏幕截图失败,失败信息:%s " % str(e))

    def get_contexts(self):
        """
        返回当前会话的当前上下文
        """
        return self.driver.contexts

    def get_current_context(self):
        """
        返回当前会话的当前上下文
        """
        return self.driver.current_context

    def get_context(self):
        """
        返回当前会话中的上下文,使用后可以识别H5页面的控件
        """
        return self.driver.contexts

    def do_reset(self):
        """
        删除应用数据
        """
        self.driver.reset()

    def do_hide_keyboard(self, key_name=None, key=None, strategy=None):
        """
        隐藏键盘,安卓不需要参数。ios使用key_name隐藏
        """
        self.driver.hide_keyboard()

    def do_keyevent(self, keycode, metastate=None):
        """
        发送按键码,Android特有
        按键码可参考:http://developer.android.com/reference/android/view/KeyEvent.html
        """
        self.driver.keyevent(keycode)
        # self.log4py.info("【发送按键码】keycode:%s" % keycode)

    def do_press_keycode(self, keycode, metastate=None):
        """
        发送按钮码,Android独有
        参考:http://developer.android.com/reference/android/view/KeyEvent.html
        """
        self.driver.press_keycode(keycode)

    def do_long_press_keycode(self, keycode, metastate=None):
        """
        发送一个长按的按键码
        """
        self.driver.long_press_keycode(keycode)

    def do_background_app(self, seconds):
        """
        后台运行app多少秒
        """
        self.log4py.info("将app放置后台%s秒" % str(seconds))
        self.driver.background_app(seconds)

    def is_app_installed(self, bundle_id):
        """
        检查app是否安装
        """
        is_installed = self.driver.is_app_installed(bundle_id)
        self.log4py.debug("%s 是否安装: %s" % (bundle_id, is_installed))
        return is_installed

    def do_install_app(self, app_path):
        """
        安装app
        """
        self.driver.install_app(app_path)
        self.log4py.debug("已安装应用: %s" % app_path)

    def do_remove_app(self, app_id):
        """
        删除app
        """
        self.log4py.debug("删除app:%s" % app_id)
        self.driver.remove_app(app_id)

    def do_launch_app(self):
        """
        启动app
        """
        self.log4py.debug("启动app")
        self.driver.launch_app()

    def do_close_app(self):
        """
        关闭app
        """
        self.log4py.debug("关闭app")
        self.driver.close_app()

    def do_start_activity(self, app_package, app_activity, **opts):
        """
        在测试过程中打开任意活动。如果活动属于另一个应用程序,该应用程序的启动和活动被打开。安卓独有
        """
        # self.log4py.info("【启动应用】package:%s activity:%s" % (app_package, app_activity))
        self.driver.start_activity(app_package, app_activity)

    def do_lock(self, seconds):
        """
        锁屏一段时间,ios独有
        """
        self.log4py.debug("锁屏%s秒" % seconds)
        self.driver.lock(seconds)

    def do_open_notifications(self):
        """
        打系统通知栏(仅支持API 18 以上的安卓系统)
        """
        self.log4py.debug("打开系统通知栏")
        self.driver.open_notifications()

    def get_network_connection(self):
        """
        返回网络类型 数值
        """
        network_connection = self.driver.network_connection
        self.log4py.debug("网络类型: %s" % network_connection)
        return network_connection

    def set_network_connection(self, connectionType):
        """
        设置网络类型,安卓独有
        Possible values:
            Value (Alias)      | Data | Wifi | Airplane Mode
            -------------------------------------------------
            0 (None)           | 0    | 0    | 0
            1 (Airplane Mode)  | 0    | 0    | 1
            2 (Wifi only)      | 0    | 1    | 0
            4 (Data only)      | 1    | 0    | 0
            6 (All network on) | 1    | 1    | 0
        用法:
        先加载from appium.webdriver.connectiontype import ConnectionType
        dr.set_network_connection(ConnectionType.WIFI_ONLY)
        """
        self.log4py.debug("网络切换为: %s" % connectionType)
        self.driver.set_network_connection(connectionType)

    def get_available_ime_engines(self):
        """
        返回安卓设备可用的输入法,安卓独有
        """
        available_ime = self.driver.available_ime_engines
        self.log4py.info("可见的输入法:%s" % available_ime)
        return available_ime

    def is_ime_active(self):
        """
        检查设备是否有输入法服务活动,安卓独有
        """
        is_active = self.driver.is_ime_active()
        self.log4py.debug("是否有输入法服务: %s" % is_active)
        return is_active

    def do_activate_ime_engine(self, engine):
        """
        激活安卓设备中的指定输入法,设备可用输入法可以从“available_ime_engines”获取
        """
        self.log4py.info("激活输入法: %s" % engine)
        self.driver.activate_ime_engine(engine)

    def deactivate_ime_engine(self):
        """
        关闭安卓设备当前的输入法,安卓独有
        """
        self.log4py.info("关闭当前输入法")
        self.driver.deactivate_ime_engine()

    def get_active_ime_engine(self):
        """
        返回当前输入法的包名
        """
        current_ime = self.driver.active_ime_engine
        self.log4py.info("获取到当前的输入法: %s" % current_ime)
        return current_ime

    def device_time(self):

        return self.driver.device_time()

    def toggle_location_services(self):
        """
        打开安卓设备上的位置定位设置,安卓独有
        """
        self.log4py.debug("打开位置定位设置")
        self.driver.toggle_location_services()

    def set_location(self, latitude, longitude, altitude):
        """
        设置经纬度
        """
        self.log4py.debug("设置纬度:%s 经度:%s  高度:%s" % (latitude, longitude, altitude))
        self.driver.set_location(latitude, longitude, altitude)
Esempio n. 10
0
 def __init__(self, driver):
     self.adb = Cmd()
     self.driver = driver
     self.log4py = LoggingController()
     self.ta = TouchAction()
     self.pauseTime = 5
Esempio n. 11
0
 def __init__(self, path):
     self.path = path
     self.config = configparser.ConfigParser()
     self.config.read(self.path, encoding="utf-8")
     self.log4py = LoggingController()
Esempio n. 12
0
 def __init__(self):
     self.cmd = Cmd()
     self.log4py = LoggingController()
Esempio n. 13
0
class DeviceInfo(object):
    def __init__(self):
        self.cmd = Cmd()
        self.log4py = LoggingController()

    def get_infos_as_dict(self):

        try:
            info = {}
            lists = self.cmd.get_device_list()
            if not len(lists):
                self.log4py.info("无任何设备处于连接状态")
                return None
            self.log4py.info("开始获取设备信息.....")
            i = 1
            for sno in lists:
                # self.cmd.set_serialno(sno)
                self.cmd.serialno = sno
                brand, model, os_version, dpi, screen_size, name = \
                    self.get_device_info()
                info[sno] = {
                    "brand": brand,
                    "model": model,
                    "os_version": os_version,
                    "dpi": dpi,
                    "screen_size": screen_size,
                    "name": name
                }

                self.log4py.info("%d.设备连接信息:%s-%s" % (i, sno, info[sno]))
                # print(info[sno])
                i += 1
            self.log4py.info("设备信息获取完毕,设备总数量:%s" % len(lists))
            # print(info)
            # print(len(lists))

            return info
        except Exception as e:
            print(e)
            self.log4py.error("获取设备信息时发生错误")
            return None

    def get_device_info(self):
        """
        获取设备信息
        """
        try:
            name = self.cmd.get_device_sno()
            brand = self.cmd.get_device_brand()
            model = self.cmd.get_device_model()
            os_version = self.cmd.get_android_os_version()
            ram = self.cmd.get_device_ram()
            dpi = self.cmd.get_device_dpi()
            # ip = self.cmd.get_device_ip()
            screen_size = self.cmd.get_screen_size()

            return brand, model, os_version, dpi, screen_size, name

        except Exception as e:
            self.log4py.error("Get device info happen ERROR :" + str(e))
            return None
Esempio n. 14
0
class FileClearUtil():
    def __init__(self):
        self.log4py = LoggingController()
        self.clear = shutil
        self.report_path = FilePathUtil().get_report_path()
        self.script_log = FilePathUtil().get_scripts_log_path()
        self.logcat_path = FilePathUtil().get_logcat_path()
        self.crash_log_path = FilePathUtil().get_crash_log_path()
        self.screeshot_path = FilePathUtil().get_screenshot_path()
        self.anr_path = FilePathUtil().get_anr_path()

    def do_clear_screenshot(self):
        shutil.rmtree(self.screeshot_path)
        self.log4py.debug("clear history screenshot")
        os.mkdir(self.screeshot_path)

    def do_clear_logcat(self):
        shutil.rmtree(self.logcat_path)
        self.log4py.debug("clear history logcat")
        os.mkdir(self.logcat_path)

    def do_clear_crash_log(self):
        shutil.rmtree(self.crash_log_path)
        self.log4py.debug("clear history crash")
        os.mkdir(self.crash_log_path)

    def do_clear_report(self):
        if self.is_file_by_suffix_json(self.report_path):
            shutil.rmtree(self.report_path)
            self.log4py.debug("clear history report")
            os.mkdir(self.report_path)
        else:
            self.log4py.debug("history report not exist")

    def do_clear_script_log(self):

        self.clear_file_input(self.script_log)
        self.log4py.debug("clear script.log")

    def is_file_by_suffix_json(self, path):
        Files = os.listdir(path)
        if Files != []:
            for k in range(len(Files)):
                # 提取文件夹内所有文件的后缀
                Files[k] = os.path.splitext(Files[k])[1]

        Str = '.json'
        if Str in Files:
            return True
        else:
            return False

    def is_file_by_suffix_log(cls, path):
        Files = os.listdir(path)
        if Files != []:
            for k in range(len(Files)):
                # 提取文件夹内所有文件的后缀
                Files[k] = os.path.splitext(Files[k])[1]

        Str = '.log'
        if Str in Files:
            return True
        else:
            return False

    def clear_file_input(self, path):
        with open(path, "r+") as f:
            f.seek(0)
            f.truncate()

    def do_clear_anr(self):
        shutil.rmtree(self.anr_path)
        self.log4py.debug("clear history anr")
        os.mkdir(self.anr_path)
Esempio n. 15
0
class FilePathUtil():
    def __init__(self):
        self.log4py = LoggingController()

    def get_project_path(self):
        abspath = os.getcwd()
        project_path = abspath.split("common")[0]
        return project_path

    def get_broadcast_path(self):
        # broadcast_path = self.get_project_path() + os.sep + "testdata" + os.sep + "yaml" + os.sep + "broadcast.yml"
        broadcast_path = self.get_project_path(
        ) + "testdata" + os.sep + "yaml" + os.sep + "broadcast.yml"
        return broadcast_path

    def get_config_run_path(self):
        config_run_path = self.get_project_path(
        ) + os.sep + "config" + os.sep + "run.ini"
        return config_run_path

    def get_scripts_log_path(self):
        scripts_log_path = self.get_project_path(
        ) + os.sep + "result" + os.sep + "logs" + os.sep + "logs4script" + os.sep + "script.log"
        self.log4py.info(scripts_log_path)
        return scripts_log_path

    def get_report_path(self):
        report_path = self.get_project_path(
        ) + os.sep + "result" + os.sep + "reports"
        return report_path

    def get_yaml_path(self):
        yaml_path = self.get_project_path(
        ) + os.sep + "testdata" + os.sep + "yaml" + os.sep
        return yaml_path

    def get_service_path(self):
        service_path = self.get_project_path(
        ) + os.sep + "config" + os.sep + "Service.ini"
        return service_path

    def get_logcat_path(self):
        logcat_path = self.get_project_path(
        ) + os.sep + "result" + os.sep + "logs" + os.sep + "logcat" + os.sep
        return logcat_path

    def get_crash_log_path(self):
        crash_log_path = self.get_project_path(
        ) + os.sep + "result" + os.sep + "logs" + os.sep + "crashlog"
        return crash_log_path

    def get_screenshot_path(self):
        screenshot_path = self.get_project_path(
        ) + os.sep + "result" + os.sep + "screenshot" + os.sep
        return screenshot_path

    def get_xml_path(self):
        xml_path = self.get_project_path(
        ) + "analysis_UIdump" + os.sep + "xml_file" + os.sep
        return xml_path

    def get_yml_path(self):
        yaml_path = self.get_project_path(
        ) + "analysis_UIdump" + os.sep + "yml_file" + os.sep
        return yaml_path

    def get_anr_path(self):
        anr_path = self.get_project_path(
        ) + os.sep + "result" + os.sep + "logs" + os.sep + "anr" + os.sep
        return anr_path