‍‍正文共:3716字  预计阅读时间:10分钟

1

合理使用appium自动化等待方法

在自动化测试脚本的运行过程中,webdriver操作浏览器的时候,对于元素的定位是有一定的超时时间,大致应该在1-3秒的样子,如果这个时间内仍然定位不到元素,就会抛出异常,中止脚本执行。我们可以通过在脚本中设置等待的方式来避免由于网络延迟或浏览器卡顿导致的偶然失败,常用的等待方式有三种

强制等待

强制等待是利用python语言自带的time库中的sleep()方法:

import timetime.sleep(3)

sleep()顾名思义就是睡觉的意思,就是脚本一旦执行到条语句sleep(10)就睡10s,再执行后面的语句,他是一个强制等待的方式,使得整个脚本暂停。但是这种方式会导致这个脚本运行时间过长,不到万不得已尽可能少用,特殊情况下,时间设置最好不超过1秒,一般0.5秒。

隐式等待

隐式等待(全局):服务端会在特定的超时时间内重试多次寻找控件

driver.implicitly_wait(20)

隐式等待相比强制等待更智能,顾名思义,在脚本中我们一般看不到等待语句,但是它会在每个页面加载的时候自动等待;隐式等待只需要声明一次,一般在打开浏览器后进行声明。声明之后对整个drvier的生命周期都有效,后面不用重复声明。

implicitly_wait()方法用来等待页面加载完成(直观的就是浏览器tab页上的小圈圈转完)

如driver.implicitly_wait(20),超时时间20s,20秒内一旦加载完成,就执行下一条语句,如果20秒内页面都没有加载完,就超时抛出异常。

但是隐式等待依然存在一个问题,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步。

所以,这里webdriver提供了一种更加智能的等待方式:显示等待

显示等待

在一个超时时间范围内,每隔一段时间去搜索一次元素是否存在,如果存在返回定位对象,如果不存在直到超时时间到达,报超时异常错误。

// 在Appium中用了Selenium中造的轮子(显示等待)// 方法:WebDriverWait(driver, timeout, poll_frequency).until(method)//参数:1.driver:手机驱动对象2.timeout:搜索超时时间3.poll_frequency:每次搜索间隔时间,默认时间为0.5s4.method:定位方法(匿名函数
// 使用示例:from selenium.webdriver.support.wait import WebDriverWaitWebDriverWait(driver, timeout, poll_frequency).until(lambda x: x.find_elements_by_id(id_value))

等待方法的应用在app脚本自动化里面非常重要,通过不同的场景使用不同的等待方法,才能使得用例更加的健壮。

2

使用稳定的控件定位方法

常见定位方法主要是:id、accessibility ID、XPath

为什么这三个元素可以定位到控件,我们首先要了解UI界面控件的基础知识。在最早的控件体系是来自于web网页,DOM对象它其实就是把界面的所有元素使用一个标准的文档和格式对他进行表示,可以通过他去解析和渲染打开网页里面所能看到的一个个组件、标签本质底层对应都是文档节点,DOM结构实际都是用XML表示的,也因为所有的节点都是使用XML表示,所以我们就可以使用xpath来去表示XML节点定位,就可以找到页面中任何一个元素

移动时代,同样也是类似DOM结构,与XML是有差别的但整体是相似的,所以与传统的web定位是一样的,仍然需要去了解元素里面的关键属性

现在我们已经知道元素定位的原理了,就是:当我们去定位一个控件时,本质就是使用一个关键的组件去识别它;获取页面上所有的组件,对于每一个组件,都找到一个关键的标记,去检索到它就可以了所以,Appium给我们提供了常见的,根据关键属性去定位的几个方式:1、id(重要)2、accessibility ID:content-desc(重要)3、XPath(重要)class在移动端几乎没有用,同时Appium也支持图像识别和AI识别(有组件支持),我们往后再去学习。有了定位符号之后怎么使用他它呢,通常一个测试用例是有多个测试步骤的,然后每个测试步骤有三要素:1、定位:各种定位方法定位元素2、交互:点击、滑动、输入等操作3、断言:完成自动化的步骤之后,需要对结果进行断言

