appium元素定位
appium元素定位方式,没有css定位方式
appium,比较脆弱,代码代码不稳定,因为各大手机厂商修改android系统,导致每个手机厂商的
运行appium自动化代码,不能在所有厂商的手机上运行,而且appium定位方法也不一定可以定位到手机元素
一、appium元素定位方法
一、id定位
#通过resource-id定位,多数不唯一id值不唯一
driver.find_element_by_id("id地址")
二、className定位
#通过class定位
driver.find_elemnet_by_id("class元素值")
三、通过AccessibilityId定位
通过AccessibilityID(取content-desc的值)
driver.find_element_by_accessibility_id("元素值")
四、xpath定位
在appium中。xpath的语法和selenium元素定位方式的一样,只不过class名替代tag名
还有一个区别是:在webUI中,xpath可以根据很多属性定位appium中calss属性、resource-id定位和文本可以进行定位
"""
appium文本定位方法 //*[@text="文本"]
web文本定位方法 //*[@text()="文本"]
"""
#通过xpath文本定位,注意语法要和web区分开来
#xapth定位方式定位慢,根据文本定位方式更慢,有些元素的文本时不断变化的,这些变化的,就不能有文本定位
driver.find_element_by_xpath("//*[@text='文本']")
当单个元素定位不到时,可以用多个元素组合在一进行定位,知道定位到元素
如果表达式正确,但搜索不唯一的情况,可以先执行代码,看代码过不过
#xapth组合定位
"""
元素1 / 元素2 分割组合/,对定位元素进行分层
元素值[2] 当有多个元素在通过层时,用[2]加下标的方法进行等位
"""
driver.find_elemnet_by_xpath("//*[@resource-id="id元素"]/calss元素[2]")
#组合定位,使用and连接多个属性进行定位
//*[@calss="dsds" and @text="da"]
#下标
//*[@resource-id="fasdfsfdsafasffsdfasfsdaffas"]/*[2]
五、通过Andrid UIAutomato定位
"""
正则表达式,在语句后面加Matches
组合定位,在语句 . 后添加元素定位方式
父子关系定位,例如父元素是文本,子元素是calss,要添加子元素,在父元素后面 . 子元素就可以了
"""
#根据文本定位
driver.find_elemnt_by_android_uiautomator('new UiSelector().text("文本内容")')
#根据文本模糊定位
driver.find_elemnt_by_android_uiautomator('new UiSelector().textContains("文本内容")')
#根据文本的开头部分定位
driver.find_elemnt_by_android_uiautomator('new UiSelector().textStarWith("文本内容")')
#根据正则文本定位
driver.find_elemnt_by_android_uiautomator('new UiSelector().textMatches("^ab.*")')
"""
^ 表示开头
ab 表示文本内容
. 表示多次
* 表示通配符
"""
#根据resource-id定位
driver.find_elemnt_by_android_uiautomator('new UiSelector().resourceID("id值")')
#id定位支持正则定位
driver.find_elemnt_by_android_uiautomator('new UiSelector().resourceIDMatches(".+AB")')
"""
. 表示多次
+ 表示组合
"""
#根据class name定位
driver.find_elemnt_by_android_uiautomator('new UiSelector().className("class值")')
#支持class name 用正则定位
driver.find_elemnt_by_android_uiautomator('new UiSelector().classNameMatches("..*")')
"""
. 表示多次
. 表示多次
* 通配符
"""
#组合定位
driver.find_elemnt_by_android_uiautomator('new UiSelector().text("文本内容")').className("calss值").resourceID("id值")
#支持父子关系定位
driver.find_elemnt_by_android_uiautomator('new UiSelector().text("文本内容")').childSelector(className("值"))
六、LazyUiAutomatorViewer
七、appium与selenium元素定位之ca
二、操作方式
元素定位操作
#点击
driver.find_selement_by_id("id值").click()
#输入
driver.find_selement_by_id("id值").send_key()
#清除文本框
driver.find_selement_by_id("id值").claear()
#获取元素的text值
print(driver.find_selement_by_id("id值").text)
#获取元素的属性值
print(driver.find_selement_by_id("id值").get_attribute("id"))
#获取元素的位置和大小
print(driver.find_selement_by_id("id值").location)
print(driver.find_selement_by_id("id值").size)
#滑动
"""
start_x,y 滑动开始位置
end_x,y 滑动结束位置
duration 持续时间,表示开始位置到结束位置的时间,避免滑动过快出现问题,减少惯性
""""
driver.swipe(start_x=1,start_y=1,end_x=1,end_y=1,duration=3)
根据坐标点击
#根据坐标点击,第二个参数是点击持续时间
driver.tap([(668,117),1])
触摸动作定位
#导入webdriver
from appium import webdriver
#导入触摸模块TouchAction
from appium.webdriver.common.touch_action import TouchAction
driver=("设备信息")
#短按一个元素或坐标点
TouchAction(driver).press(ele).elease().perform()
TouchAction(driver).press(x=668,y=117).elease().perform()
#长按一个元素或坐标点(持续时间是毫秒)
TouchAction(driver).press(ele,duration=500).elease().perform()
TouchAction(driver).press(x=1,y=1,duration=500).elease().perform()
#点击某个元素或坐标后,多次连点 count可以不写,默认为一
TouchAction(driver).tap(ele,count=3).elease().perform()
TouchAction(driver).tap(x=1,y=2,count=3).elease().perform()
#模拟手指等待
模拟手指等待,比如按下等待5秒在抬起,单位是毫秒
TouchAction(driver).press(ele,duration=500).wait(5000).elease().perform()
#移动,多点移动划线 点到点用move_to()链接
TouchAction(driver).move_to(x=1,y=2).move_to(x=2,y=1).elease().perform()
多点触控
#导入单点触控
from appium.webdriver.common.touch_action import TouchAction
#导入多点触控模块
from appium.webdriver.common.multi_action import MulitAction
"""
MultiAction是针对多点触控的操作,他是TouchAction的一个补充模块,
多点触控对象是触摸动作的集合,把多个单个触控动作放在一个集合里,就是多点触摸
多点触控只有两个动作:添加,执行
1、添加用于添加一个触摸操作到多点触控
2、当执行被调用的时候,添加多点触摸的所有触摸动作被执行
就像他们同时发生一样,appium首先执行所有触摸动作的第一个,
然后执行第二个......
"""
"""
TouchAction定位单个触摸
MulitAction添加触摸,和执行触摸动作
"""
#单个触摸定位 不用添加perform(),添加perform()代码会被执行
action0=TouchAction(driver).press(x=123,y=2).move_to(x=123,y=5)
action1=TouchAction(driver).press(x=123,y=2).move_to(x=123,y=5)
#进行多点触控,添加单个触控方式
MultiAction(driver).add(action0,action1).perform()
#多点触控 分步执行
ma=MultiAction(devier) #调用多点触控
ma.add(action0,action1) #添加单个触控
ma.perform() #执行
手机api操作
获取手机分辨率
print(deiver.get_window_size())
获取手机网络状态
返回1 表示飞行模式,返回2只开wifi,返回4只开流量,返回6网络全开
#设置手机网络状态,大部分没有用,大部分手机厂商禁止了这个操作
print(driver.network_connection)
获取当前时间
print(driver.driver_time)
打开通知栏
print(driver.open_notifications())
修改手机密码
各大厂家对密码修改进行行了限制,进入修改密码页面会黑屏,这个时候我们需要获取页面源代码,根据源代码进行等位
print(driver.page_source)
执行上面代码之后,在控制台会输出xml源码,这个时候我们使用编程搜索工具ctrl+f进行搜索,搜索手机页面上可见的文本,搜索到以后,然后找到这个文本他的id,class等元素,然后使用文本的id、class等元素在控制台ctrl+f在搜索一下,确保唯一
获取设备的高度和宽度
#获取设备宽度
x=driver.get_window_size()["width"]
#获取设备高度
y=driver.get_window_size()["height"]
#t代表滑动持续时间,n表示滑动次数
def swipeUp(driver, t=500,n=1):
"""向上滑动屏幕,每次滑动半个屏幕"""
l=driver.get_window_size()
x1=l["width"]*0.5
y1=l["height"]*0.75
y2=l["height"]*0.25
for i in range(n):
driver.swipe(x1,yx,x1,y2,t)
#可以按元素滑动,下面函数,会ele1滑动到ele2,没有惯性
driver.drag_and_drop(ele1,ele2)
#从一个元素,滑动到另一个元素,有惯性
driver.scoroll(ele1,ele2)
如何查看手机坐标
进入手机开发者模式,然后代开【指针位置】
手机按键模拟
#返回桌面
driver.keyevent(3) #对应的式home键
#调节音量
driver.keyevent(24)
driver.keyevent(25)
#调用多个键
driver.keyevent(24).keyevent(5)
"""
拨号键5
挂机键6
home键3
返回键4
菜单键82
搜索键84
电源键26
音量加24
音量减25
............longding
"""
一、等待时间
1、固定延迟time
导入time模块,每次设置设置时间使用time.sleep(时间):
#导入time模块
import time
"""
代码
"""
#非元素查找的情况需要等待,就用sleep
time sleep(600) #设置固定等待时间,代码运行到这里会执行该语句,直到设置时间结束才会开始执行下面的代码
二、隐式等待
非元素定位,不走隐式等待
form appium import webdriver
form appium.wsbdriver.commeo.apppium import appiumBy
#登录浏览器
driver=webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub', desired_capabilities=desired_caps)
#隐性等在,在运行代码到代码结束所有进程都保持10秒等待
drivver.implicity_wait(10)
三、显性等待
明确等待某个条件满足之后,再执行下一步操作
程序每个一段时间看一下,如果条件满足就进行下一步,否则就继续等待,直到超出设置时常,抛出TimeoutException
from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.appiumby import AppiumBy
from appium.webdriver.common.mobileby import MobileBy
# WebDriverWait类:显性等待类语法
# WebDriverWait(driver,等待时常,轮询周期).until(定位语法)条件/until_not()直到条件不成立
# EC.presence_of_element_located():元素存在
# EC.visibility_of_element_located():元素可见
# EC.element_to_be_clickable():元素可点击
# EC.new_window_is_opened() # 新窗口是否打开
# EC.frame_to_be_available_and_switch_to_it() # 可用并且切换进去
# EC.alert_is_present() # 弹出框的出现
# EC.element_selection_state_to_be() # 下拉列表状态
# EC.element_to_be_selected() # 某一个定位表达式的值应该是被选中的
# EC.element_selection_state_to_be() # 定位表达式的选中状态是什么
# EC.element_to_be_selected() # 元素可用被选中的
# EC.invisibility_of_element() # 隐形的元素
# EC.number_of_windows_to_be() # 窗口的个数应该为
# # EC.presence_of_all_elements_located() # 所有元素应该都存在
# EC.text_to_be_present_in_element() # 元素出现的文本内容
# EC.text_to_be_present_in_element_value() # 元素出现的文本内容值
# EC.url_changes() # url的改变
# EC.url_contains() # url的包含
# EC.url_matches() # url的匹配
# EC.url_to_be() # url的应该是什么