以最右App为例

.apk文件网盘地址:

链接:https://pan.baidu.com/s/1L4MYkhpb5ECe8XeaneTx_Q

提取码:0jqm

1.find_element_by_id / find_elements_by_id

  1. # -*- coding:utf-8 -*-
  2. # 作者:IT小学生蔡坨坨
  3. # 时间:2020/12/18 22:00
  4. import os
  5. import unittest
  6. import time
  7. from appium import webdriver
  8. class AndroidTests(unittest.TestCase):
  9. def setUp(self):
  10. """ 初始化 """
  11. desired_caps = {} # 定义一个desired_caps字典
  12. desired_caps['platformName'] = 'Android' # 平台名称 Android或iOS
  13. desired_caps['platformVersion'] = '10' # 系统版本号 设置->关于手机->Android版本 10
  14. desired_caps['deviceName'] = 'Android Emulator' # 设备名称,一般写Android Emulator就行
  15. desired_caps['noReset'] = 'True' # 不重置
  16. # 获取appPackage和appActivity
  17. # 打开cmd
  18. # 输入adb shell dumpsys activity top | findstr "ACTIVITY"
  19. # ACTIVITY cn.xiaochuankeji.tieba/.ui.base.SplashActivity 9df8d05 pid=27957
  20. desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba' # app的包名,cn.xiaochuankeji.tieba
  21. desired_caps['appActivity'] = '.ui.base.SplashActivity' # app当前活动界面,.ui.base.SplashActivity
  22. # 输入中文
  23. # desired_caps['unicodeKeyboard'] = 'True' # 安装appium自带输入法
  24. # desired_caps['resetKeyboard'] = 'True' # 重置键盘,修改默认输入法
  25. # Appium REST http interface listener started on 0.0.0.0:4723
  26. # Appium Server 地址及端口号
  27. self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
  28. def tearDown(self):
  29. # self.driver.quit()
  30. print("执行结束!")
  31. def test_by_id(self):
  32. self.driver.implicitly_wait(60)
  33. # demo01: find_element_by_id,如果id相同,则默认定位第一个
  34. # 场景:点击关注按钮,切换至关注页面
  35. ele = self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/title")
  36. print(ele.text)
  37. ele.click()
  38. time.sleep(2)
  39. # demo02:
  40. # 场景:点击话题按钮,切换到话题页面
  41. self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/topic").click()
  42. time.sleep(3)
  43. # demo03:
  44. # 场景:点击×号,退出话题页面,返回关注页面
  45. self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/ic_search_b").click()
  46. time.sleep(2)
  47. # demo04: find_elements_by_id
  48. # 场景:点击图文按钮,切换至图文页面
  49. # 获取所有di为cn.xiaochuankeji.tieba:id/title的控件
  50. ele = self.driver.find_elements_by_id("cn.xiaochuankeji.tieba:id/title")
  51. # 通过一个循环,确认要定位的控件是第几个
  52. for i in range(0, len(ele)):
  53. print("第" + str(i) + "个" + "是" + ele[i].text, end=" ") # 第0个是关注 第1个是推荐 第2个是视频 第3个是图文 执行结束!
  54. # 点击图文,图文控件的索引为3
  55. ele[3].click()
  56. # demo05:
  57. # 场景:点击第一条帖子的用户头像
  58. self.driver.find_elements_by_id("cn.xiaochuankeji.tieba:id/avatar_view_avatar")[0].click()
  59. if __name__ == '__main__':
  60. suite = unittest.TestLoader().loadTestsFromTestCase(AndroidTests)
  61. unittest.TextTestRunner(verbosity=2).run(suite)

