Exemple #1
0
 def open_notification(self, ):
     """
     打开菜单栏
     :return:
     """
     logger.warning('此函数只支持安卓系统!')
     self.dri.open_notifications()
Exemple #2
0
 def ios_predicate(self, locate, el=None):
     """
      更具表达式 查询页面元素
     此方法 只能 iso 可用
     :param locate:  expression 表达式 如 :new UiSelector().text("显示")
     :param el: 单个/多个  默认 find_element=None 单个  / 如果 find_element = 's' 代表多个
     :return: str drive对象
     """
     try:
         logger.warning('此定位方法只ios系统!!!')
         if el is not None:
             # ios_predicate = self.driver.find_elements_by_ios_predicate(locate)
             ios_predicate = WebDriverWait(
                 self.driver,
                 timeout=IMPLICITLY_WAIT_TIME,
                 poll_frequency=POLL_FREQUENCY).until(
                     lambda x: x.find_elements_by_ios_predicate(locate)
                 )  # 在显示登陆时间内查询元素
         else:
             # ios_predicate = self.driver.find_element_by_ios_predicate(locate)
             ios_predicate = WebDriverWait(
                 self.driver,
                 timeout=IMPLICITLY_WAIT_TIME,
                 poll_frequency=POLL_FREQUENCY).until(
                     lambda x: x.find_element_by_ios_predicate(locate))
         return ios_predicate
     except Exception as e:
         logger.error(
             f'元素在显示等待时间 {IMPLICITLY_WAIT_TIME} 未出现!请检查元素是否存在!! {e}')
Exemple #3
0
    def android_uiautomator(self, locate, el=None):
        """
         更具表达式 查询页面元素
        此方法 只能安卓可用
        :param locate:  expression 表达式 如 :new UiSelector().text("显示")
        :param el: 单个/多个  默认 find_element=None 单个  / 如果 find_element = 's' 代表多个
        :return: str drive对象
        """
        try:
            logger.warning('此定位方法只android系统!!!')
            if el is not None:
                # 多个定位
                # android_uiautomator_driver = self.driver.find_elements_by_android_uiautomator(locate)
                android_uiautomator_driver = WebDriverWait(
                    self.driver,
                    timeout=IMPLICITLY_WAIT_TIME,
                    poll_frequency=POLL_FREQUENCY).until(
                        lambda x: x.find_elements_by_android_uiautomator(locate
                                                                         ))

            else:
                # 单个定位
                # android_uiautomator_driver = self.driver.find_element_by_android_uiautomator(locate)
                android_uiautomator_driver = WebDriverWait(
                    self.driver,
                    timeout=IMPLICITLY_WAIT_TIME,
                    poll_frequency=POLL_FREQUENCY).until(
                        lambda x: x.find_element_by_android_uiautomator(locate
                                                                        ))

            return android_uiautomator_driver
        except Exception as e:
            logger.error(f'元素在显示等待时间 {IMPLICITLY_WAIT_TIME} 未出现!请检查元素是否存在!!')
Exemple #4
0
 def uesd_keyevent(self, code):
     """
     发送 keyevent 操作  * 可以百度搜索 keyevent键列表
     :param code:  keyevent码
     :return:
     """
     logger.warning('此函数只支持安卓系统!')
     self.dri.keyevent(code)
Exemple #5
0
 def background_apps(self, s):
     """
     把 app 放到后台
     :param s: 放置几秒
     :return:
     """
     logger.warning('此函数只支持安卓系统!')
     self.dri.background_app(s)
Exemple #6
0
 def reduce_volume(self, frequency=1):
     """
     减小声音
     :param frequency: 减小次数 默认一次
     :return:
     """
     logger.warning('此函数只支持安卓系统!')
     for i in range(0, frequency):
         self.dri.keyevent(25)
Exemple #7
0
 def add_volume(self, frequency=1):
     """
     增加声音 ** 可以搜索 keyevent 查询具体参数
     :param frequency: 增加次数 默认一次
     :return:
     """
     logger.warning('此函数只支持安卓系统!')
     for i in range(0, frequency):
         self.dri.keyevent(24)
Exemple #8
0
    def used_clear(self, types, locate, el=None, index=None):
        """
        清除输入框
        :param types: 定位类型
        :param locator: 定位元素
        :param el: 单个/多个  默认 find_element=None 单个  / 如果 find_element = 's' 多个
        :param index: 列表索引位置  find_element传递时 此值必填
        """

        if el is not None and index is not None:
            self.used_operate(types=types, locate=locate, el=el)[index].clear()
        else:
            self.used_operate(types=types, locate=locate).clear()
        logger.warning('此定位方法只android系统!!!')
