app自动化测试——常见控件交互方法

在这里插入图片描述


一、元素的常用方法

点击:element.click()
输入操作:element.send_keys(‘python’)
设置元素的值:element.set_value(‘java’)
清除操作:element.clear()
是否可见:element.is_displayed(),返回True或者False
是否可用:element.is_enabled(),返回True或者False
是否被选中:element.is_selected(),返回True或者False
获取属性值:get_attribute(name)

get_attribute() 可以获取的属性

resource-id/resourceld 返回 resource-id(API=>18 支持)
text 返回 text
class 返回 class(API=>18 支持)
content-desc/contentDescription 返回 content-desc 属性
checkable,checked,clickable,enabled,focusable,focused,{long-clickable,longClickable), package, password,scrollable,selection-start,selection-end,selected,bounds,displayed,contentSize 返回 true or false

二、元素的常用属性

获取元素文本:element.text
获取元素坐标:element.location,结果{‘y’:19,‘x’:66}
获取元素尺寸:element.size,结果:{’width‘:500,’height‘:33}

三、示例

打开 demo.apk
点击 Animation 进入下个页面
点击 Seeking 进入下个页面
查看【RUN】按钮是否显示/是否可点击
查看【滑动条】是否显示/是否可用/是否可点击
获取【滑动条】长度
点击【滑动条】中心位置

import time

from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions

class TestSleep:
    def setup(self):
        # 创建一个字典,desirecapility
        caps = {
    
    }
        # 系统
        caps["platformName"] = "Android"
        # 设备名称
        caps["deviceName"] = "ApiDemos"
        # 包安卓包名和页面名;获取
        # windows:adb logcat ActivityManager:I | findstr "cmp"
        caps["appPackage"] = "io.appium.android.apis"
        caps["appActivity"] = ".ApiDemos"
        # todo 保留登录信息
        caps["noReset"] = "true"

        caps["ensureWebviewsHavePages"] = True
        # 创建driver,与appium server建立连接,返回一个session
        # todo driver变成self.driver由局部变量变成实例变量,然后就可以在其他的方法中引用这个变量了
        self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
        self.driver.implicitly_wait(5)

    def teardown(self):
        pass

    def test_seeking(self):
        '''
        打开demo.apk
        1、点击Animation进入下一个页面
        2.点击Seeking 进入下个页面
        3、查看[RUN]按钮是否显示/是否可点击
        4、查看[滑动条]是否显示/是否可用/是否可点击
        5、获取[滑动条]长度
        6、点击[滑动条]中心位置
        :return:
        '''
        self.driver.find_element(AppiumBy.ACCESSIBILITY_ID,"Animation").click()
        self.driver.find_element(AppiumBy.ACCESSIBILITY_ID,"Seeking").click()
        run_element=self.driver.find_element(AppiumBy.ACCESSIBILITY_ID,"Run")
        run_is_displayed=run_element.is_displayed()
        run_is_clickable=run_element.get_attribute("clickable")
        print(f"[run]按钮是否可见:{
      
      run_is_displayed}")
        print(f"[run]按钮是否可点击:{
      
      run_is_clickable}")
        #4、查看[滑动条]是否显示/是否可用/是否可点击
        seekbar_element=self.driver.find_element(AppiumBy.ID,"io.appium.android.apis:id/seekBar")
        seekbar_displayed=seekbar_element.is_displayed()
        seekbar_enabled=seekbar_element.is_enabled()
        seekbar_clickable=seekbar_element.get_attribute("clickable")
        print(f"[滑动条]按钮是否可见:{
      
      seekbar_displayed}")
        print(f"[滑动条]按钮是否可用:{
      
      seekbar_enabled}")
        print(f"[滑动条]按钮是否可点击:{
      
      seekbar_clickable}")

        #5、获取[滑动条]长度
        seekbar_size=seekbar_element.size
        width=seekbar_size.get("width")
        height=seekbar_size.get("height")
        print(f"seekbar的长为{
      
      width}")

        seekbar_location=seekbar_element.location
        x=seekbar_location.get("x")
        y=seekbar_location.get("y")
        #6、点击[滑动条] 中心位置
        seekbar_centerx=x+width/2
        seekbar_centery=y

        self.driver.tap([(seekbar_centerx,seekbar_centery)])
        time.sleep(5)

三、面试题:元素定位不到是什么原因?

定位不正确:在定位工具中先测试定位表达式是否正确
存在动态 ID:定位方式使用 css 或者 xpath 的相对定位
页面还没有加载完成:添加死等验证,使用显示等待或隐式等待进行优化
页面有 iframe:切换到 iframe 后定位
页面切换 window :切换到对应窗口后定位
要定位元素为隐藏元素:使用 js 操作该元素
定位的元素被遮挡:将遮挡的元素添加到黑名单中

四、使用等待机制的场景

场景:
控件动态出现
控件出现特定特征

解决:
元素定位结合隐式等待与显式等待

五、App toast 提示框定位

场景:
app toast 提示框
解决:
使用 driver.page_source 拿到页面布局结构文件,分析 toast/弹框组件的标签内容,
然后通过 id/text/class 等属性,使用 xpath 完成元素定位
结合 隐式等待

六、下拉框/日期控件定位

场景:
<input>标签组合的下拉框无法定位
<input>标签组合的日期控件无法定位
解决:
面对这些元素,我们可以引入 JS 注入技术来解决问题。

七、文件上传定位

场景:
input 标签文件上传
解决:
input 标签直接使用 send_keys()方法

猜你喜欢

转载自blog.csdn.net/YZL40514131/article/details/129636927