分析安卓UI automator2 定位逻辑源码,查看每个定位方式实际的使用什么元素定位

由于xpath的处理逻辑非常复杂,所以他的定位方法是慢很多的(1s~5s),并且xpath表达式过长,维护也会更困难。

最后一个是安卓的原生定位符,跟他的平台绑定太严格,不太建议使用

常见的元素定位符定位方法都用:1、findElementByxxxx:写法简单,编写速度快2、findElement(by,value) :主要用于page Object模式作准备的,他可以得到元素的定位方法,和元素的查找过程进行分离,也是行业内的最常用的方式。有了这些知识,我们就可以利用这些知识逐渐去完善、优化已有的录制出来的用例,比如说脚本里面很多的xpath是我们录制工具自动生成的,这些工具本身录制的过程中并没有考虑足够好的可维护性,录制出来xpath的有可能是一个长的表达式,那我们就可以改用用更短 更容易维护的id、accessibility ID等定位方式

3

使用单元测试框架pytest重构代码

当我们使用appium-desktop录制好脚本,并使用上述的控件定位方法和等待方法优化代码了以后,我们还可以使用单元测试框架pytest去重构,使代码规范、项目完整度、稳定程度上升到另一个层次。步骤:1、Python版本的客户端安装:

Pip install Appium-python-client

2、安装PyCharm IDE: https://www.jetbrains.com/pycharm/download/#section=windows3、在appium-desktop中 把录制的脚本代码下载下来4、代码放到PyCharm 新建的python文件中5、国内依赖源: 使用豆瓣依赖源下载依赖,解决错误,导入包如下述demo脚本,我们可以用单元测试框架进行重构

from appium import webdriver# 配置capabilitycaps = {}caps["platformName"] = "Android"caps["platformVersion"] = "8.0.0"caps["appPackage"] = "com.gkeeper.client"caps["appActivity"] = "com.gkeeper.client.ui.main.IndexActivity"caps["deviceName"] = "WGY0217C11001442"caps["noReset"] = "true"caps["autoGrantPermissions"] = "true"# 生成driver对象driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)# 隐式等待driver.implicitly_wait(50)# 找到元素,发送点击事件 el1 = driver.find_element_by_id("com.gkeeper.client:id/iv_close")el1.click()el2 = driver.find_element_by_id("com.gkeeper.client:id/rc_conversation_title")el2.click()# session结束driver.quit()

参考网址:https://github.com/appium/appium/tree/master/sample-code/python参考demo可以发现,我们使用pytest的前置函数、自动化脚本函数封装、断言机制等去重构代码,再加上使用更加稳定的控件定位方法ID、accessibility ID,针对不用场景运用appium自动化等待方法,可以得到相对优雅且健壮的UI单元测试脚本代码。

我记得你看我的眼神是的,我记得
我记得我们抓到一颗流星是的,我记得
我记得我们分享的一切
我们只答应你和我

I remember the way you glance at me yes I remember

I remember when we caught a shooting star yes I remember

I remember all the things that we shared

and the promise we made just you and I

美国励志剧情电视剧《女王的棋局》

End

以防走丢,请及时星标 置顶 关注我

你这么可爱,点个三连再走呗~