2.find_element_by_class_name / find_elements_by_class_name

  1. # -*- coding:utf-8 -*-
  2. # 作者:IT小学生蔡坨坨
  3. # 时间:2020/12/20 9:29
  4. import unittest
  5. import time
  6. from appium import webdriver
  7. class AndroidTests(unittest.TestCase):
  8. def setUp(self):
  9. desired_caps = {}
  10. desired_caps['platformName'] = 'Android'
  11. desired_caps['platformVersion'] = '10'
  12. desired_caps['deviceName'] = 'Android Emulator'
  13. desired_caps['noReset'] = 'True'
  14. desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba'
  15. desired_caps['appActivity'] = '.ui.base.SplashActivity'
  16. self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
  17. def tearDown(self):
  18. print("执行完成!")
  19. def test_by_class_name(self):
  20. time.sleep(8)
  21. self.driver.implicitly_wait(60)
  22. # demo01:通过find_element_by_class_name定位TextView控件
  23. # 若有多个class_name相同,则默认定位第一个
  24. # 场景:点击关注按钮,切换至关注页面
  25. ele = self.driver.find_element_by_class_name('android.widget.TextView')
  26. time.sleep(3)
  27. print(ele.text)
  28. # 点击关注按钮
  29. ele.click()
  30. time.sleep(5)
  31. # demo02:通过find_elements_by_class_name定位TextView控件
  32. # 场景:点击图文按钮,切换到关注页面
  33. # find_elements_by_class_name找到所有TextView控件
  34. ele = self.driver.find_elements_by_class_name('android.widget.TextView')
  35. # 通过一个循环获取控件的索引号
  36. for i in range(0, len(ele)):
  37. print("第" + str(i) + "个" + "是" + ele[i].text)
  38. ele[3].click() # 点击图文
  39. time.sleep(3)
  40. """
  41. 返回结果:
  42. 第0个是关注
  43. 第1个是推荐
  44. 第2个是视频
  45. 第3个是图文
  46. ......
  47. 执行完成!
  48. """
  49. # demo03: 通过通过find_elements_by_class_name定位ImageView控件
  50. # 场景:点击话题图标,进入话题页面
  51. self.driver.find_elements_by_class_name("android.widget.ImageView")[1].click()
  52. time.sleep(2)
  53. # demo04:
  54. # 场景:点击×号退出话题页面
  55. self.driver.find_elements_by_class_name("android.widget.ImageView")[2].click()
  56. time.sleep(3)
  57. # demo05: 通过find_elements_by_class_name定位View控件
  58. # 场景:点击查看第一条帖子的详情
  59. self.driver.find_elements_by_class_name("android.view.View")[2].click()
  60. if __name__ == '__main__':
  61. suite = unittest.TestLoader().loadTestsFromTestCase(AndroidTests)
  62. unittest.TextTestRunner(verbosity=2).run(suite)

