appium案例以及常用方法api

mac2025-01-12  38

封装类:

from appium import webdriver from appium.webdriver.common.touch_action import TouchAction from selenium.webdriver.support.wait import WebDriverWait class TestSeting(): def __init__(self): desired_caps = {} # 配置参数的字典 desired_caps['platformName'] = 'Android' # 平台名称,iOS、Android、 FirefoxOS,选择真机/模拟器对应的就好 desired_caps['deviceName'] = '模拟器' # 设备名称填写任意内容(使用的移动设备或模拟器的种类) # desired_caps['platformVersion'] = '5.1.1' # 平台版本 # desired_caps['appPackage'] = 'com.android.contacts' # 要运行的Android应用程序的Java包 # desired_caps['appActivity'] = '.activities.PeopleActivity' # 要运行的Android应用程序的主入口 desired_caps['platformVersion'] = '9' # 平台版本 desired_caps['appPackage'] = 'com.包名' # 要运行的Android应用程序的Java包 desired_caps['appActivity'] = '.Activity' # 要运行的Android应用程序的主入口 desired_caps['unicodeKeyboard'] = True # 设置启动编码 desired_caps['resetKeyboard'] = False # 重置键盘 desired_caps['noReset'] = 'True' #默认为False,当设置为true时不作为首次进入(在此会话之前,请勿重置应用程序状态) self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps) # return self.driver def waitXpath(self, xpath): return WebDriverWait(self.driver, 5, 0.5).until(lambda x: x.find_element_by_xpath(xpath)) def waitId(self, id): return WebDriverWait(self.driver, 5, 0.5).until(lambda x: x.find_element_by_id(id)) def waitClassName(self, classname): return WebDriverWait(self.driver, 5, 0.5).until(lambda x: x.find_element_by_class_name(classname)) # 在当前类中的Terminal中执行:pytest -s 类名.py --html=./测试报告名.html

 

案例1:# 启动app,打开通知栏并人选一条数据进入详情页面

from text_homework.scripts import testSeting import unittest import time class testDyhoa5(unittest.TestCase): def setUp(self): print("start开始") def tearDown(self): print("end结束") def test_001(self): driver = testSeting.TestSeting().driver time.sleep(5) driver.open_notifications() driver.find_element_by_id("android:id/status_bar_latest_event_content").click() tes = testDyhoa5() tes.test_001()

案例2:模拟器电话本新建用户 张三,要求必填信息为:姓名 电话 电子邮件 公司,保存后修改张三姓名改为李四

from text_homework.scripts import testSeting import unittest import time class testDyhoa2(unittest.TestCase): def setUp(self): print("start开始") def tearDown(self): print("end结束") def test_001(self): driver = testSeting.TestSeting().driver print("start") driver.find_element_by_id("com.android.contacts:id/floating_action_button").click() driver.find_element_by_xpath("//*[contains(@text,'本地保存')]").click() driver.find_element_by_xpath("//*[contains(@text,'姓名')]").send_keys("张**") driver.find_element_by_xpath("//*[contains(@text,'姓名拼音')]").send_keys("yyy") driver.find_element_by_xpath("//*[contains(@text,'昵称')]").send_keys("**") driver.find_element_by_xpath("//*[contains(@text,'电话')]").send_keys("18810762963") time.sleep(2) driver.drag_and_drop(driver.find_element_by_xpath("//*[contains(@text,'电子邮件')]"), driver.find_element_by_xpath("//*[contains(@text,'张**')]")) # 上下滑动 time.sleep(2) driver.find_element_by_xpath("//*[contains(@text,'电子邮件')]").send_keys("@18810762963.com") driver.find_element_by_xpath("//*[contains(@text,'地址')]").send_keys("地址:北京天安门") driver.find_element_by_xpath("//*[contains(@text,'公司')]").send_keys("公司:故宫") testSeting.TouchAction(driver).tap(x=79, y=168).perform() driver.find_element_by_id("com.android.contacts:id/menu_edit").click() driver.find_element_by_xpath("//*[contains(@text,'张**')]").clear() driver.find_element_by_xpath("//*[contains(@text,'姓名')]").send_keys("韩**") testSeting.TouchAction(driver).tap(x=79, y=168).perform() tes = testDyhoa2() tes.test_001()

 

案例1:

