Пример #1
0
    def _get_element_by_type(driver: webdriver.Remote, locator, element=True):
        """通过locator定位元素(默认定位单个元素)

        Args:
            driver:driver
            locator:定位器
            element:
                true:查找单个元素
                false:查找多个元素

        Returns:单个元素 或 元素list

        """
        value = locator['value']
        ltype = locator['type']

        if ltype == "id":
            value_id = re.findall("(id/.+)", value)[0]
            value = str(_package) + ":" + str(value_id)

        if ltype == 'name':
            ui_value = 'new UiSelector().textContains' + '(\"' + value + '\")'
            return driver.find_element_by_android_uiautomator(
                ui_value
            ) if element else driver.find_elements_by_android_uiautomator(
                ui_value)
        else:
            return driver.find_element(
                ltype, value) if element else driver.find_elements(
                    ltype, value)
Пример #2
0
class APP(object):
    """
    APP页面基类
    """
    __metaclass__ = _APPMetaclass
    driver_share = {}
    driver = None
    command_executor = None
    desired_capabilities = None

    def __init__(self):
        self.LOGGER = logging.getLogger(self.__class__.__name__)
        if not self.driver_share.get('driver'):
            self.driver = Remote(
                self.command_executor,
                desired_capabilities=self.desired_capabilities)
            self.driver_share['driver'] = self.driver
        else:
            self.driver = self.driver_share['driver']  # type: Remote

    @classmethod
    def init(cls, command_executor=None, desired_capabilities=None):
        if command_executor:
            cls.command_executor = command_executor
        if desired_capabilities:
            cls.desired_capabilities = desired_capabilities

    def __getattr__(self, item):
        try:
            element = self.__elements__[item]
        except IndexError:
            raise ValueError(u'没找到要查找的变量')

        time.sleep(0.4)
        total_time, element_object = self.__find_element(element)
        self.LOGGER.info(u'查找%s元素共用时: %s秒' % (item, total_time))
        return element_object

    @fn_timer
    def __find_element(self, element):
        if len(element) == 2:
            return self.driver.find_element(*element)
        elif len(element) == 3 and element[-1] == 'elements':
            return self.driver.find_elements(*element[:2])
        else:
            raise TypeError(u'Element(s)不正确')

    def quit(self):
        try:
            self.driver.quit()
            self.driver_share['driver'] = None
        except:
            pass
Пример #3
0
from appium.webdriver.common.multi_action import MultiAction
import time
from appium.webdriver import Remote
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver.common.by import By

caps = {
    "platformName": "Android",
    "deviceName": "emulator-5554",
    "appPackage": "com.lemon.lemonban",
    "appActivity": "com.lemon.lemonban.activity.WelcomeActivity"
}
# 创建一个会话
driver = Remote(command_executor='http://127.0.0.1:4723/wd/hub',
                desired_capabilities=caps)
# 等待
driver.implicitly_wait(10)

# toast 弹框定位文本,方法一:通过 text文本定位 toast弹框
text = '用户名或者密码不正确'
driver.find_element(By.XPATH, f'//*[contains(@text,"{text}")]')

# 方法二: //Android.widget.Toast
el = driver.find_element(By.XPATH, '//android.widget.Toast')
# 断言 获取文本 el.text
Пример #4
0
caps = {"platformName":"Android",
        "deviceName":"emulator-5554",
        "app":r"E:\zengcong\software\appium\lemon.apk"}
