appium 常用api介绍(2)

本文详细介绍Appium自动化测试工具的基本用法,包括如何通过不同属性定位元素、模拟输入及手势操作等,帮助读者快速掌握Appium的核心功能。

 

1.send_keys

 send_keys(self, *value):

 Simulates typing into the element在元素中模拟输入(开启appium自带的输入法并配置了appium输入法后,可以输入中英文)】

 :Args:

      - value - A string for typing, or setting form fields. For setting file inputs, this could be a local file path.

      Use this to send simple key events or to fill out form fields::

      form_textfield = driver.find_element_by_name('username')

      form_textfield.send_keys("admin") This can also be used to set file inputs.

  ::

      file_input = driver.find_element_by_name('profilePic')

      file_input.send_keys("path/to/profilepic.gif")

      # Generally it's better to wrap the file path in one of the methods

      # in os.path to return the actual path to support cross OS testing.

      # file_input.send_keys(os.path.abspath("path/to/profilepic.gif"))

  用法:driver.element.send_keys(“中英”)

 send_keys方法需要在配置Capabilities信息时打开模拟键盘unicodeKeyboard与resetKeyboard,如下面代码举例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from appium import webdriver
import time
desired_caps = {
                'platformName' : 'Android' ,
                'deviceName' : '76P4C15813005463' ,
                'platformVersion' : '5.1' ,
                #测试apk包名
                'appPackage' : 'com.huawei.android.launcher' ,
                #测试apk的launcherActivity
                'appActivity' : '.Launcher' ,
                #打开模拟键盘                       
                'unicodeKeyboard' : True ,
                'resetKeyboard' : True ,
                }
#进入android系统launcher
driver = webdriver.Remote( 'http://127.0.0.1:4723/wd/hub' ,desired_caps)
time.sleep( 5 )
#进入应用市场
driver.find_element_by_xpath( "//android.widget.TextView[contains(@text,'应用市场)]" ).click()
#使用模拟键盘输入'今日头条'    
driver.find_element_by_id( 'com.huawei.appmarket:id/search_edit_text_view' ).send_keys(u "今日头条" )
driver.find_element_by_id( 'com.huawei.appmarket:id/search_icon_view' ).click()
time.sleep( 5 )
driver.quit()

 

2.find_element_by_id

 find_element_by_id(self, id_):

 Finds element within this element's children by ID(通过元素的ID定位元素)

 :Args: - id_ - ID of child element to locate.

 用法 driver. find_element_by_id(“id”)

 find_element_by_id方法,是对于那些有id而且可以互相区分的控件的操作使用,一般通过android sdk 的tools路径下的uiautomatorviewer.bat自带工具来获取,

 使用这个工具首先要确保前面环境配置ok,然后确定测试机器或android模拟器处于连接状态(cmd上输入adb devices),下面是使用uiautomatorviewer.bat工具

 获取id的步骤:

 (1)在android-sdk\tools路径下找到uiautomatorviewer.bat工具,双击uiautomatorviewer.bat打开,如下图

 

 (2)获取id,如下图所示,右边Node Detail的红色框内resource-id就是左边天气应用的id

 

 代码举例:

?
1
2
#点击天气应用
driver.find_element_by_id( 'com.huawei.android.totemweather:id/mulan_widget_currentweather_smallicon' ).click()

 