3.find_elements_by_xpath / find_element_by_xpath

  1. # -*- coding:utf-8 -*-
  2. # 作者:IT小学生蔡坨坨
  3. # 时间:2020/12/20 10:02
  4. import unittest
  5. import time
  6. from appium import webdriver
  7. class AndroidTests(unittest.TestCase):
  8. def setUp(self):
  9. desired_caps = {}
  10. desired_caps['platformName'] = 'Android'
  11. desired_caps['platformVersion'] = '10'
  12. desired_caps['deviceName'] = 'Android Emulator'
  13. desired_caps['noReset'] = 'True'
  14. desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba'
  15. desired_caps['appActivity'] = '.ui.base.SplashActivity'
  16. self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
  17. def tearDown(self):
  18. print("执行完成!")
  19. def test_xpath(self):
  20. time.sleep(8)
  21. self.driver.implicitly_wait(60)
  22. # demo01: xpath通过id定位单个元素
  23. # 场景:定位关注按钮,并点击
  24. self.driver.by_xpath(
  25. "//android.widget.TextView[@resource-id='cn.xiaochuankeji.tieba:id/title']").click()
  26. time.sleep(3)
  27. # demo02: xpath通过id定位多个元素
  28. # 定位话题按钮,并点击
  29. # 尽量不要用find_elements_by_xpath,查找多个元素后还需要用索引定位
  30. ele = self.driver.find_elements_by_xpath(
  31. "//android.widget.ImageView[@resource-id='cn.xiaochuankeji.tieba:id/topic']")
  32. ele[0].click()
  33. time.sleep(2)
  34. # demo03: xpath通过text文本定位,控件属性android.widget.ImageView
  35. # 点击创建
  36. self.driver.find_element_by_xpath("//android.widget.TextView[@text='创建']").click()
  37. time.sleep(2)
  38. # demo04: xpath通过text文本定位,无控件属性
  39. # 点击关闭
  40. self.driver.find_element_by_xpath("//*[@text='关闭']").click()
  41. time.sleep(2)
  42. # 返回到关注页面
  43. self.driver.keyevent(4)
  44. # 点击下方最中间的+号按钮,进入话题编辑页面
  45. self.driver.find_elements_by_xpath(
  46. '//android.widget.ImageView[@resource-id="cn.xiaochuankeji.tieba:id/iconTabItem"]')[2].click()
  47. time.sleep(3)
  48. # demo05: xpath通过class查找单个元素
  49. # 点击创建话题中的android.widget.EditText
  50. self.driver.find_element_by_xpath("//*[@class='android.widget.EditText']")
  51. # 按一次返回键隐藏键盘
  52. self.driver.keyevent(4)
  53. time.sleep(1)
  54. # 再按一次返回键
  55. self.driver.keyevent(4)
  56. time.sleep(2)
  57. # 点击不保留
  58. self.driver.find_element_by_xpath("//*[@text='不保留']").click()
  59. time.sleep(2)
  60. # demo06:
  61. # 组合定位,多个属性,用and定位
  62. # 定位视频按钮,并点击
  63. self.driver.find_element_by_xpath("//*[@resource-id='cn.xiaochuankeji.tieba:id/title' and @text='视频']").click()
  64. time.sleep(2)
  65. # demo07:
  66. # 通过层级定位,父级找子级,只有一个子级
  67. # 定位搜索按钮
  68. self.driver.find_element_by_xpath(
  69. "//android.widget.FrameLayout[@resource-id='cn.xiaochuankeji.tieba:id/search_b']/android.widget.ImageView").click()
  70. time.sleep(2)
  71. self.driver.keyevent(4)
  72. time.sleep(2)
  73. # demo08:
  74. # 通过层级关系,父级找子级,有多个子级,则需要加上索引,索引从1开始
  75. self.driver.find_element_by_xpath(
  76. "//android.widget.FrameLayout[@resource-id='cn.xiaochuankeji.tieba:id/search_b']/android.widget.ImageView[1]").click()
  77. time.sleep(2)
  78. self.driver.keyevent(4)
  79. time.sleep(3)
  80. # demo09:
  81. # 子级定位父级
  82. # 定位 图文 按钮
  83. self.driver.find_element_by_xpath("//android.widget.TextView[@text='图文']/..").click()
  84. time.sleep(2)
  85. # demo10:
  86. # 定位最右按钮上的文案信息,先找到父级的父级,再找到父级的兄弟级的子级
  87. self.driver.find_element_by_xpath(
  88. "//*[@text='最右']/../../android.view.ViewGroup[2]/android.widget.ImageView").click()
  89. if __name__ == '__main__':
  90. suite = unittest.TestLoader().loadTestsFromTestCase(AndroidTests)
  91. unittest.TextTestRunner(verbosity=2).run(suite)