# https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md   查看详细参数意义   from appium.webdriver.common.touch_action import TouchAction from appium import webdriver import time   desired_caps = {}                                       #配置参数的字典 desired_caps['platformName'] = 'Android'                #平台名称,iOS、Android、 FirefoxOS,选择真机/模拟器对应的就好 desired_caps['platformVersion'] = '5.1.1'               #平台版本 desired_caps['deviceName'] = '真机'                     #设备名称填写任意内容(使用的移动设备或模拟器的种类) # desired_caps['appPackage'] = 'com.dyhoa.school'       #要运行的Android应用程序的Java包 # desired_caps['appActivity'] = '.LauncherNewActivity'  #要运行的Android应用程序的主入口 desired_caps['appPackage'] = 'com.android.settings'     #要运行的Android应用程序的Java包 desired_caps['appActivity'] = '.Settings'               #要运行的Android应用程序的主入口 # desired_caps['udid'] = '8c9abb78'                     #连接的物理设备的唯一设备标识符,可通过adb devices查看(非必选) desired_caps['unicodeKeyboard'] = True                  #设置启动编码 # desired_caps['resetKeyboard'] = False                 #重置键盘 desired_caps['noReset'] = 'True'                        #默认为False,当设置为true时不作为首次进入(在此会话之前,请勿重置应用程序状态)   driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_caps) print("start") time.sleep(4) # 登录 # driver.find_element_by_id("com.dyhoa.school:id/image_home_message").click() # driver.find_element_by_xpath("//android.widget.TextView[@text='密码登录 >']").click() # login_pho = driver.find_element_by_xpath("//android.widget.EditText[@text='输入手机号']") # login_pho = driver.find_element_by_xpath("//*[contains(@text,'输入手机号')]")  #方法2  contains模糊查找 # login_pho.send_keys("18810762963") # login_pwd = driver.find_element_by_xpath("//android.widget.EditText[@text='输入密码']") # # login_pwd = driver.find_element_by_id("com.dyhoa.school:id/login_pwd") # login_pwd.send_keys("1111") # driver.find_element_by_id("com.dyhoa.school:id/btn_login").click()   # driver.get_screenshot_as_file('pay.png')    #手机截屏   # driver.set_network_connection(6)    #0为什么都不开,1为飞行模式,2为wifi,4为移动网络,6为wifi与网络   # for x in range(3):    #循环步数,点击三次,keyevent(25) #     driver.keyevent(27)   # print(driver.device_time)   #获取手机系统时间   # driver.background_app(10)   #放置后台启动 时间一到 会再起显示   # size  = driver.get_window_size()      #获取屏幕分辨率   # driver.find_element_by_xpath("//android.view.View[@text'设置']").click()    #通过class与text 定位 # driver.find_element_by_xpath("//*[contains(@text'设置')]").click()      #通过text内容模糊查找 # driver.find_element_by_xpath("//*[@resource-id='com.android.settings:id/search']").click()    #通过id键值查找   #上下滑动 # end = driver.find_element_by_xpath("//*[contains(@text,'蓝牙')]") # start = driver.find_element_by_xpath("//*[contains(@text,'游戏防沉迷')]") # driver.drag_and_drop(start,end)     #上下滑动   #获取xy点 # locat = driver.find_element_by_id("com.android.settings:id/relative").location   # 点击通知内容 # driver.open_notifications() # driver.find_element_by_id("android:id/status_bar_latest_event_content").click()   # print('网络为',driver.network_connection)        #获取当前手机网络   # 通过元素定位方式敲击屏幕 # TouchAction(driver).tap(driver.find_element_by_xpath("//*[contains(@text,'蓝牙')]")).perform()   # 通过xy点定位方式敲击屏幕 # TouchAction(driver).tap(x=0,y=943).perform()   # 通过元素定位方式    手指按压后离开,轻触 # TouchAction(driver).press(driver.find_element_by_xpath("//*[contains(@text,'蓝牙')]")).release().perform()   # 通过xy点定位方式    手指按压后离开,轻触 # TouchAction(driver).press(x=0,y=944).release().perform()   # 通过元素定位方式    手指长按 # TouchAction(driver).long_press(driver.find_element_by_xpath("//*[contains(@text,'蓝牙')]"),3000).release().perform()   # 通过xy点定位方式    手指长按 # TouchAction(driver).long_press(x=0,y=944,duration=3000).release().perform()     end = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]") start = driver.find_element_by_xpath("//*[contains(@text,'存储')]") driver.drag_and_drop(start,end)     #上下滑动 TouchAction(driver).tap(driver.find_element_by_xpath("//*[contains(@text,'安全')]")).perform() TouchAction(driver).tap(driver.find_element_by_xpath("//*[contains(@text,'屏幕锁定方式')]")).perform() edit = driver.find_element_by_id("com.android.settings:id/password_entry") edit.send_keys("123456") time.sleep(1) TouchAction(driver).tap(driver.find_element_by_xpath("//*[contains(@text,'下一步')]")).perform() time.sleep(1) TouchAction(driver).tap(driver.find_element_by_xpath("//*[contains(@text,'图案')]")).perform() # TouchAction(driver).press(x=178,y=640).wait(1000).move_to(x=536,y=640).release().perform() TouchAction(driver).press(x=244,y=967).wait(1000).move_to(x=479,y=0).wait(1000).move_to(x=0,y=475).wait(1000).move_to(x=-479,y=474).release().perform()   print("end")  

