• Appium-desktop 元素定位


    1、打开 appium-desktop ,点击 start session

    2、打开后,点击屏幕右上角的搜索按钮

     3、然后会打开配置页面,在本地服务配置信息同上面写的代码链接配置。填入正确的信息后,点击 startSession

    {
    "platformName": "Android",   # 手机系统
    "deviceName": "127.0.0.1:62001",  # 设备名称,在 dos 输入 adb devices 获取
    "platformVersion": "5.1.1",   # 手机系统版本
    "appPackage": "com.yw.yzz",   # 包名(在 dos 下进入 xxx.apk 所存在的文件夹中,输入 aapt dump badging xxx.apk 获取)
    "appActivity": "com.yw.yzz.biz.splash.SplashActivity",  # APP 活动(在dos 下进入 xxx.apk 所存在的文件夹中,输入 aapt dump badging xxx.apk 获取)
    "unicodeKeyboard": "True",  # 使用 appium 的输入法,支持中文并隐藏键盘
    "resetKeyboard": "True",   # 将输入法重置回设备默认的输入法
    "noReset": "True"  # appium 启动 app 时会自动清除 app 里面的数据,noReset=True 就是启动 app 不清除数据
    }

    • 成功启动模拟器中的程序。如下图。此时如果模拟器和 appium-desktop 中界面不同,可点击刷新按钮同步下。

    4、定位方式

    • id 定位,如下
      • 点击定位元素按钮,点击左侧 app 界面中的我的定位元素后,就会出现 selected element 界面

      • 此时,右侧栏中可以看到,有个 id,下拉滚动条会发现还有个 resource-id。会发现他们两个是一样的。这就是说明,这个 id 是唯一的,登录按钮被唯一定位到,代码中就可以通过 id 直接定位
    dr.find_element_by_id('com.yw.yzz:id/seting_tab').click()
    • xpath 定位

      • 用定位元素按钮定位某个元素后,右侧 selected element 栏目中找到 xpath,复制其对应的内容。通过 xpath 方法就可以定位  
    dr.find_element_by_xpath('/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.FrameLayout[4]/android.widget.RadioButton').click()
      • 还或者如下通其他属性进行编写  
    dr.find_element_by_xpath('//android.widget.RadioButton[@id="com.yw.yzz:id/seting_tab"]').click()
    • 提示信息进行定位,也就是 content-desc
      • 先用定位元素按钮定位某个元素后,右侧 selected element 栏目中,找到 content-desc,复制 content-desc 的值后。通过 find_element_by_accessibility_id(),将对应的值作为参数传入

    dr.find_element_by_accessibility_id('content-desc').send_keys("1777982xxxx")
    •  AndroidUiautomator 定位
      •  这个在运行时,调用的是 Android 自带的 UI 框架 UiAutomator 的 Api。格式固定,介绍几个常用的格式如下

    # text 内容
    dr.find_element_by_android_uiautomator('new UiSelector().text("QQ号/手机号/邮箱")').send_keys("1777982xxxx")
    # 包含 text 文字
    dr.find_element_by_android_uiautomator('new UiSelector().textContains("手机号")').send_keys("1777982xxxx")
    # 以 text 什么开始
    dr.find_element_by_android_uiautomator('new UiSelector().textStartsWith("QQ号")').send_keys("1777982xxxx")
    # 正则匹配 text
    dr.find_element_by_android_uiautomator('new UiSelector().textMatches("^QQ号/手机号.*")').send_keys("1777982xxxx")
    dr.find_element_by_android_uiautomator('new UiSelector().textMatches(".*手机号.*")').send_keys("1777982xxxx")

    # resource-id、resourceIdMatches
    dr.find_element_by_android_uiautomator('new UiSelector().resourceId("com.tencent.mobileqq:id/login")').click()

    # description(Content-desc 的属性的值为 desc)
    dr.find_element_by_android_uiautomator('new UiSelector().description("请输入QQ号码或手机或邮箱")').send_keys("1777982xxxx")
    # descriptionStartsWith(以 content-desc 的属性值 desc 开始)
    dr.find_element_by_android_uiautomator('new UiSelector().descriptionStartsWith("请输入QQ号码")').send_keys("1777982xxxx")
    # descriptionMatches(content-desc 中包含 desc)
    dr.find_element_by_android_uiautomator('new UiSelector().descriptionMatches(".*或邮箱$")').send_keys("1777982xxxx")
    dr.find_element_by_android_uiautomator('new UiSelector().descriptionMatches(".*QQ号码或手机.*")').send_keys("1777982xxxx")
    •  find_elements_by_xxx() 用法
    dr.find_elements_by_class_name("android.widget.EditText")
    dr.find_elements_by_id("com.tencent.mobileqq:id/btn_login")
    # className
    dr.find_elements_by_android_uiautomator('new UiSelector().className("android.widget.TextView")')
    # classNameMatches
    dr.find_elements_by_android_uiautomator('new UiSelector().classNameMatches("^android.widget.*")'
    •  tap() 坐标定位点击操作

    tap(self, positions, duration=None):
        :Args:
        - positions - list类型,里面对象是元组,最多五个。如:[(100, 20), (100, 60)]
        - duration - 持续时间,单位毫秒,如:500
    # coding:utf-8
    from appium import webdriver
    from time import sleep
    desired_caps = {
                    'platformName': 'Android',
                    'deviceName': '127.0.0.1:62001',
                    'platformVersion': '4.4.2',
                    'appPackage': 'com.baidu.yuedu',
                    'appActivity': 'com.baidu.yuedu.splash.SplashActivity'
                    }
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    
    sleep(5)
    # 点弹出框去看看
    driver.tap([(810, 1776), (1080, 1905)], 500)
    
    # 返回上一页
    driver.back()
    sleep(2)

     5、通过不同的定位方式查找元素 

    • 我们也可以通过 appium-desktop 的 search for element 功能。通过定位方式和对应的值来查找元素,从而验证定位方式和值的正确性

    • 可以看到定位方式就是我们第 4 种说的集中定位方式。选择一个定位方式,填入对应的值,点击 search

    • 选中找到的元素,可以看到左侧对应手机界面中的元素被选中。从而也证明我们的这种定位方式和对应的值都是没问题的。可以定位到元素的。
    • 如果是按钮,就点击  tap element,相当于代码中的 click()
    • 如果是输入框,就在 "enter keys" 中输入内容,然后点击 sendkeys 就可以往已选的元素中输入内容,相当于代码中的 send_keys() 

    6、录制

    • 点击小眼睛图标的录制按钮,可以看到界面展现出来代码模块。可以选择录制语言 --> python 或其他

    • 然后和右侧 selected element 栏目中的 tap、send keys、clear 或者 search for element 结合操作,根据 search for element 找到元素定位i,并 tap 或者 sendkeys 等操作。这些操作都会被录制下来并生成 python 代码。可直接使用

    7、实例

    from appium import webdriver
    from time import sleep
    
    caps = {
      "platformName": "Android",
      "deviceName": "127.0.0.1:62001",
      "platformVersion": "5.1.1",
      "appPackage": "com.baidu.yuedu",
      "appActivity": "com.baidu.yuedu.splash.SplashActivity",
      "unicodeKeyboard": "True",
      "resetKeyboard": "True",
      "noReset": "True"
    }
    driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",caps)
    sleep(5)
    
    # 定位取消升级按钮
    driver.find_element_by_xpath('//android.widget.TextView[@text="取消"]').click()
    sleep(2)
    # 定位搜索按钮
    # driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.baidu.yuedu:id/tab_search")').click()
    # driver.tap([(970,86),(1042,125)],500)
    driver.find_element_by_id("com.baidu.yuedu:id/tab_search").click()
  • 相关阅读:
    高效并发服务器模型
    Linux下Wiki服务器的搭建
    Wiki程序PmWiki的安装和汉化
    Linux 套接字编程中的 5 个隐患
    IOCP简介
    IP协议详解之IP地址要领
    IP协议详解之配套协议:ARP, ICMP
    超级详细Tcpdump 的用法
    如何测试主机的MTU多大?
    Linux下Socket编程的端口问题( Bind error: Address already in use )
  • 原文地址:https://www.cnblogs.com/ZhengYing0813/p/12028436.html
Copyright © 2020-2023  润新知