zoukankan      html  css  js  c++  java
  • AppUi自动化框架pyapp.py代码

    from lib.pyse import Pyse
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import WebDriverWait
    from appium.webdriver.common.mobileby import MobileBy
    from appium.webdriver.connectiontype import ConnectionType

    class Pyapp(Pyse):
    def __init__(self, driver):
    self.d = driver

    @property
    def driver(self):
    return self.d

    def swipe_up(self, t=500, n=1):
    """向上滑动屏幕"""
    l = self.d.get_window_size()
    x1 = l['width'] * 0.5 # x坐标
    y1 = l['height'] * 0.85 # 起始y坐标
    y2 = l['height'] * 0.25 # 终点y坐标
    for i in range(n):
    self.d.swipe(x1, y1, x1, y2, t)

    def swipe_down(self, t=500, n=1):
    """向下滑动屏幕"""
    l = self.d.get_window_size()
    x1 = l['width'] * 0.5 # x坐标
    y1 = l['height'] * 0.25 # 起始y坐标
    y2 = l['height'] * 0.75 # 终点y坐标
    for i in range(n):
    self.d.swipe(x1, y1, x1, y2, t)

    def swipe_left(self, t=500, n=1):
    """向左滑动屏幕"""
    l = self.d.get_window_size()
    x1 = l['width'] * 0.75
    y1 = l['height'] * 0.5
    x2 = l['width'] * 0.05
    for i in range(n):
    self.d.swipe(x1, y1, x2, y1, t)

    def swipe_right(self, t=500, n=1):
    """向右滑动屏幕"""
    l = self.d.get_window_size()
    x1 = l['width'] * 0.05
    y1 = l['height'] * 0.5
    x2 = l['width'] * 0.75
    for i in range(n):
    self.d.swipe(x1, y1, x2, y1, t)

    def get_element(self, css):
    if "=>" not in css:
    raise NameError("Positioning syntax errors, lack of '=>'.")
    self.element_wait(css)

    by = css.split("=>")[0]
    value = css.split("=>")[1]
    if by == "id":
    element = self.d.find_element_by_id(value)
    elif by == "name":
    element = self.d.find_element_by_name(value)
    elif by == "class":
    element = self.d.find_element_by_class_name(value)
    elif by == "link_text":
    element = self.d.find_element_by_link_text(value)
    elif by == "xpath":
    element = self.d.find_element_by_xpath(value)
    elif by == "css":
    element = self.d.find_element_by_css_selector(value)
    elif by == 'content':
    element = self.d.find_element_by_accessibility_id(value)
    elif by == 'android':
    element = self.d.find_element_by_android_uiautomator(value)
    elif by == 'ios':
    element = self.d.find_element_by_ios_predicate(value)
    else:
    raise NameError(
    "Please enter the correct targeting elements,'id','name','class','link_text','xpath','css'.")
    return element

    def get_elements(self, css):
    if "=>" not in css:
    raise NameError("Positioning syntax errors, lack of '=>'.")
    self.element_wait(css)

    by = css.split("=>")[0]
    value = css.split("=>")[1]
    if by == "id":
    elements = self.d.find_elements_by_id(value)
    elif by == "name":
    elements = self.d.find_elements_by_name(value)
    elif by == "class":
    elements = self.d.find_elements_by_class_name(value)
    elif by == "link_text":
    elements = self.d.find_elements_by_link_text(value)
    elif by == "xpath":
    elements = self.d.find_elements_by_xpath(value)
    elif by == "css":
    elements = self.d.find_elements_by_css_selector(value)
    elif by == 'content':
    elements = self.d.find_elements_by_accessibility_id(value)
    elif by == 'android':
    elements = self.d.find_elements_by_android_uiautomator(value)
    elif by == 'ios':
    elements = self.d.find_elements_by_ios_predicate(value)
    else:
    raise NameError(
    "Please enter the correct targeting elements,'id','name','class','link_text','xpath','css'.")
    return elements

    def element_wait(self, css, secs=60):
    if "=>" not in css:
    raise NameError("Positioning syntax errors, lack of '=>'.")
    by = css.split("=>")[0]
    value = css.split("=>")[1]
    if by == "id":
    WebDriverWait(self.d, secs, 1).until(EC.presence_of_element_located((MobileBy.ID, value)))
    elif by == "name":
    WebDriverWait(self.d, secs, 1).until(EC.presence_of_element_located((MobileBy.NAME, value)))
    elif by == "class":
    WebDriverWait(self.d, secs, 1).until(EC.presence_of_element_located((MobileBy.CLASS_NAME, value)))
    elif by == "link_text":
    WebDriverWait(self.d, secs, 1).until(EC.presence_of_element_located((MobileBy.LINK_TEXT, value)))
    elif by == "xpath":
    WebDriverWait(self.d, secs, 1).until(EC.presence_of_element_located((MobileBy.XPATH, value)))
    elif by == "css":
    WebDriverWait(self.d, secs, 1).until(EC.presence_of_element_located((MobileBy.CSS_SELECTOR, value)))
    elif by == "content":
    WebDriverWait(self.d, secs, 1).until(
    EC.presence_of_element_located((MobileBy.ACCESSIBILITY_ID, value)))
    elif by == 'android':
    WebDriverWait(self.d, secs, 1).until(
    EC.presence_of_element_located((MobileBy.ANDROID_UIAUTOMATOR, value)))
    elif by == 'ios':
    WebDriverWait(self.d, secs, 1).until(
    EC.presence_of_element_located((MobileBy.IOS_PREDICATE, value)))
    else:
    raise NameError(
    "Please enter the correct targeting elements,'id','name','class','link_text','xpath','css'.")

    def random_action(self, css):
    if "=>" not in css:
    raise NameError("Positioning syntax errors, lack of '=>'.")

    by = css.split("=>")[0]
    value = css.split("=>")[1]
    try:
    if by == "id":
    return EC.visibility_of_element_located((MobileBy.ID, value))
    elif by == "name":
    return EC.visibility_of_element_located((MobileBy.NAME, value))
    elif by == "class":
    return EC.visibility_of_element_located((MobileBy.CLASS_NAME, value))
    elif by == "link_text":
    return EC.visibility_of_element_located((MobileBy.LINK_TEXT, value))
    elif by == "xpath":
    return EC.visibility_of_element_located((MobileBy.XPATH, value))
    elif by == "css":
    return EC.visibility_of_element_located((MobileBy.CSS_SELECTOR, value))
    elif by == "content":
    return EC.visibility_of_element_located((MobileBy.ACCESSIBILITY_ID, value))
    elif by == 'android':
    return EC.visibility_of_element_located((MobileBy.ANDROID_UIAUTOMATOR, value))
    elif by == 'ios':
    return EC.visibility_of_element_located((MobileBy.IOS_PREDICATE, value))
    else:
    raise NameError(
    "Please enter the correct targeting elements,'id','name','class','link_text','xpath','css'.")
    except Exception as e:
    pass

    def key_code(self, code):
    '''

    :param code: 按键码
    :return:
    '''
    self.d.press_keycode(code)

    def hide_keyboard(self):
    self.d.hide_keyboard()

    def background_app(self, second):
    self.d.background_app(second)

    @property
    def current_context(self):
    return self.d.current_context

    @property
    def context(self):
    return self.d.context

    @property
    def contexts(self):
    return self.d.contexts

    def switch_web_view(self):
    context_names = self.contexts
    if len(context_names) > 1:
    from lib.logger import logger
    logger.debug(context_names[-1])
    self.d.switch_to.context(context_names[-1])

    def switch_native_app(self):
    context_names = self.contexts
    self.d.switch_to.context(context_names[0])

    def set_network(self, network):
    '''
    1、WIFI 2、数据流量 3、飞行模式 4、无网 5、全部打开
    '''
    if network == 1:
    self.d.set_network_connection(ConnectionType.WIFI_ONLY)
    elif network == 2:
    self.d.set_network_connection(ConnectionType.DATA_ONLY)
    elif network == 3:
    self.d.set_network_connection(ConnectionType.AIRPLANE_MODE)
    elif network == 4:
    self.d.set_network_connection(ConnectionType.NO_CONNECTION)
    elif network == 5:
    self.d.set_network_connection(ConnectionType.ALL_NETWORK_ON)
    return self

    def launch_app(self):
    return self.d.launch_app()

    def close_app(self):
    return self.d.close_app()

    def reset(self):
    return self.d.reset()

    def is_app_installed(self, package):
    return self.d.is_app_installed(package)

    def set_value(self, element, value):
    self.d.set_value(element, value)

    def lock(self, s):
    self.d.lock(s)

    def wait_and_save_exception(self, css, name):
    try:
    self.element_wait(css, secs=5)
    return True
    except Exception as e:
    from lib.path import APPPICTUREPATH
    import threading
    self.get_windows_img(APPPICTUREPATH.format(threading.current_thread().getName()) + name + '.jpg')
    return False
  • 相关阅读:
    django文件——django + jquery-file-upload上传篇(一)-- 插件实现文件上传
    jQuery动态数字翻滚计数到指定数字的文字特效 JQuery.Running.js
    bootstrap table 第一弹:实现模态框弹出编辑
    input输入框下横线动画实现+自动填充
    Jquery 实现动态添加输入框&编号
    解决公司内网只允许微信上网:CentOS7 + SS5 搭建Sockt5代理服务器方案
    python学习系列:装饰器
    linux学习:文件属性(一)—— inode
    requests模块中request函数参数介绍
    Forbidden(403)的3种处理方式
  • 原文地址:https://www.cnblogs.com/laosun0204/p/9748770.html
Copyright © 2011-2022 走看看