• Appium定位


    定位方式

    id定位

    resource-id代表id属性,使用方法:

    self.driver.find_element(MobileBy.ID, "current_price")
    # 不需要写全称,如这样 self.driver.find_element(MobileBy.ID, "com.xueqiu.android:id/current_price")
    

    class定位

    不推荐,因为几乎整个屏幕的控件都是一样的class。
    看到下面的图片中,不同控件的class都是android.widget.TextView


    Accessibility ID定位

    找到元素的content-desc属性来定位。

            driver.findElement(By.name("7")).click()
            driver.findElementByAccessibilityId("divide").click()
            driver.findElement(By.name("2")).click()
            driver.findElementByAccessibilityId("equals").click()  # Accessibility ID定位
    

    xpath定位

    appium中没css定位,使用xpath定位较多。使用xpath相对定位,不使用绝对定位

    xpath定位基础知识:

    • 通过元素本身的唯一属性定位
      方法:找到目标元素所在的”精准元素“即唯一标识属性,使用此属性定位
      通过id属性定位

    • 通过上一级目录的唯一属性定位
      方法:目标元素没有唯一属性,则去找到与目标元素相近的上级目录中”唯一元素“作为起始位置,然后根据此相对位置逐层往子目录编写到目标位置

    • xpath做布尔逻辑运算



      例子:self.driver.find_element(MobileBy.XPATH, "//*[@text='热门' and @resource-id='com.xueqiu.android:id/title_text']")
      注意:resource-id要写全称

    • 目录元素存在层级关系
      1.定位上一层再定位目标元素
      例如:需要定位“热门”,先定位其上层再定位“热门”



      先定位上层表达式://*[contains(@resource-id,'title_container')]
      2.根据共同的父元素定位



      如上,需要获取到阿里巴巴香港上市的股价,先根据09988定位到共同的父元素,在定位价格275.6








      以上是通过层层定位,找到共同的上层://*[contains(@resource-id,'stockCode') and @text='09988'] /../../..
      下面通过resource-id找到价格



      表达式如下:
      //*[contains(@resource-id,'stockCode') and @text='09988'] /../../..//*[contains(@resource-id,'current_price')]

    • 模糊定位
      contains 方法(包含)


      定位表达式://*[@text='热门' and contains(@resource-id,'title_text') ]

    关于xpath定位的总结:首先有单一属性能够定位元素,优先使用单一元素定位;其次,如果单一元素无法定位,尝试使用逻辑运算组合定位;最后,考虑使用层级定位。多使用contains模糊定位可以缩短表达式。
    参考文章:https://blog.csdn.net/hou_angela/article/details/80305828

    使用AndroidAutomator定位

    description就是content-desc属性。

    driver.findElementByAndroidUIAutomator("new UiSelector().text("9")").click()
    driver.findElementByAndroidUIAutomator("new UiSelector().description("plus")").click()
    driver.findElementByAndroidUIAutomator("new UiSelector().resourceId("com.android.calculator2:id/digit6")").click()
    driver.findElementByAndroidUIAutomator("new UiSelector().description("equals")").click()
    

    AndroidAutomator定位只适用于android,其没有空间关系,通过众多条件精准定位到元素,定位速度快,但是表达式可能会很复杂,很少使用。

    比较实用的一点是滑动到指定文本,如下:

    def test_toast(self):
            self.driver.find_element(By.XPATH,"//*[@text='Views']").click()
            # 滚动查找,直到查找到Popup Menu点击
            scroll_to_element = (
                MobileBy.ANDROID_UIAUTOMATOR,
                'new UiScrollable('
                    'new UiSelector().scrollable(true).instance(0))'
                    '.scrollIntoView('
                        'new UiSelector().text("Popup Menu").instance(0));')
            self.driver.find_element(*scroll_to_element).click()
            # 页面上看到文本是“AKE A POPUP!”,直接使用此文本查找报错,通过uiautomatorviewer可以看到是"Make a Popup!"
            # self.driver.find_element(By.XPATH, "//*[@text='MAKE A POPUP!']").click()
            self.driver.find_element(MobileBy.ACCESSIBILITY_ID, "Make a Popup!").click()  # ACCESSIBILITY_ID是定位resource-id
            self.driver.find_element(By.XPATH, "//*[@text='Search']").click()
            # toast定位
            toast=self.driver.find_element(By.XPATH, "//*[@class='android.widget.Toast']").text
            assert "Search" in toast
            assert "Clicked" in toast
    

    定位工具

    Appium desktop定位

    每次定位都需要先执行脚本,到达定位控件的上下文。desktop定位的好处是可以马上验证表达式是否正确
    可参考:https://www.cnblogs.com/Uni-Hoang/p/13734384.html

    • 进行配置

    • 刷新页面

    • 选择定位方式

    • 查找元素

    • 验证

    uiautomatorviewer

    uiautomatorviewer是android SDK自带的工具,只适用与android定位。通过截屏并分析XML布局文件的方式,为用户提供控件信息查看服务。该工具位于SDK目录下的toolsin子目录下。可以看到,它是通过bat文件启动的。

    • 首先要安装SDK,可以在Android Studio下安装SDK,也可以单独安装SDK
      安装后所在目录

    • 将所在目录配置到PATH环境变量中:E:softwareAndroidSDK oolsin
      直接启动

      配置path环境变量后


    • 界面介绍
      整个界面分四个区域:
      (1)工作栏区(上)
      共有4个按钮。从左至右分别用于:打开已保存的布局,获取详细布局,获取简洁布局,保存布局。点击保存,将存储两个文件,一个是图片文件,一个是.uix文件(XML布局结构)
      第二按钮(Device Screenshoot uiautomator dump)与第三按钮(Device Screenshoot with Compressed Hierarchy uiautomator dump –compressed)的区别在于,第二按钮把全部布局呈现出来,而第三按钮只呈现有用的控件布局。比如某一 Frame存在,但只有装饰功能,那么点击第三按钮时,可能不被呈现。
      (2)截图区(左),显示当前屏幕显示的布局图片
      (3)布局区(右上),已XML树的形式,显示控件布局
      (4)控件属性区(右下),当点击某一控件时,将显示控件属性

    • 进行定位

      图中使用ID定位

    def test_getPrice(self):
            self.driver.find_element(MobileBy.ID,"tv_search").click()     # MobileBy继承By
            self.driver.find_element(MobileBy.ID,"search_input_text").send_keys("阿里巴巴")
            self.driver.find_element(MobileBy.ID,"name").click()  # 第一张图片定位
            # 获取价格,转换为float类型进行断言
            assert float(self.driver.find_element(MobileBy.ID, "current_price").text) > 250  # 第二张图片定位
    

    uiautomatorviewer定位遇到的问题

    • Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't exist!
      原来好好的,但是不知道怎么就出现这个。

      在网上找了很多解决办法,可以试试:
      1、在cmd命令窗口中输入 adb root 即可
      2、重启手机无效
      3、重新把手机拔了再插
      4、重启appuim
      5、重启uiautomatorviewer.bat(尝试了没用)
      6、打开手机开发者权限,将USB调试按钮重新启动就好了
      7、重启模拟器(我使用木木模拟器,重启后可以重新识别)
      大家可以试试看看哪种方式适合自己。

    • 无法连接adb

      参考:https://www.jianshu.com/p/2105174c68b3

    • 弹窗处理

    • 运行报错

      uiautomatorviewer跟appium server不能同时使用,这时需要先停止appium server

  • 相关阅读:
    使用transfor让图片旋转
    block与inline,inline和inline-block,块级和行内元素,行内替换和行内非替换元素
    使用classList来实现两个按钮样式的切换
    关于css透明度的问题
    级动(两级联动)思路分享
    js图片预览(一张图片预览)
    js关于密码框强弱度的提示
    javascript对象与实例
    javascript 逻辑运算符
    Raphael画圆弧
  • 原文地址:https://www.cnblogs.com/Uni-Hoang/p/13761925.html
Copyright © 2020-2023  润新知