"""
caps = {"platformName":"Android",
        # 校验系统版本
        # "platformVersion":"8.0",
        "automationName":"Uiautomator2",
        "deviceName":"emulator-5554",
        #"app":r"E:\zengcong\software\appium\Future-release-2018.apk",
        "appPackage":"com.lemon.lemonban",
        "appActivity":"com.lemon.lemonban.activity.WelcomeActivity",
        # 重启设置,会使用缓存数据
        "noReset": True}

# 创建一个会话
driver = Remote(command_executor='http://127.0.0.1:4723/wd/hub',
                desired_capabilities=caps)
# 等待
driver.implicitly_wait(10)
# 找元素
driver.find_element(By.ID,'com.lemon.lemonban:id/navigation_my').click()

driver.quit()

# 可以不提供 app路径,而是提供 app 的包名 和 activity
# 包名:app 在你手机上的ID
# activity: app 当中的哪个页面。
# 查看 app name activity 命令:aapt dump badging E:\zengcong\software\appium\lemon.apk
# 这个要先安装包
Пример #5
0
driver.implicitly_wait(10)

# 锁屏
driver.lock()
driver.back()
time.sleep(1)
# 解开屏幕
#driver.unlock()
time.sleep(1)
# 向上滑动
swipe_up(driver)
# 获取元素的属性
# el.rect	{"x":557,"y":252,"width":486,"height":486}

# 定位元素
el = driver.find_element(
    By.XPATH, '//*[@resource-id="com.android.systemui:id/lockPatternView"]')
# 第一个点
# rect = 	{"x":557,"y":252,"width":486,"height":486}
# 获取元素的x,y,width,height
rect = el.rect
start_x = rect['x']
start_y = rect['y']
width = rect['width']
height = rect['height']

point_01 = {'x': start_x + width * 1 / 6, 'y': start_y + height * 1 / 6}
point_02 = {'x': start_x + width * 1 / 2, 'y': start_y + height * 1 / 6}
point_03 = {'x': start_x + width * 5 / 6, 'y': start_y + height * 1 / 6}
point_04 = {'x': start_x + width * 1 / 6, 'y': start_y + height * 1 / 2}
point_05 = {'x': start_x + width * 1 / 2, 'y': start_y + height * 1 / 2}
point_06 = {'x': start_x + width * 5 / 6, 'y': start_y + height * 1 / 2}
Пример #6
0
    "com.lemon.lemonban",
    "appActivity":
    "com.lemon.lemonban.activity.WelcomeActivity",
    "chromedriverExecutable":
    'E:\zengcong\software\chromedriver\chromedriver_242.exe'
}
# 创建一个会话
driver = Remote(command_executor='http://127.0.0.1:4723/wd/hub',
                desired_capabilities=caps)
# 等待
driver.implicitly_wait(10)
# 获取现在的环境
print("现在的环境的原生界面", driver.current_context)
print("所有的环境", driver.contexts)
# 定位到师资团队的元素
driver.find_element(By.XPATH, '//*[@text="师资团队"]').click()

# 切换到 webview / h5 环境
driver.switch_to.context('WEBVIEW_com.lemon.lemonban')

# 获取现在的环境
print("现在的环境是h5界面", driver.current_context)
print("所有的环境", driver.contexts)

time.sleep(1)

# 我没有导入 selenium,
# 定位柠檬班几个字
driver.find_element(By.XPATH, '//*[text()="柠檬班"]').click()
# 回退主页
driver.back()
Пример #7
0
    "platformName": "Android",
    # 校验系统版本
    # "platformVersion":"8.0",
    "automationName": "Uiautomator2",
    "deviceName": "emulator-5554",
    #"app":r"E:\zengcong\software\appium\Future-release-2018.apk",
    "appPackage": "com.lemon.lemonban",
    "appActivity": "com.lemon.lemonban.activity.WelcomeActivity",
    # 重启设置,会使用缓存数据
    "noReset": True
}

# 创建一个会话
driver = Remote(command_executor='http://127.0.0.1:4723/wd/hub',
                desired_capabilities=caps)
# 等待
driver.implicitly_wait(10)
# 查找元素
driver.find_element('id')
driver.find_element('xpath')
# 这是通过安卓原生的定位方式,我们需要写Java 语言,没有提示
# 坑:Java语言当中的字符串是使用 双引号,不能使用单引号
# 优势:原生的,
locator = 'new UiSelector().resourceId("com.lemon.lemonban:id/navigation_my").checkable(false)'
driver.find_element_by_android_uiautomator(locator)

# 通过描述 desc 去获取元素,因为极有可能没有
driver.find_element_by_accessibility_id()
# tagname 不行
# class_name,可以,但是相当于原来的 tag_name,不能精确定位
Пример #8
0
desired_cap = {
    "platformName": "Android",
    "platformVersion": "8.0.0",
    "automationName": "UiAutomator2",
    "deviceName": "HUAWEIP30",
    "appPackage": "com.lemon.lemonban",
    "appActivity": "com.lemon.lemonban.activity.WelcomeActivity"
}

driver = Remote(command_executor='http://127.0.0.1:4723/wd/hub',
                desired_capabilities=desired_cap)
driver.implicitly_wait(15)
driver.find_element_by_android_uiautomator(
    'new UiSelector().text("我的柠檬")').click()
time.sleep(3)
driver.find_element_by_android_uiautomator(
    'new UiSelector().text("点击头像登录")').click()
driver.find_element_by_android_uiautomator(
    'new UiSelector().text("手机号码")').send_keys('15011466717')
driver.find_element_by_android_uiautomator(
    'new UiSelector().text("密码")').send_keys('15011466717')

driver.find_element_by_android_uiautomator(
    'new UiSelector().text("登录")').click()

# 获取tost提示
loc = (MobileBy.XPATH, '//*[contains(@text,"错误")]')
res = driver.find_element(*loc).get_attribute('text')
print(res)