appium之滑动屏幕+判断元素是否存在+截图+toast定位

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(不常用,无惯性,传入元素)

适用于我们滑动后要定位到某一个元素的时候使用。我也不常用,有兴趣的可以了解一下

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值