测试模拟器通讯录并添加联系人,生成测试报告。 import time from appium import webdriver from appium.webdriver.common.touch_action import TouchAction from selenium.webdriver.support.wait import WebDriverWait

class Test_Utils():     def setup(self):         desired_caps = {}  # 配置参数的字典         desired_caps['platformName'] = 'Android'  # 平台名称,iOS、Android、 FirefoxOS,选择真机/模拟器对应的就好         desired_caps['platformVersion'] = '5.1.1'  # 平台版本         desired_caps['deviceName'] = '模拟器'  # 设备名称填写任意内容(使用的移动设备或模拟器的种类)         desired_caps['appPackage'] = 'com.android.contacts'  # 要运行的Android应用程序的Java包         desired_caps['appActivity'] = '.activities.PeopleActivity'  # 要运行的Android应用程序的主入口         desired_caps['unicodeKeyboard'] = True  # 设置启动编码         desired_caps['resetKeyboard'] = False  # 重置键盘         # desired_caps['noReset'] = 'False'                          #默认为False,当设置为true时不作为首次进入(在此会话之前,请勿重置应用程序状态)         self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)

    def teardown(self):         print("end结束")

    def waitXpath(self, xpath):         return WebDriverWait(self.driver, 5, 0.5).until(lambda x: x.find_element_by_xpath(xpath))

    def waitId(self, id):             return WebDriverWait(self.driver, 5, 0.5).until(lambda x: x.find_element_by_id(id))

    def test_001(self):         self.waitId("com.android.contacts:id/floating_action_button").click()         self.waitXpath("//*[contains(@text,'本地保存')]").click()         self.driver.find_element_by_xpath("//*[contains(@text,'姓名')]").send_keys("杨勇勇")         self.driver.find_element_by_xpath("//*[contains(@text,'姓名拼音')]").send_keys("yyy")         self.driver.find_element_by_xpath("//*[contains(@text,'昵称')]").send_keys("勇勇")         self.driver.find_element_by_xpath("//*[contains(@text,'电话')]").send_keys("18810762963")         time.sleep(2)         self.driver.drag_and_drop(self.driver.find_element_by_xpath("//*[contains(@text,'电子邮件')]"),         self.driver.find_element_by_xpath("//*[contains(@text,'杨勇勇')]"))  # 上下滑动         time.sleep(2)         self.driver.find_element_by_xpath("//*[contains(@text,'电子邮件')]").send_keys("@18810762963.com")         self.driver.find_element_by_xpath("//*[contains(@text,'地址')]").send_keys("北京天安门")         self.driver.find_element_by_xpath("//*[contains(@text,'公司')]").send_keys("故宫")         TouchAction(self.driver).tap(x=79, y=168).perform()

    def test_002(self):         print("测试2")

    def test_003(self):         print("测试3")

# 在当前类中的Terminal中执行:pytest -s 类名.py --html=./测试报告名.html # pytest -s BaseUtils.py --html=./123.html

 

 

 

API:

(1)获取当前页面的activity名,比如: (.ui.login.ViewPage)

 current_activity()

 比如我们需要实现这个登录的功能时,主要思路为如果当前界面为登录页面时,就进行登录行为,否则就跳转到登录页面。其伪代码为:

1 if driver.current_activity == ".ui.login.ViewPage": 2 // To login_action 3 else: 4 // Trun to loginPage

 

