以最右App为例

.apk文件网盘地址:

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

提取码:0jqm

1.find_element_by_id / find_elements_by_id

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

2.find_element_by_class_name / find_elements_by_class_name

# -*- coding:utf-8 -*-
# 作者:IT小学生蔡坨坨
# 时间:2020/12/20 9:29 import unittest
import time
from appium import webdriver class AndroidTests(unittest.TestCase):
def setUp(self):
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '10'
desired_caps['deviceName'] = 'Android Emulator'
desired_caps['noReset'] = 'True'
desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba'
desired_caps['appActivity'] = '.ui.base.SplashActivity' self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) def tearDown(self):
print("执行完成!") def test_by_class_name(self):
time.sleep(8)
self.driver.implicitly_wait(60) # demo01:通过find_element_by_class_name定位TextView控件
# 若有多个class_name相同,则默认定位第一个
# 场景:点击关注按钮,切换至关注页面
ele = self.driver.find_element_by_class_name('android.widget.TextView')
time.sleep(3)
print(ele.text)
# 点击关注按钮
ele.click()
time.sleep(5) # demo02:通过find_elements_by_class_name定位TextView控件
# 场景:点击图文按钮,切换到关注页面
# find_elements_by_class_name找到所有TextView控件
ele = self.driver.find_elements_by_class_name('android.widget.TextView')
# 通过一个循环获取控件的索引号
for i in range(0, len(ele)):
print("第" + str(i) + "个" + "是" + ele[i].text)
ele[3].click() # 点击图文
time.sleep(3)
"""
返回结果:
第0个是关注
第1个是推荐
第2个是视频
第3个是图文
......
执行完成!
""" # demo03: 通过通过find_elements_by_class_name定位ImageView控件
# 场景:点击话题图标,进入话题页面
self.driver.find_elements_by_class_name("android.widget.ImageView")[1].click()
time.sleep(2) # demo04:
# 场景:点击×号退出话题页面
self.driver.find_elements_by_class_name("android.widget.ImageView")[2].click()
time.sleep(3) # demo05: 通过find_elements_by_class_name定位View控件
# 场景:点击查看第一条帖子的详情
self.driver.find_elements_by_class_name("android.view.View")[2].click() if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(AndroidTests)
unittest.TextTestRunner(verbosity=2).run(suite)

3.find_elements_by_xpath / find_element_by_xpath