Exemple #9
0
    def ios_predicate_clear(self, locate, el=None, index=None):
        """
         更具表达式 查询页面元素 并且清除输入文本
        此方法 只能 iso 可用
         :param locate:  expression 表达式 如 :new UiSelector().text("显示")
        :param el: 单个/多个  默认 find_element=None 单个  / 如果 find_element = 's' 代表多个
        :param index: 列表索引位置  find_element传递时 此值必填
        :return: str drive对象
        """

        logger.warning('此定位方法只ios系统!!!')
        if el is not None and index is not None:
            self.ios_predicate(locate=locate, el=el)[index].clear()
        else:
            self.ios_predicate(locate=locate, el=el).clear()
Exemple #10
0
    def android_uiautomator_clear(self, locate, el=None, index=None):
        """
        更具表达式 查询页面元素 并 清除操作
        此方法 只能安卓可用
       :param locate:  expression 表达式 如 :new UiSelector().text("显示")
        :param el: 单个/多个  默认 find_element=None 单个  / 如果 find_element = 's' 代表多个
       :param index: 列表索引位置  find_element传递时 此值必填
       :return: str drive对象
       """

        if el is not None and index is not None:
            self.android_uiautomator(locate, el=el)[index].clear()
        else:
            self.android_uiautomator(locate).clear()
        logger.warning('此定位方法只android系统!!!')
Exemple #11
0
    def android_uiautomator_input(self, locate, text, el=None, index=None):
        """
        更具表达式 查询页面元素 并输入 文本
        此方法 只能安卓可用
       :param locate:  locate 表达式 如 :new UiSelector().text("显示")
       :param el: 单个/多个  默认 find_element=None 单个  / 如果 find_element = 's' 代表多个
       :param index: 列表索引位置  find_element传递时 此值必填
       :return: str drive对象
       """

        if el is not None and index is not None:
            self.android_uiautomator(locate, el=el)[index].send_keys(text)
        else:
            self.android_uiautomator(locate).send_keys(text)
        logger.warning('此定位方法只android系统!!!')
Exemple #12
0
    def ios_predicate_click(self, locate, el=None, index=None):
        """
         更具表达式 查询页面元素 并且点击该元素
        此方法 只能 iso 可用
        :param locate:  locate 表达式 如 :new UiSelector().text("显示")
       :param el: 单个/多个  默认 find_element=None 单个  / 如果 find_element = 's' 代表多个
       :param index: 列表索引位置  find_element传递时 此值必填
       :return: str drive对象
        """

        logger.warning('此定位方法只ios系统!!!')
        if el is not None and index is not None:
            # 多个定位定位 利用index 列表索引点击
            self.ios_predicate(locate=locate, el=el)[index].click()
        else:
            # 单个定位点击
            self.ios_predicate(locate=locate).click()
Exemple #13
0
 def used_clear(self, types, locate, el=None, index=None):
     """
     清除输入框
     :param types: 定位类型
     :param locate: 定位元素
     :param el: 单个/多个  默认 find_element=None 单个  / 如果 find_element = 's' 多个
     :param index: 列表索引位置  find_element传递时 此值必填
     """
     try:
         if el is not None and index is not None:
             self.used_operate(types=types, locate=locate, el=el)[index].clear()
         else:
             self.used_operate(types=types, locate=locate).clear()
         logger.warning('此定位方法只android系统!!!')
     except Exception as e:
         if AttributeError:
             logger.error(f'未找到元素或此元素没有 {e}')
         else:
             logger.error(f'find_element 不为空时 index 参数必须传递!!{e}')
Exemple #14
0
    def get_by_type(self, types):
        """
        获取定位类型  目前 app 只提供了 ,
        *安卓 (id(resource-id), class(ClassName) , xpath,)
        *iso (xpath, class(type) ,cont_name(name) , )
        :param types:  str
        :return:  False
        """
        types = types.lower()
        if types == "id":
            if PLATFORMNAME.lower() == 'android':
                logger.warning('此方法只支持android系统,ios不支持建议更换定位方式!!')
                return By.ID
            else:
                logger.error(f'{PLATFORMNAME} 不支持id定位')
        elif types == "xpath":
            return By.XPATH
        elif types == "class":
            return By.CLASS_NAME
        else:
            logger.info(f"Locator type {types} not correct/supported")

        raise ErrorExcep(f'不支持输入类型参数{types}!!!')