(2)获取当前页面的树形结构源代码,与uiautomatorviewer截屏所展示出来的结构是相同的

 page_source()

例如当我们完成登录流程之后,要判断登录是否成功,则可以判断登录后的页面有没有出现特定的内容(比如:运动圈、发现、运动、商城、我的),其伪代码实现如下:

driver \ .page_source.find(u"运动圈") != -1 and .page_source.find(u"发现") != -1 and .page_source.find(u"运动") != -1 and .page_source.find(u"商城") != -1 and .page_source.find(u"我的") != -1 and

page_source()的返回数据类型为str。python中,str的find(context)方法,如果str存在context返回值为context在str的index,如果不存在,则返回值为-1。因此只需要判断以上代码块返回的布尔值是True or False,就可以判断是否登录成功。

 

(3)获取到当前窗口的所有context的名称

 contexts()

 在native和html5混合页面测试时,需要在native层和H5层切换,所以首先需要得到context层级的名称

print driver.contexts >>> ['NATIVE_APP', 'WEBVIEW_com.codoon.gps']

由此可见,我们知道App的H5层名称为"WEBVIEW_com.codoon.gps"后,使用driver.switch_to.context("WEBVIEW_com.codoon.gps")就可以实现NATIVE和H5层的切换了。

 

二、获取控件类API

(1)通过元素id查找当前页面的一个目标元素

 find_element_by_id()

 通过源码注释可以得到find_element_by_id这一类的api主要有两个使用途径:

driver.find_element_by_id("com.codoon.gps:id/tv_login") // from webdriver.py

在driver下通过id查找一个元素,此用法通常适用于当前界面的driver有且仅有一个唯一的id元素标示,通过调用find_element_by_id可以准确到找到目标元素;另一种使用途径主要如下:

driver_element = driver.find_element_by_xpath("//android.widget.ListView/android.widget.LinearLayout")

 

// from webdriverelement.py

driver_element.find_element_by_id("com.codoon.gps:id/activity_active_state") 

在driver.find_element_by_xpath返回了driverElement类型,调用find_element_by_id在driverElement下的子元素以id匹配目标元素。

上图为uiautomatorviewer对id,name,class的图示说明。特别说明:若id、name、xpath等在当前driver或者driverElement查找的目标元素不是唯一元素,此时调用find_element_by_id(name\xpath)时,会返回查找匹配到的第一个元素。

 

(2)通过元素id查找当前页面的多个目标元素

 find_elements_by_id()

在driver下通过id查找多个目标元素,其返回值类型为list。此用法通常适用于当前driver下查询listView、LinearLayout、 RelativeLayout等有相同布局结构的Item;同样除了driver之外,在driverElement下页可以跳用find_elements_by_id来匹配listView、LinearLayout、 RelativeLayout。

driver.find_elements_by_id("com.codoon.gps:id/tv_name") // from webdriver.py driver.find_element_by_id("com.codoon.gps:id/webbase_btn_share") \   .find_elements_by_id("com.codoon.gps:id/ll_layout") // from driverelement.py

Tips: 带有find_elements关键字的方法函数的返回类型都是list数据类型,只有driver与driverelement的实例化有find_element(s)等一系列方法,list类型是不能用find_element(s)方法定位数据的。在实际的项目中可能会遇到这样的问题,只有遍历list,取出每一个element实例化对象再进行查找定位元素。

 

(3) 通过元素name查找当前页面的一个元素

 find_element_by_name()

使用方式与find_element_by_id相同,只是把匹配条件由id变为name。请参考find_element_by_id的调用方式

driver.find_element_by_name("foo") driver.find_element_by_id("com.codoon.gps:id/tv_name").find_element_by_name("foo") >>> return the driverElement(obj)

 

(4) 通过元素name查找当前页面的多个目标元素

 find_elements_by_name()

使用方式与find_elements_by_id相同,只是把匹配条件由id变为name。请参考find_elements_by_id的调用方式,注意其返回数据类型是List,并不是driverElement。

driver.find_elements_by_name("foo") driver.find_element_by_id("com.codoon.gps:id/tv_name").find_elements_by_name("foo") ### return the List<driverElement> >>> ['driverElement1', 'driverElement2', 'driverElement3', ....]

 

(5)通过元素xpath查找当前页面的一个目标元素

 find_element_by_xpath()