# -*- coding:utf-8 -*-
# 作者:IT小学生蔡坨坨
# 时间:2020/12/20 10:02 import unittest
import time
from appium import webdriver class AndroidTests(unittest.TestCase):
def setUp(self):
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '10'
desired_caps['deviceName'] = 'Android Emulator'
desired_caps['noReset'] = 'True'
desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba'
desired_caps['appActivity'] = '.ui.base.SplashActivity' self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) def tearDown(self):
print("执行完成!") def test_xpath(self):
time.sleep(8)
self.driver.implicitly_wait(60) # demo01: xpath通过id定位单个元素
# 场景:定位关注按钮,并点击
self.driver.by_xpath(
"//android.widget.TextView[@resource-id='cn.xiaochuankeji.tieba:id/title']").click()
time.sleep(3) # demo02: xpath通过id定位多个元素
# 定位话题按钮,并点击
# 尽量不要用find_elements_by_xpath,查找多个元素后还需要用索引定位
ele = self.driver.find_elements_by_xpath(
"//android.widget.ImageView[@resource-id='cn.xiaochuankeji.tieba:id/topic']")
ele[0].click()
time.sleep(2) # demo03: xpath通过text文本定位,控件属性android.widget.ImageView
# 点击创建
self.driver.find_element_by_xpath("//android.widget.TextView[@text='创建']").click()
time.sleep(2) # demo04: xpath通过text文本定位,无控件属性
# 点击关闭
self.driver.find_element_by_xpath("//*[@text='关闭']").click()
time.sleep(2)
# 返回到关注页面
self.driver.keyevent(4)
# 点击下方最中间的+号按钮,进入话题编辑页面
self.driver.find_elements_by_xpath(
'//android.widget.ImageView[@resource-id="cn.xiaochuankeji.tieba:id/iconTabItem"]')[2].click()
time.sleep(3) # demo05: xpath通过class查找单个元素
# 点击创建话题中的android.widget.EditText
self.driver.find_element_by_xpath("//*[@class='android.widget.EditText']")
# 按一次返回键隐藏键盘
self.driver.keyevent(4)
time.sleep(1)
# 再按一次返回键
self.driver.keyevent(4)
time.sleep(2)
# 点击不保留
self.driver.find_element_by_xpath("//*[@text='不保留']").click()
time.sleep(2) # demo06:
# 组合定位,多个属性,用and定位
# 定位视频按钮,并点击
self.driver.find_element_by_xpath("//*[@resource-id='cn.xiaochuankeji.tieba:id/title' and @text='视频']").click()
time.sleep(2) # demo07:
# 通过层级定位,父级找子级,只有一个子级
# 定位搜索按钮
self.driver.find_element_by_xpath(
"//android.widget.FrameLayout[@resource-id='cn.xiaochuankeji.tieba:id/search_b']/android.widget.ImageView").click()
time.sleep(2)
self.driver.keyevent(4)
time.sleep(2) # demo08:
# 通过层级关系,父级找子级,有多个子级,则需要加上索引,索引从1开始
self.driver.find_element_by_xpath(
"//android.widget.FrameLayout[@resource-id='cn.xiaochuankeji.tieba:id/search_b']/android.widget.ImageView[1]").click()
time.sleep(2)
self.driver.keyevent(4)
time.sleep(3) # demo09:
# 子级定位父级
# 定位 图文 按钮
self.driver.find_element_by_xpath("//android.widget.TextView[@text='图文']/..").click()
time.sleep(2) # demo10:
# 定位最右按钮上的文案信息,先找到父级的父级,再找到父级的兄弟级的子级
self.driver.find_element_by_xpath(
"//*[@text='最右']/../../android.view.ViewGroup[2]/android.widget.ImageView").click() if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(AndroidTests)
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. [LGOJ1273]有线电视网

    solution 用了一个很有意思的转移方法. $dp[i][j] $ 表达 \(i\) 作为根,\(j\)个终端时最大的收益,即钱数,当\(0\leq dp[1][i]\)时,即以1为根可以转移到\ ...

  2. docker提示容器已存在

    docker ps -a docker rm 容器id 重启启动

  3. 【数学】康托展开 && 康托逆展开

    (7.15)康托展开,就是把全排列转化为唯一对应自然数的算法.它可以建立1 - n的全排列与[1, n!]之间的自然数的双向映射. 1.康托展开: 尽管我并不清楚康托展开的原理何在,这个算法的过程还是 ...

  4. IPv6 Rapid Deployment, IPv6 6rd初探

    IPv6 Rapid Deployment: Provide IPv6 Access to Customers over an IPv4-Only Network 原文地址:https://www.c ...

  5. 题解 洛谷 P2612 【[ZJOI2012]波浪】DP+高精

    题目描述 题目传送门 分析 因为有绝对值不好处理,所以我们强制从小到大填数 设 \(f[i][j][p][o]\) 为当前填到了第 \(i\) 个数,波动强度为 \(j\),有 \(p\) 个连续段并 ...

  6. C#中的WinForm问题——如何设置窗体的大小为超过屏幕显示的最大尺寸?

    今天在学习C#时遇到了一个问题,在此记录下来,留作日后总结复习之用,也分享给有同样问题和困扰的园友. 我手上的电脑是笔记本电脑,屏幕的尺寸大小为1366*768,然而项目所使用的屏幕大小为1920*1 ...

  7. MongoEngine模块

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

  8. golang拾遗:嵌入类型

    这里是golang拾遗系列的第三篇,前两篇可以点击此处链接跳转: golang拾遗:为什么我们需要泛型 golang拾遗:指针和接口 今天我们要讨论的是golang中的嵌入类型(embedding t ...

  9. 图像处理术语解释:灰度、色相、饱和度、亮度、明度、阿尔法通道、HSL、HSV、RGBA、ARGB和PRGBA以及Premultiplied Alpha(Alpha预乘)等基础概念详解

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 由于老猿以前没接触过图像处理,在阅读moviepy代码时,对类的有些处理方法代码看不懂是什么含义,为此花了4天时间查阅了大量资料,并加以自己的理解和 ...

  10. 第8.20节 Python中限制动态定义实例属性的白名单:__slots__

    一. 引言 按照<第7.10节 Python类中的实例变量定义与使用>.<第7.14节Python类中的实例方法解析>中的介绍,当定义了一个类,并且创建了该类的实例后,可以给该 ...