Exemple #15
0
    def app_expression(self,
                       types,
                       locate,
                       operate=None,
                       text=None,
                       el=None,
                       index=None,
                       wait=0.5):
        """
        app  执行操作判断
        安卓 ios 表达式定位方法  (uiautomator(安卓) / ios_predicate(ios)  accessibilityid(安卓/ios))
        :param types: 定位类型
        :param locate: 表达 或者定位元素
        安卓  'new UiSelector().text("显示")'
        iOS  "type == 'XCUIElementTypeButton' AND value == 'ClearEmail'"
        :param operate: 执行操作  input(输入) , clear(清除) , clear_continue_input(清除在输入) 、click(点击) ,text(提取文本) , slide(滑动)   * 只支持 6种
        :param text : 输入文本内容
        :param el: 单个/多个  默认 el=None 单个  / 如果 el = 's' 代表多个
        :param index:
        :param wait: 默认 等待0.5 秒
        :return:
        """
        # 只支持安卓
        if PLATFORMNAME.lower() == 'android' and types == 'uiautomator':
            logger.warning('此方法只支持android系统!!')
            return self.if_android_operate_uiautomator(locate=locate,
                                                       operate=operate,
                                                       text=text,
                                                       el=el,
                                                       index=index,
                                                       wait=wait)

        # 只支持 iso
        elif PLATFORMNAME.lower() == 'ios' and types == 'ios_predicate':
            logger.warning('此方法只支持ios系统!!')
            return self.if_operate_ios_predicate(locate=locate,
                                                 operate=operate,
                                                 text=text,
                                                 el=el,
                                                 index=index,
                                                 wait=wait)

        elif types == 'accessibilityid':
            return self.if_acceaaibilityid_predicate(locate=locate,
                                                     operate=operate,
                                                     text=text,
                                                     el=el,
                                                     index=index,
                                                     wait=wait)

        elif types in ('xpath', 'class', 'id'):
            return self.if_commonly_used_predicate(types=types,
                                                   locate=locate,
                                                   operate=operate,
                                                   text=text,
                                                   el=el,
                                                   index=index,
                                                   wait=wait)
        else:

            logger.error(f"""输入的{operate}操作类型,暂时不支持!!
            uiautomator 、ios_predicate 、accessibilityid、xpath、class、id 定位类型
            """)
            raise ErrorExcep(f"""输入的{operate}操作类型,暂时不支持!!
            uiautomator 、ios_predicate 、accessibilityid、xpath、class、id 定位类型
            """)
Exemple #16
0
    def setup(self):
        """
        设置单机版 浏览器驱动
        :return:
        """
        # 判断当前系统
        try:
            if self.inspect_url_code(self.url):  # 如果项目地址正常
                current_sys = sys.platform.lower()
                log_path = os.path.join(LOG_DIR, f'{DAY}firefox.log')

                if current_sys == 'linux':  # linux系统

                    if self.browser == 'chrome':  # 谷歌浏览器
                        option = self.linux_chrome_args
                        driver = webdriver.Chrome(executable_path=LUINX_CHROMEDRIVER, options=option)
                        return self.browaer_setup_args(driver)

                    elif self.browser == 'firefox':  # 火狐浏览器
                        options = self.linux_firefox_args
                        driver = webdriver.Firefox(executable_path=LUINX_FIREFOXDRIVER, options=options,
                                                   service_log_path=log_path)
                        drivers = self.browaer_setup_args(driver)
                        return drivers # 在linux下启用 火狐浏览器需要借助Display

                    else:
                        logger.error(f'linux系统不支持此浏览器: {self.browser}')
                        return False

                elif current_sys == 'darwin':  # mac 系统

                    if self.browser == 'chrome':
                        driver = webdriver.Chrome(executable_path=MAC_CHROMEDRIVER)
                        return self.browaer_setup_args(driver)

                    elif self.browser == 'firefox':
                        driver = webdriver.Firefox(executable_path=MAC_FIREFOXDRIVER, service_log_path=log_path)
                        return self.browaer_setup_args(driver)

                    elif self.browser == 'safari':
                        driver = webdriver.Safari()
                        return self.browaer_setup_args(driver)

                    else:
                        logger.error(f'mac系统不支持此浏览器: {self.browser}')
                        return False
                elif current_sys == 'win32':

                    if self.browser == 'ie':
                        logger.warning('请确保当前服务器安装IE!')
                        driver = webdriver.Ie(executable_path=IE_PATH)
                        return self.browaer_setup_args(driver)

                    if self.browser == 'chrome':
                        driver = webdriver.Chrome(executable_path=WIN_CHROMEDRIVER)
                        return self.browaer_setup_args(driver)

                    elif self.browser == 'firefox':
                        driver = webdriver.Firefox(executable_path=WIN_FIREFOXDRIVER, service_log_path=log_path)
                        return self.browaer_setup_args(driver, )

                    else:
                        logger.error(f'windos系统不支持此浏览器: {self.browser}')

                        return False
                else:
                    logger.error(f'当前{current_sys}系统不支持!')
                    return False
            else:
                logger.error('项目地址地址请求异常!!!')
                return False

        except Exception as e:
            logger.error(f'浏览器驱动启动失败 {e}')
            return False