关于find_element_by_xpath的调用方法与通过id、name略有不同,有关Xpath的相关知识点在本章节暂且不表,后续在项目实践中若有需求再另起专题介绍。

driver.find_element_by_xpath("//android.widget.TextView[contains(@text, '开始')]") driver.find_element_by_xpath("//android.widget.LinearLayout/android.widget.TextView")

在Appium中,xpath所需相关的lib库并没有完全支持,所以使用方法是以上两种(即仅支持在driver下的xpath匹配)。目前的Appium版本无法支持driverelement下的xpath查找,如

driver.find_element_by_xpath("//android.widget.LinearLayout/android.widget.TextView") \ .find_element_by_xpath("//android.widget.TextView[contains(@text, '开始')]") // This is the Error!

 按上面的写法Appium就会报错,原因是“.find_element_by_xpath("//android.widget.TextView[contains(@text, '开始')]")”不能在Element下查找子元素。

 

(6) 通过元素xpath查找当前页面的多个目标元素

 find_elements_by_xpath()

 参照find_element_by_xpath的调用方式,需注意返回类型为List,用法参考find_elements_by_name()的例子

 

(7) 通过元素class name查找当前页面的的一个元素

 find_element_by_class_name()

在实际项目中,测试app中class name并不能做为界面的唯一标示定位,所以在实际中几乎没有使用class name在driver查看元素,在driverelement下查找子元素用class name才是正确的使用方式。

 

(8) 通过元素accessibility_id (content-desc)查找当前页面的一个元素

 find_element_by_accessibility_id()

在uiautomatorviewer中,content-desc内容即为accessibility_id,在selenium库里可以用find_element_by_name()来匹配content-desc的内容;在Appium库里则用find_element_by_accessibility_id()来匹配content-desc的内容。因为Appium继承了Selenium类,所以如果find_element_by_name无法准确定位时,请试试看find_element_by_accessibility_id。

   常用的获取控件类API就是以上这些。其他的查找和匹配的api还有find_element_by_link_text、find_elements_by_link_text、find_element_by_tag_name、find_elements_by_tag_name、find_element_by_css_selector、find_elements_by_css_selector等,用法都与上述类似。

 

三、元素操作类API

   我们在实现PC端浏览器Webdriver自动化时,对于网页上的目标的操作主要有:点击(click)、 双击(double_click)、滚动(scroll)、输入(send_keys),而移动端特有的辅助类api:轻击(tap)--支持多点触控,滑动(swipe),放大元素(pinch),缩小元素(zoom)

(1)点击事件 

 click()

 tap()

click和tap都能实现单击的效果。其区别在于click是作用于driverelement的实例化对象,而tap是对屏幕上的坐标位置进行点击。前者对元素的位置变化并不敏感,而后者是针对具体的像素坐标点击,受分辨率和元素位置影响较大。

 

(2)输入事件

 send_keys()

 set_text()

 send_keys和set_text也都能满足输入文本内容的操作。其区别在于send_keys会调用设备当前系统输入法键盘,而set_text直接对目标元素设置文本。由此可推,send_keys的输入内容往往和预期内容不一致,而set_text的输入则是直接赋值,并不是键盘事件。

 

(3)滑动(翻屏)事件

 swipe() 

 flick()

swipe和flick都是滑动操作,它们都是从[start_x, start_y]划到[end_x, end_y]的过程,唯一不同的是swipe比flick多了一个duration参数,有了这个参数就可以自定义从start到end动作的作用时间,以达到快速滑动或者慢速滑动的效果。

 

(4)缩放事件

 pinch()

 zoom()

默认会对目标元素进行放大一倍或者缩小一半的操作,此api方法适合于在测试运动地图的缩放时的变化。

 

(5)长按事件

 long_press()

长按方法是在TouchAction类中,所以在使用时需要先import TouchAction。在删除运动历史记录时,在记录列表长按删除,

action1 = TouchAction(self.driver) driver_element = driver.find_element_by_xpath("sport_history_item_xpath") action1.long_press(driver_element).wait(i * 1000).perform() // i为长按控件的时间,单位秒

 

(6)keyevent事件(android only)

  在Android keyevent事件中,不同的值代表了不同的含义和功能,比如手机的返回键:keyevent(4); 手机的HOME键: keyevent(3)等等,具体keyevent与对应值关系请参考http://blog.csdn.net/yun90/article/details/51036544 

 

四、元素事件类API

(1) reset

 reset()