Appium常用的3种元素定位方式的更多相关文章

  1. 【python+selenium的web自动化】- 8种元素定位方式详解

    ​ 我们在做WEB自动化时,最根本的就是操作页面上的各种元素,而操作的基础便是元素的定位,只有准确地定位到唯一元素才能进行后续的自动化控制,下面将对各种元素定位方式进行总结归纳. ​ 说明:以下操作统 ...

  2. Appium常用操作之「元素定位、swipe 滑屏操作」

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.打开 uiautomatorviewer 二.Appium 常用操作 1.用 layui 做 ...

  3. selenium(5):常用的8种元素定位

    selenium的webdriver提供了18种(注意不是8种)的元素定位方法,比较常用的定位方法是如下8种,xpath和css定位更加灵活,需要重点掌握其中一个. 经常会用到的8种定位:1.id定位 ...

  4. Selenium系列(一) - 8种元素定位方式的详细解读

    安装Selenium和下载Driver 安装selenium pip3 install  selenium -i http://pypi.douban.com/simple --trusted-hos ...

  5. Selenium-几种元素定位方式

    #识别元素并操作#一般有如下几种方法,其中id最为常用.这里需要注意识别元素一定要用唯一id 1.find_element_by_id("value") #! /usr/bin/e ...

  6. selenium8中元素定位方式

    Selenium对网页的控制是基于各种前端元素的,在使用过程中,对于元素的定位是基础,只有准去抓取到对应元素才能进行后续的自动化控制,我在这里将对各种元素定位方式进行总结归纳一下. 这里将统一使用百度 ...

  7. selenium自动化测试——常见的八种元素定位方法

    selenium常用的八种元素定位方法 1.通过 id 定位:find_element_by_id() 2.通过 name 定位:find_element_by_name() 3.通过 tag 定位: ...

  8. Appium自动化(10) - appium高级元素定位方式之 UI Automator API 的详解

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 前面介绍过根据id,clas ...

  9. 6.1 python+appium元素定位方式(登录app)

    1.0.0     :常见的十种元素定位方式 .driver.find_element_by_id() #id定位 .driver.find_element_by_name() #name定位(已经凉 ...

随机推荐

  1. kubernetes-dashboard.yaml

    # Copyright 2017 The Kubernetes Authors.## Licensed under the Apache License, Version 2.0 (the " ...

  2. gitlab 搭建(基于现有nginx)

    普通搭建请看:gitlab 搭建 一.gitlab搭建 1.添加GitLab镜像源并安装gitlab服务器 wget https://mirrors.tuna.tsinghua.edu.cn/gitl ...

  3. django基本内容

    1,流程 1.1 了解web程序工作流程 1.2 django生命周期 2,django介绍 ​ 目的:了解Django框架的作用和特点 ​ 作用: 简便.快速的开发数据库驱动的网站 django的优 ...

  4. 【电子取证:抓包篇】Fiddler 抓包配置与数据分析(简)

    Fiddler 抓包配置与分析(简) 简单介绍了Fiddler抓包常用到的基础知识,看完可以大概明白怎么分析抓包数据 ---[suy999]   Fiddler 抓包工具,可以将网络传输发送与接受的数 ...

  5. ios开发中如何调用苹果自带地图导航

    前段时间一直在赶项目,在外包公司工作就是命苦,天天加班不说,工作都是和工期合同挂钩的,稍微逾期就有可能被扣奖金,不谈这些伤脑筋的事情了,让我们说说iOS开发中如何调用苹果手机自带的地图. 学习如逆水行 ...

  6. transient关键字的作用以及几个疑问的解决

    目录 1.从Serilizable说到transient 2.序列化属性对象的类需要实现Serilizable接口? 3.不想被序列化的字段怎么办? 4.ArrayList里面的elementData ...

  7. zk特性

    看了又忘系列: 1.zk会将全量的数据存储在内存中,以此来实现提高服务器吞吐,减少延迟的目的. 2.集群中每台机器都会在内存中维护当前的服务器状态,并且每台机器之间都相互保持着通信.只要集群中存在超过 ...

  8. charles解决乱码

    1.点击help ssl proxying ,install Charles Root Certificate 2.点击安装证书按钮 3:点击下一步按钮 4:选中将所有的证书都放入下列存储 点击浏览按 ...

  9. MongoEngine模块

    今儿,接到老的的要求,要把新功能的数据存放在Mongo里.虽然一直都有听过Mango的鼎鼎大名,但是那也只是见过没用过,跟个小白没啥区别.在加上功能急需,没办法只能赶鸭子上架先上再说.下面这篇就是我赶 ...

  10. 第6.6节 Python动态执行小结

    一.    Python动态执行支持通过输入数据流或文件传入Python源代码串,进行编译后执行,可以通过这种方式扩展Python程序的功能: 二.    动态执行方法可能导致恶意攻击,因此使用时需要 ...