appium之滑动屏幕+判断元素是否存在+截图+toast定位
基础代码
import time
from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
server = 'http://localhost:4723/wd/hub'
caps = {
"platformName": "Android",
"deviceName": "JPF4C19123011893",
"platformVersion": "10.0",
"appPackage": "com.czb.webczbdemo",
"appActivity": "com.czb.webczbdemo.MainActivity",
"automationName": "uiautomator2",
"noReset": "true",
"unicodeKeyboard": "true",
"resetKeyboard": "true"
}
driver = webdriver.Remote(server, caps)
wait = WebDriverWait(driver, 30)
#通过find_element_by_id来获取元素
navigation_button = driver.find_element_by_id("com.czb.webczbdemo:id/webNavigation")
#点击元素
navigation_button.click()
#等待3秒
time.sleep(3)
#通过find_element_by_class_name来定位元素
edit_text = driver.find_element_by_class_name("android.widget.EditText")
#将元素中的内容清空
edit_text.clear()
#等待3秒
time.sleep(3)
#将新的地址放到输入框中
edit_text.send_keys("https://test-open.czb365.com/redirection/todo/?platformType=92611011&platformCode=18610899775")
#通过find_element_by_class_name来定位元素
commit_button = driver.find_element_by_class_name("android.widget.Button")
#点击前往按钮
commit_button.click()
#通过find_elements来查找有相同定位信息的一组元素
oilstation = driver.find_elements_by_class_name("android.view.View")
#将元素信息打印出来
print(oilstation)
#打印这一组信息的数据类型
print(type(oilstation))
#通过xpath来定位元素并点击
stationone=driver.find_element_by_xpath("//*[@text='ZZ测试油站就将尽快尽快框架开卡']").click()
现在,我们进入了油站详情页面,但是我们想返回到油站列表页怎么办,这个页面是没有返回按钮的,那我们就需要左滑右滑,而且这个页面是展示的不全的,我们需要上滑和下滑来查看完成的页面信息,而且我们还需要判断一个元素存在不存在,甚至我们还想截个图,还有一个场景,如果我们不选择油枪就直接点击下一步,是会有toast的,怎么定位这个toast。
判断元素是否存在
比如说我在油站详情页要判断该油号下是不是有油枪,我们发现油号的上级元素是唯一的,那我们就来尝试一下,并打印处油枪号
# 定位油枪号元素
oilgun = driver.find_element_by_class_name("android.widget.ListView").find_element_by_class_name("android.view.View")
# 打印油枪号信息
print(oilgun.text)
# 判断元素是否存在,注意传的是字符串
def is_element_exist(elementString):
# 获取页面的所有元素
source = driver.page_source
if elementString in source:
return True
else:
return False
print(is_element_exist("5号"))
结果
5号
True
截图
我们在项目的下级目录新建一个文件夹,名为screenshot
#获取时间信息
timeNow = time.strftime("%Y-%m-%d %H-%M-%s")
#获取当前文件的上级目录
folder = os.path.dirname(__file__)
#拼接文件路径到我们新建的screenshot
image_folder = os.path.join(folder, "screenshot")
#拼接图片路径和文件名
image =image_folder+"/"+timeNow+".png"
#截图
driver.get_screenshot_as_file(image)
执行后发现screenshot目录下新增了一个图片,检查后发现正是当前页面的截图
toast定位
就如下图所示,不选择油枪直接点击下一步,就会有toast提示,我们要捕获这个toast
首先我们要引入
from selenium.webdriver.support import expected_conditions as EC
然后再写代码
# 直接定位到下一步并点击
driver.find_element_by_xpath("//*[@text='下一步']").click()
# 定位toast信息:通过xpath的方式寻找,//代表当前目录下的,*代表所有的,包含了'请选择油枪'文案的元素
please = ("xpath", "//*[contains(@text,'请选择油枪')]")
def get_toast(toast_element):
#等待10秒,每0.1秒找一次,until直到这个toast出现
wait_toast = WebDriverWait(driver, 10, 0.1).until(EC.presence_of_element_located(toast_element))
#打印toast的文案
print(wait_toast.text)
get_toast(please)
结果
请选择油枪
滑动
名词解释:惯性,就好像你上下滑动一下屏幕,滑得很快,手指放开之后屏幕还是在滑动,这就叫有惯性。
我们首先要明确屏幕的坐标,是以屏幕的左上角为原点,向左为 x,向下为 y
scoll(不常用,有惯性,传入元素)
我也不常用,有兴趣的可以了解一下
TouchAction(不常用)
最常用的场景就是九宫格解锁,我们需要一直按压着屏幕,但是这个功能到现在我也没用过,有兴趣的可以了解一下
swipe(常用,可以设置是否有惯性,传入的是坐标)
比如说我们的油站详情页,只有通过右滑才可以回到油站列表页,回到油站列表页后再上下滑动屏幕,下面这段代码就完成上述操作。
# 首先我们要获取屏幕的高度和宽度
def get_size():
# 获取屏幕大小,返回的是一个字典
size = driver.get_window_size()
# 获取宽和高并返回
width = size['width']
height = size['height']
return width, height
# 向左滑动,左右滑动,高度是不变的,所以只要有一个y就可以了
def swipe_left():
# x1为屏幕宽度分为10等份,从左数向右第9个等份处
x1 = get_size()[0] / 10 * 9
# 从屏幕高度的中间滑动
y1 = get_size()[1] / 2
# x为屏幕宽度分为10等份,从左向右数第1个等份处
x = get_size()[0] / 10
driver.swipe(x1, y1, x, y1)
# 向右滑动,左右滑动,高度是不变的,所以只要有一个y就可以了
def swipe_right():
# x1为屏幕宽度分为10等份,从左数向右第1个等份处
x1 = get_size()[0] / 10
# 从屏幕高度的中间滑动
y1 = get_size()[1] / 2
# x为屏幕宽度分为10等份,从左向右数第9个等份处
x = get_size()[0] / 10 * 9
driver.swipe(x1, y1, x, y1)
# 向右滑动,左右滑动,高度是不变的,所以只要有一个y就可以了
# 咱们通过详情页跳转到列表页面是需要从最左侧开始滑动的,所以我们需要改一下向右滑动的方法
def swipe_right_zero():
# 就是屏幕的最左边
x1 = get_size()[0] *0
# 从屏幕高度的中间滑动
y1 = get_size()[1] / 2
# x为屏幕宽度分为10等份,从左向右数第9个等份处
x = get_size()[0] / 10 * 9
driver.swipe(x1, y1, x, y1)
# 向上滑动,上下滑动,宽是不变的,所以只要有一个x就可以了
def swipe_up():
# 从屏幕宽度的中间滑动
x1 = get_size()[0] / 2
# y1为屏幕搞得分为10等份,从上向下数第9个等份
y1 = get_size()[1] / 10 * 9
# y为屏幕搞得分为10等份,从上向下数第1个等份
y = get_size()[1] / 10
driver.swipe(x1, y1, x1, y)
# 向下滑动,上下滑动,宽是不变的,所以只要有一个x就可以了
def swipe_down():
# 从屏幕宽度的中间滑动
x1 = get_size()[0] / 2
# y1为屏幕搞得分为10等份,从上向下数第1个等份
y1 = get_size()[1] / 10
# y为屏幕搞得分为10等份,从上向下数第9个等份
y = get_size()[1] / 10 * 9
driver.swipe(x1, y1, x1, y)
# 向下滑动,上下滑动,宽是不变的,所以只要有一个x就可以了
# 但是我们观察一下我们的列表页,屏幕y轴距离原点1/10处,你滑动是没有用的,需要从油站列表处滑动。所以我们将滑动的点向下移动
# 所以appium不难,但是各种具体问题具体分析调试起来很难
def swipe_down_czb():
# 从屏幕宽度的中间滑动
x1 = get_size()[0] / 2
# y1为屏幕搞得分为10等份,从上向下数第4个等份
y1 = get_size()[1] / 10*4
# y为屏幕搞得分为10等份,从上向下数第9个等份
y = get_size()[1] / 10 * 9
driver.swipe(x1, y1, x1, y)
swipe_right_zero()
swipe_up()
swipe_down_czb()
drag_and_drop(不常用,无惯性,传入元素)
适用于我们滑动后要定位到某一个元素的时候使用。我也不常用,有兴趣的可以了解一下