用法:driver.reset(),重置应用(类似删除应用数据),如首次登录app时出现的引导页,则可以用reset来实现需求。

 

(2) is_app_installed

 is_app_installed()

检查app是否有安装 返回 True or False。例如:在微信登录时,选择登录方式时会判断是否已安装微信,若未安装则有dialog弹框,已安装则跳转到微信登录页面,

driver.find_element_by_id("weixin_login_button").click() if driver.is_app_installed("weixin.apk"): // To do input User, Passwd else: // show dialog

 

(3)install_app

 install_app()

接上个例子,若未安装微信出现dialog弹框,检查完dialog后再安装微信app。特别说明:例子中的"weixin.apk"是指app_path + package_name,

driver.find_element_by_id("weixin_login_button").click() if driver.is_app_installed("weixin.apk"): // To do input User, Passwd else: check_dialog() driver.install_app("weixin.apk") 

 

(4) remove_app

 remove_app()

在测试老版本兼容用例时,用老版本替换新版本时,需要卸载新版本,再安装老版本,所以需要调用到此方法,

driver.remove_app("new_app.apk") # 卸载 driver.install_app("old_app.apk") # 安装

 

(5) launch_app

 launch_app()

打开一个capabilities配置的设备应用。此方法目前并没有使用。待以后用到时再来做更新。

 

(6) close_app

 close_app()

 关闭app应用程序。此方法常用在代码末尾,在清理和释放对象时使用。结合unittest框架常见tearDown()里使用,

import unittest class demo(unittest.TestCase): def setUp(self): pass def tearDown(self): driver.close_app() driver.quit()

 

(7) start_activity

 start_activity()

此方法适用于测试中需使用两个及以上的app程序。例如,在运动相关的测试时,首先需要打开Gps模拟打点工具,开始打点。然后打开咕咚选择运动类型开始运动,那么可以在启动capabilities配置时打开Gps工具,开启配速打点后再打开咕咚app,

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps={'platformName': 'Android', 'deviceName': 'Android Mechine', 'appPackage': ' Package of GpsTools', 'unicodeKeyboard':True, 'resetKeyboard':True, 'noReset':True, 'appActivity': 'activity of GpsTools'}) # TO DO Gps Mock action driver.start_activity("com.codoon.gps", "ui.login.welcomeActivity")

  

(8) wait_activity

 wait_activity()

此方法适属于appium等待方法的一种。不论是webdriver还是appium,等待方法分为三种类型:显式等待、隐式等待,time.sleep;从wait_activity的源码可以看出,是属于隐式等待。有关等待方式以后可以另开专题详细说明,这里不做赘述。

  此方法主要使用在需要网络加载时的等待,比如在用户登录作为前提条件时,wait_activity接受三个参数: 需要等待加载的activity的名称,timeout超时时间(秒),检测间隔时间(秒),

driver.login_action() driver.wait_activity("homepage.activity", 30, 1) driver.find_element_by_id("我的").click()

其含义是,等待加载app的homepage的activity出现,等待最长时间30秒,每隔1秒检测一次当前的activity是否等于homepage的activity。若是,则推出等待,执行点击我的tab的action;若否,则继续等待,30秒后提示超时抛出异常。

 

四、其他(此类别下主要对上述没有提到的api方法的补充)

(1) 截屏

 get_screenshot_as_file()

用法:driver.get_screenshot_as_file('../screenshot/foo.png'),接受参数为保存的图片路径和名称

 

(2)size 和 location

 size()

 location()

size 和 location是对element位置和尺寸的获取,这两个属性主要运用在有可划动的控件,如完善个人资料页,生日、身高和体重都需要划动。之前我们提到的swipe和flick是针对设备屏幕进行划动,显然在这里不适用。而且没有一个特定的方法,所以需要我们自己针对可划动控件进行划动,

 swipe_control()

 

(3)获取控件各种属性

 View Code

用法: driver.find_element_by_id().get_attribute(name),name即是左侧的标志(class,package,checkable,checked....),返回值为str类型,即便是true or false,但是其实是"true" or "false"

 

 

(4)pull_file

 pull_file()

将设备上的文件pull到本地硬盘上,在手机号注册时需要获取手机验证码,此时的实现方式是用另一个apk提取到验证码存在手机内存中,再用pull_file获取到验证码内容,使得appium可以将正确的验证码填入。

 

 

 

最新回复(0)