appium获取元素节点的方法_Appium学废系列(四) 如何写出优雅又健壮的脚本相关推荐

  1. js获取元素节点的几种方法

    1.以元素名获取 //通过标签名获取元素节点(获取0到多个节点) //书写格式: //document.getElementsByTagName("元素名") let divEle ...

  2. JavaScript基础12-day14【DOM查询(获取元素节点、获取元素节点的子节点)、全选练习、DOM增删改、DOM添加删除记录、Window对象方法】

    学习地址: 谷粒学院--尚硅谷 哔哩哔哩网站--尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通) JavaScript基础.高级学习笔记汇总表[尚硅谷最新版Ja ...

  3. Dom基础 特殊的节点 获取元素节点的内容 获取元素的属性 css属性 Dom获取元素的方法

    1.Dom基础 <!DOCTYPE html> <html><head><meta charset="utf-8"><titl ...

  4. js基础总结——js 获取元素节点、js 绑定onclick事件、js 获取属性 修改属性值、js 获取子元素、js 改变css样式

    参考书籍:<JavaScript DOM编程艺术 第2版> 本博客代码的测试页面是:https://www.layui.com/ js dom操作 js 获取元素节点 一份document ...

  5. js获取元素节点对象

    js获取元素节点对象

  6. 设计方法:怎么写出优雅的 Go 项目?

    前言 Go 语言简单易学,对于大部分开发者来说,编写可运行的代码并不是一件难事,但如果想真正成为 Go 编程高手,你需要花很多精力去研究 Go 的编程哲学. 在我的开发生涯中,我见过各种各样的代码问题 ...

  7. Javascript及Jquery获取元素节点以及添加和删除操作

    用了javascript和jquery很久,把所有元素节点的操作总结了下,放在博客上作为记录. Javascript获取元素的主要方式有三种 1.document.getElementById('ma ...

  8. 文档对象模型DOM(获取元素节点、设置节点属性)

    练习题: 制作一个表格,显示班级的学生信息. 要求: 1. 鼠标移到不同行上时背景色改为色值为 #f2f2f2,移开鼠标时则恢复为原背景色 #fff 2. 点击添加按钮,能动态在最后添加一行 3. 点 ...

  9. js获取子节点的方法

    1.通过获取DOM方式直接获取子节点 其中price为父标签id的值,div为标签的名字.getElementsByTagName是一个方法.返回的是一个数组.在访问的时候按数组的形式访问即可,如va ...

最新文章

  1. 聊聊storm的stream的分流与合并
  2. golangsha1解码_golang中几种加密方式的处理
  3. 第二单元 考点6-7商业银行和投资理财
  4. 别再说你不会!自学java教程百度云
  5. RocksDB线程局部缓存
  6. Fedora 18 在线升级至 Fedora 19 命令步骤
  7. TF版本升级问题:成功解决AttributeError: module tensorflow has no attribute mul
  8. printf不明确_资源贴|不是吧,还有人不知道指针?你想知道还不点进来看看?...
  9. axios 跨域_当遇到跨域开发时,我们如何处理好前后端配置和请求库封装
  10. linux 烧写(1)
  11. python数字排列组合去重_排列组合-生成集合的所有子集
  12. php驱动下载好后安装在哪里,没网如何安装网卡驱动
  13. C++ 进阶——object slicing 与虚函数与dynamic_cast
  14. ROS采坑日记(1)----解决E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用)的问题
  15. 1.转子动力学——引言
  16. 一元线性回归(Python)
  17. PHP短视频无水印解析源码
  18. 两融杠杆渐入警戒区 专家警示结构性风险
  19. css特效滑动导航栏,教你做个可爱的css滑动导航条
  20. VIOS磁盘映射关系确认

热门文章

  1. R语言scale_colour_brewer()函数和scale_fill_brewer()函数调色板及填充ggplot2图像实战
  2. xmarin.android导航栏,android – 如何在xamarin表单中更改导航页面后退按钮
  3. c语言大作业菜单管理,C语言大作业:编写菜单控制猜商品价格程序
  4. tf.keras.layers.Dropout 示例
  5. 二十四、死锁的处理策略---检测和解除
  6. 【计算机图形学】六面体旋转并实时切换虚线实线 - 代码实现
  7. linux主机释放cache和buffer
  8. 【windwos bat】批量把windows下的wav文件转为raw文件
  9. Linux查看可执行文件的各个段:.BSS,.TEXT,.DATA的大小
  10. C++ 协程介绍[译]