appium自动化二

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的应该是什么

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值