3.find_element_by_xpath

 find_element_by_xpath(self, xpath):

 Finds element by xpath通过Xpath定位元素,详细方法可参阅http://www.w3school.com.cn/xpath/ )

 :Args:

     xpath - xpath of element to locate. "//input[@class='myelement']"

     Note: The base path will be relative to this element's location.

     This will select the first link under this element.

 ::

     myelement.find_elements_by_xpath(".//a")

     However, this will select the first link on the page.

 ::

     myelement.find_elements_by_xpath("//a")

 用法 find_element_by_xpath(“//*”)

 find_element_by_xpath方法也需要使用uiautomatorviewer.bat工具来定位控件,如下图所示右边相机控件id为空,这时就需要使用xpath来定位元素了,

 我们可以使用xpath用text和index来定位元素,如下图的就可以这样定位相机:

 driver.find_element_by_xpath("//android.widget.TextView[contains(@text,'相机')]")

 driver.find_element_by_xpath("//android.widget.TextView[contains(@index,8)]")

 

 如下图的图库那个控件index和天气温度控件是相同的,都是index=7,就只能用text或text与index结合了,如:

 driver.find_element_by_xpath("//android.widget.TextView[contains(@text,'图库')]")

 driver.find_element_by_xpath("//android.widget.TextView[contains(@text,'图库')and@index='7']")

 

 上面的代码就可以这样写

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# -*-coding=utf-8 -*-
 
from appium import webdriver
import time
desired_caps = {
                'platformName' : 'Android' ,
                'deviceName' : '76P4C15813005463' ,
                'platformVersion' : '5.1' ,
                #测试apk包名
                'appPackage' : 'com.huawei.android.launcher' ,
                 #测试apk的launcherActivity
                'appActivity' : '.Launcher' ,
                }
#进入android系统launcher
driver = webdriver.Remote( 'http://127.0.0.1:4723/wd/hub' ,desired_caps)
time.sleep( 5 )
#从launcher主界面进入相机应用并退出的两种方法
driver.keyevent( '3' )
#xpath使用text定位控件
driver.find_element_by_xpath( "//android.widget.TextView[contains(@text,'相机')]" ).click()
time.sleep( 2 )
driver.keyevent( '3' )
time.sleep( 2 )
#xpath使用index定位控件
driver.find_element_by_xpath( "//android.widget.TextView[contains(@index,8)]" ).click()
time.sleep( 2 )
driver.keyevent( '3' )
time.sleep( 2 )
 
#从launcher主界面进入图库应用并退出的两种方法
#xpath使用text定位控件
driver.find_element_by_xpath(" / / android.widget.TextView[contains(@text, '图库' ).click()
time.sleep( 2 )
driver.keyevent( '3' )
time.sleep( 2 )
#xpath使用text与index一起定位控件
driver.find_element_by_xpath( "//android.widget.TextView[contains(@text,'图库')and@index='7']" ).click()
time.sleep( 5 )
driver.keyevent( '3' )
time.sleep( 2 )
 
driver.quit()

 

4. ind_element_by_name

 find_element_by_name(self, name):

 Finds element within this element's children by name【通过元素Name定位(元素的名称属性text)】

  :Args: - name - name property of the element to find.

  用法: driver.find_element_by_name(“name”)

 find_elements_by_name方法的控件元素也需要使用uiautomatorviewer.bat工具来定位,如上面例子中带有text信息的控件就可以直接使用,如

 driver.find_element_by_xpath("//android.widget.TextView[contains(@text,'相机')]")

 driver.find_element_by_xpath("//android.widget.TextView[contains(@index,8)]")

 可以使用

 driver.find_element_by_name('相机')

 

 脚本如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from appium import webdriver
import time
desired_caps = {
                'platformName' : 'Android' ,
                'deviceName' : '76P4C15813005463' ,
                'platformVersion' : '5.1' ,
                #测试apk包名
                'appPackage' : 'com.huawei.android.launcher' ,
                #测试apk的launcherActivity
                 'appActivity' : '.Launcher' ,
                }
#进入android系统launcher
driver = webdriver.Remote( 'http://localhost:4723/wd/hub' ,desired_caps)
time.sleep( 5 )
 
#name方法进入相机应用
time.sleep( 2 )
driver.find_element_by_name( "相机" ).click()
time.sleep( 5 )
 
driver.quit()

 

5. find_element_by_class_name

 find_element_by_class_name(self, name):

 Finds element within this element's children by class name(通过元素class name属性定位元素

 :Args: - name - class name to search for.

 用法 driver. find_element_by_class_name(“android.widget.LinearLayout”)

find_element_by_class_name方法其实很不实用,一般控件的class基本相同,如下图上面的应用控件class都是android.widget.TextView,所以不好区分元素。

 

 

6.tap

 tap(self, positions, duration=None):

 Taps on an particular place with up to five fingers, holding for a certain time 【模拟手指点击(最多五个手指),可设置按住时间长度(毫秒)】

 :Args:

         - positions - an array of tuples representing the x/y coordinates of the fingers to tap. Length can be up to five.

         - duration - (optional) length of time to tap, in ms

  :Usage: driver.tap([(100, 20), (100, 60), (100, 100)], 500)

  用法 driver.tap([(x,y),(x1,y1)],500)

 当控件无法获取时,那我们就可以使用坐标用tap方法做点击操作,而且tap方法可以用于多点点击。

?
1
driver.tap([( 300 , 500 )], 10 )

  

7.zoom

 zoom(self, element=None, percent=200, steps=50):

 Zooms in on an element a certain amount (在元素上执行放大操作)

 :Args:

          - element - the element to zoom

          - percent - (optional) amount to zoom. Defaults to 200%  

          - steps - (optional) number of steps in the zoom action

 :Usage: driver.zoom(element)

 用法 driver.zoom(element)

 zoom方法用来模拟手机上的放大操作,主要是要确定element,具体例子和下面pinch方法一起讲。

?
1
2
el = driver.find_element_by_class_name( 'android.widget.RelativeLayout' )
driver.zoom(el, 150 , 30 )    #percent参数和steps可以不写,不写保持默认数值

 

8.pinch

 pinch(self, element=None, percent=200, steps=50):

 Pinch on an element a certain amount 在元素上执行模拟双指捏(缩小操作)

  :Args:

            - element - the element to pinch

            - percent - (optional) amount to pinch. Defaults to 200%

            - steps - (optional) number of steps in the pinch action

  :Usage: driver.pinch(element)

 用法 driver.pinch(element)

 pinch方法用来模拟手机上的缩小操作,主要是要确定element,下面举例进入图库查看图片时放大和缩小图片,使用uiautomatorviewer.bat工具来定位元素。

 (1)进入图库,如下图所示,图库控件text是唯一的,所以我们采用by_name方法获取元素。

  driver.find_element_by_name('图库')

 

 (2)选择图库的一个文件夹,如下图所示,选择杂志锁屏,由于该元素text也是唯一的,所以使用by_name方法获取控件元素。

   driver.find_element_by_name('杂志锁屏')

 

  (3)选择一张图片,所下图所示,下面图片是一个整的布局,没有单独分开的控件元素,所以我们只能选择使用tap方法点击屏幕。

   driver.tap([(300,500)],50)

 

 (4)放大和缩小图片,如下图所示,整个图片是一个布局,而且只有class信息,由于放大和缩小需要获得element,所以我们使用class_name的

  方法获取整个布局作为元素。

  el=driver.find_element_by_class_name('android.widget.RelativeLayout')

  driver.zoom(el)

  driver.pinch(el,200,50)

 

  上面操作的具体脚本如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from appium import webdriver
import time
desired_caps = {
                'platformName' : 'Android' ,
                'deviceName' : '76P4C15813005463' ,
                'platformVersion' : '5.1' ,
                #测试apk包名
                'appPackage' : 'com.huawei.android.launcher' ,
                #测试apk的launcherActivity
                'appActivity' : '.Launcher' ,
                }
#进入android系统launcher
driver = webdriver.Remote( 'http://127.0.0.1:4723/wd/hub' ,desired_caps)
time.sleep( 5 )
#进入图库
driver.find_element_by_name( '图库' ).click()
driver.find_element_by_name( '杂志锁屏' ).click()
driver.tap([( 300 , 500 )], 50 )
time.sleep( 1 )
el = driver.find_element_by_class_name( 'android.widget.RelativeLayout' )
#放大图片
driver.zoom(el)
time.sleep( 5 )
#缩小图片
driver.pinch(el, 200 , 50 )
time.sleep( 5 )
driver.quit()

 

Appium 是一个开源的自动化测试工具,广泛用于移动应用的自动化测试。它提供了丰富的 API 方法来支持不同场景下的测试需求。以下是一些 Appium常用API 方法及其用途。 ### 启动与关闭应用 1. **启动特定应用** 使用 `start_activity` 方法可以在测试过程中启动特定的 Android 应用。该方法需要传入应用的包名和启动名。 ```python driver.start_activity("com.example.app", ".MainActivity") ``` 这个方法特别适用于需要跨应用操作的场景,例如在测试过程中切换到另一个应用执行某些操作[^3]。 2. **关闭当前应用** 使用 `close_app` 方法可以关闭当前正在运行的应用。该方法仅影响当前的应用实例。 ```python driver.close_app() ``` 3. **关闭驱动对象** 使用 `quit` 方法可以关闭由 `driver` 对象启动的所有应用,并释放相关资源。 ```python driver.quit() ``` 与 `close_app` 不同,`quit` 会关闭所有由 `driver` 启动的应用,而不仅仅是当前应用[^1]。 ### 元素定位 1. **通过 ID 定位元素** `find_element_by_id` 方法用于查找具有特定 ID 的控件。这种方法适用于那些可以通过 ID 唯一标识的控件。通常,可以通过 Android SDK 的 `uiautomatorviewer` 工具来获取控件的 ID。 ```python element = driver.find_element_by_id("com.example.app:id/button1") ``` 2. **通过 XPath 定位元素** `find_element_by_xpath` 方法允许通过 XPath 表达式来定位元素。XPath 提供了更灵活的定位方式,尤其适用于没有唯一 ID 的控件。 ```python element = driver.find_element_by_xpath("//android.widget.Button[@text='Click Me']") ``` 3. **通过类名定位元素** `find_element_by_class_name` 方法用于查找具有特定类名的控件。这种方法适用于多个相同类型的控件中选择一个。 ```python element = driver.find_element_by_class_name("android.widget.Button") ``` 4. **通过名称定位元素** `find_element_by_name` 方法用于查找具有特定名称的控件。名称通常是控件的文本内容或资源 ID。 ```python element = driver.find_element_by_name("Submit") ``` ### 等待方法 1. **隐式等待** 隐式等待是指在查找元素时设置一个最长等待时间,如果在规定时间内找到元素,则立即继续执行;否则会抛出异常。 ```python driver.implicitly_wait(10) # 等待最多10秒 ``` 2. **显式等待** 显式等待是指等待某个条件成立后再继续执行。这种方式更为灵活,可以根据具体的业务逻辑进行等待。 ```python from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) element = wait.until(EC.element_to_be_clickable((By.ID, "com.example.app:id/button1"))) ``` 3. **强制等待** 使用 `time.sleep` 可以实现强制等待,即无论元素是否出现,都会按照指定的时间进行等待。虽然简单易用,但不推荐在实际测试中频繁使用,因为它会影响测试效率。 ```python import time time.sleep(5) # 等待5秒 ``` ### 其他常用方法 1. **滑动屏幕** 使用 `swipe` 方法可以模拟用户的滑动操作。该方法需要传入起始坐标、结束坐标以及滑动持续时间。 ```python driver.swipe(start_x=100, start_y=800, end_x=100, end_y=200, duration=1000) ``` 2. **点击屏幕** 使用 `tap` 方法可以模拟用户的点击操作。该方法需要传入一个包含坐标和点击次数的列表。 ```python driver.tap([(100, 800)], 100) ``` 3. **获取当前应用信息** 使用 `current_package` 和 `current_activity` 方法可以获取当前正在运行的应用的包名和启动名。 ```python current_package = driver.current_package current_activity = driver.current_activity ``` 4. **切换上下文** 使用 `context` 和 `contexts` 方法可以在不同的上下文之间进行切换,例如从原生应用切换到 WebView。 ```python current_context = driver.context all_contexts = driver.contexts driver.switch_to.context(all_contexts[1]) ``` 5. **处理通知栏** 使用 `open_notifications` 方法可以打开设备的通知栏,以便测试通知相关的功能。 ```python driver.open_notifications() ``` 6. **获取屏幕截图** 使用 `get_screenshot_as_file` 方法可以将当前屏幕截图保存为文件,便于后续分析。 ```python driver.get_screenshot_as_file("screenshot.png") ``` 这些 API 方法涵盖了 Appium 中常见的操作,包括启动和关闭应用、元素定位、等待方法以及其他实用功能。根据不同的测试需求,可以选择合适的方法来实现自动化测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值