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)
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
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
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 # 这个要先安装包
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}
"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()
"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,不能精确定位
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)