1.web 基础-html、dom 对象、js 基本语法

Dom 对象里面涉及元素定位以及对元素的修改。因为对元素操作当中涉及的一些 js 操作,js 基本语法要会用。得要掌握前端的基本用法。为什么要元素定位?因为找到这个元素,就能告诉代码要找谁要做什么。

2.元素定位

四大基本元素定位:id name class_name tag_name

针对链接:link_text

部分文本内容:partial_link_text

万能定位方式:xpath css

常用的元素定位方式是:id xpath

css 选择器的定位方式看起来比较复杂,和前端挂钩,但是 css 能做的事,xpath 一样能做。只要能解决问题就行。

动态 id,可以用别的属性来定位。xpath 基本的定位原则是:相对路径,相对路径中基本的定位方式是//标签名[@属性名=值]

但是这种基本定位方式对我们来说不够用,所以增加了逻辑运算://标签名[@属性名=值 and/or@属性名=值 ]

以上是靠自身的属性来定位,还可以靠文本内容来定位:通过文本匹配的方式,「目前 css 是不支持文本定位方式的。」 但是 xpath 可以定位:文本全匹配://标签名[text()=文本值]

文本和属性的部分匹配://标签名[contains(text()/@属性值,部分值)]

以上 3 种是根据自己的特质来匹配的。

如果靠自己的特质不行的话,可以通过:

1.层级定位:先定位到上级或者上上级,缩小范围,再定位元素。

2.轴定位:找各种关系来定位。这种一般在表格当中比较多。轴定位的方式有这几种:

ancestor:祖先

parent:父母(这里主要指爸爸)

兄弟姐妹:

preceding-sibling:选取当前节点之前的所有同级节点,同一个parent下该节点之前的节点,即“哥哥”节点(是同父的哥哥节点)。

following-sibling:选取当前节点之后的所有同级节点。

在各种定位解决不了问题的情况下就可以用轴定位了。各种定位方式随便组合,就能够定位到你要的东西。

「定位原则:」

定位也非常影响脚本的稳定性,如果定位做的不好,这个影响也是比较大的。

1.尽量不要使用绝对路径和下标。

2.通过定位方式唯一匹配元素,匹配一个元素,而且确保这个元素就是你要找的。

3.选择元素稳定的属性。(这样不至于元素一变动或者页面的内容一变动,这个元素对应的东西也变了。可变的属性不要作为元素定位手段)这个需要自己观察了。

3.元素操作

「页面最基本的 4 大操作(函数):」

send_keys:输入

click:点击

text:获取文本值

get_attribute:获取属性

在 APP 的 web 自动化中直接套用这 4 大操作。

针对特殊的元素做的一些处理:

「三种等待方式:」

sleep:强制等待

implicity_wait:隐形等待

WebdriverWait和expected_condition:显示等待

在实际工作过程当中,sleep会和WebdriverWait和expected_condition结合起来用。

sleep仅仅作为辅助作用,WebdriverWait和条件组合起来能够找到元素,但是在运行的时候会告诉我,这个元素还没有出现,这种情况下不用觉得它没有用。「再借助sleep0.5 秒或者 1 秒都可以。」 给页面一个缓冲的时间,虽然它可能找到了,但是可能页面渲染还没有成功。

sleep不应该睡眠太久,这样很浪费时间。WebdriverWait这个显性等待是我们用的最多的。WebdriverWait是一个类,它处理的是我们的等待。它有一个等待上限。

「显性等待的用法:」

WebdriverWait(driver,timeout,0.5 ).until/until_not 会话对象 超时时长(最多能等多久,隔多久看一眼) 默认是 0.5,可以改成别的数字

WebdriverWait有 2 个函数until/until_not,一个是直到条件满足,一个是直到条件不满足。

「怎么表达条件?」

条件就用expected_condition 期望的条件。可以用它来作为条件表达,条件表达最常用的就是元素可见。关于它的传参,是一个元组等等。visibility_of_element_located((元素定位类型,元素定位表达式))

还有元素存在,元素可点击等等。

「三种切换:」

三种切换都用到了等待。

iframe切换、window切换、alert弹框都有一个显性等待。

iframe切换是一定要有iframe才需要切换。一定要确保你的元素确实是在iframe里面。至于如何确认的,请回看文章《三种切换》。

iframe本质上也是一个元素,只不过它的标签名叫做iframe。但是它里面放的是个 web 页面。

APP 自动化中就有这样的情况,外面是一个安卓的控件元素,但是控件里面放的是 web 网页。这里也是一样的意思。iframe是外面的主页的一个元素控件。跟它里面放的是一个 html 页面含义是一样的。

在 App 自动化中 h5 的混合应用,也就是 web 网页和安卓原生控件混在一个页面中的时候,也要涉及切换,道理和iframe一样的。结合了iframewindows

「iframe切换可以根据哪些属性?」

name 下标 表达式 WebElement对象

以上这些都可以切换进去的。切换是这样做的:在我们 selenium Webdriver 当中切换是统一的driver.switch_to.frame/window/alert

APP 自动化中也是driver.switch_to。这个东西是通用的,只是后面跟的名字不一样。

「windows 的处理流程是:」

要获取当前所有的window_handle(driver.window_handle)得到的是一个列表。最后一个是最新打开的窗口。是根据它的句柄,也就是根据列表当中的位置去切换的。自己要清楚它在哪个位置。

alert弹框」

只有处理了alert才能对页面进行操作。一个浏览器当前直接只能有一个alert。它是一个alert类来处理的。alert当中有accetp\dissmis来表示接收和拒绝。

「鼠标/键盘操作」

鼠标:ActionChains类:这个类里面分为 2 种操作类型:

将所有的操作双击、点击、拖拽、右键这样的东西都是放在一个列表当中。

1.鼠标行为函数(move_to_element、悬浮元素的定位)。

2.perform()函数是用来执行鼠标操作的。

能不用鼠标就不用鼠标,如果有其它的按键操作就代替鼠标操作,因为鼠标操作不稳定。

APP 自动化中有一个东西的套路和ActionChains的套路是一样的。Web 自动化的基本东西和框架掌握了,那么 APP 自动化就没有什么难度。

「键盘操作」:send_keys(Keys)

send_keys(Keys类)本来就是用来发送数据的。1,2,3...等这样的简单数字就用send_keys()发就可以。

没必要用到 Keys 类。当你用到组合键的时候,就可以用 Keys 类。其它情况下,没事不用它。

「下拉列表:」

Select\option-Select类来处理。

Select类来处理,有哪 3 种选择的方式?实例化的时候传什么样的对象?

实例化类的时候,初始化参数是Select元素。

「列表选值的 3 种方式:」

index/value/visible_text

valuevalue属性。index是它在这个列表中所处的位置,从 0 开始。visible_text是指它的文本内容。

有哪个用哪个,如果value/visible_text没有,那么index是肯定可以用的。根据实际情况而定。

以上这些是特别的处理,其它的下拉列表,例如通过 div 实现的,等到下拉列表出现再去处理。像这种是不需要等到下拉列表出现的,直接省了这个步骤,也不需要你去点一下让它出现。

「js-滚动条:」

APP 其实也有滚动条的,但是做法有点点区别。滚动条是执行 js 语句。driver.execute_script(js语句,参数)

这个参数可以传很多个。这个参数是给 js 语句用的。

Arguments[0]scrollintoView()

传参 滚动到可见区域

默认是 True,与上边对齐。改成 False,是与下边对齐。

Arguments[0] 0 来自于这个driver.execute_script(js语句,参数)执行语句中的参数,是第一个参数。如果是第二个,就是Arguments[1]

「由参数的个数决定Arguments里面的下标值到底是几。」

至于滚动到页面底部和滚动到页面顶部,用scrollintoView()

另外一个 js 中的语法也可以做这个事情:scrollintoViewifneeded()

并不是一定要处理滚动条,看系统。如果框架实现了截图,截图里也看不到,元素是可见的但是提示你不可见,那就需要你将它滚动到可见区域。很多情况下是不需要将它滚动到可见区域的。

「js-日期:」

如果不好做这块的自动化就不要做了,就手点了。

日期输入框readonly属性。

也有可以编辑的时候,如果可以编辑就按照系统规定的格式输入。如果是不可以输入的,移除readonly属性,或者将它设置为 False。

「文件上传:」

autoit需要学习成本。在 mac 或者 linux 下面,用autoit

pywin32:专门针对 windows 做的文件上传。这块的代码在《利用 pywin32 库上传文件》一文里,你们直接拷贝就可以,不需要自己再写一遍了,明白你需要改的地方是什么就可以了,有需要的自取。

4.Selenium 运行原理

以命令的形式定义好了内部 http 通信协议。所有的命令都定义好了,所有的函数基本操作都是通过发送命令来实现的。详情请回看《元素定位和元素定位辅助工具》一文。

对原理有进一步的认知是比较好的。要成为一个会研究的人而不是只会用的人,所以多看源码。

5.项目实战+框架

1.业务了解,需求了解。(如果公司让你写一份自动化测试计划,这个就是整个自动化测试计划的一部分。前期就是要花时间了解业务的。)详细的请回看《做自动化之前的准备工作》一文。

2.测试用例的实现、筛选(多和团队人员交流,了解全方位的信息)、用例评审。

3.框架、大概用多少时间实现自动化测试用例、持续集成jenkins、优化和调试、提高用例通过率(通过率至少80%)、哪些是冒烟用例(什么时候/运行时长)、SIT/预生产、邮件通知。

4.维护阶段(分析测试报告--哪些是bug、哪些是你代码的bug、哪些是环境问题)

5.汇报。

在前期就应该明白哪些是冒烟用例,实现用例可能两个月,后期的调试需要半个月,调试是需要时间的,也不简单。什么时候冒烟,什么时候回归,每周运行多少次,周末要不要运行等这些运行策略,在最开始做的时候自己就要非常清楚的。

「框架:」

PO 模式:PageObjects(页面操作、元素定位)、TestCase(业务流程)、测试用例和测试对象分离。

进一步分层:PageLocators(页面元素定位)、TestDatas(测试数据的分离)

Common:basepage:封装基本函数、异常处理、失败截图、日志。

Outputs:Logs、Screenshots、Reports

pytest框架:mark、参数化、fixture/conftest.py、重运行(reruns)、html测试报告、allure测试报告、xml测试报告(定制化)

pytest 的 html 测试报告当中是可以插入自动化截图的,既然用了 Allure 就不需要这个功能了。

6.问题整理

Jenkins 中可以关联工程的执行顺序的。可以设置当前工程执行成功之后再去执行下一个工程。

「pytest 里面有个 skip 是什么?」

unittest 也有 skip。是指这个用例不想执行的话就跳过去。

「执行机和本机不能是同一台电脑。」

ps:假如领导让处理你不熟悉的领域的事,不要犹豫,赶紧去做。有什么不懂得可以多和上司沟通,自己不需要做决策,可以提供方案让领导来选择。遇事不退缩,勇敢面对。


公众号 「「清菡软件测试」首发,更多原创文章:清菡软件测试 78+原创文章,欢迎关注、交流,禁止第三方擅自转载。

Web自动化必会知识:「Web基础、元素定位、元素操作、Selenium运行原理、项目实战+框架」的更多相关文章

  1. web自动化01-自动化解决的问题-环境搭建-元素定位

    自动化测试 概念:由程序代码代替人工完成验证系统功能的过程 解决的问题: 回归测试 压力测试 兼容性测试 提高测试效率,提升产品质量 自动化测试分类 web自动化测试 移动自动化测试 接口自动化测试 ...

  2. CSS 基础:定位元素(3)<思维导图>

    这段时间利用一下间隙时间学习了CSS的基础知识,主要目的是加深对CSS的理解,虽然个人主要工作基本都是后台开发,但是个人觉得系统学习一下CSS的基础还是很有必要的.下面我学习CSS时做的思维导图(全屏 ...

  3. web自动化之前端知识

    下面这种写法只作用于这1个标签:  下面这种也是比较老的写法:  下面是常用的方式:把一个css样式放入到一个文件中,然后引用: 第三方引用的css一般是压缩过的,这样静态资源加载速度会比较快.  如 ...

  4. Java基础知识强化之多线程笔记05:Java程序运行原理 和 JVM的启动是多线程的吗

    1. Java程序运行原理:     Java 命令会启动Java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一个进程.该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 m ...

  5. selenium知识思维导图|从元素定位到操作断言,助你快速入门自动化测试

    为什么要进行自动化测试? 缩短测试周期,节省成本. 避免人为出错,提高准确性和可靠性. 获取需求覆盖率,代码覆盖率,提供衡量软件质量的指标. 自动化测试的条件? 手工测试完成后. 项目周期长,需求稳定 ...

  6. 0基础手把手教你搭建webpack运行打包项目(未完待续)

    这些天在项目之余的时间学习了webpack打包项目的东西,非常荣幸的找到一些大神的文章来学习,死劲嚼了几天,终于略知一二.在以后的工作上还需继续学习,下面我将分享我这几天学到的一点东西,希望能让我一个 ...

  7. 零基础 Vue 开发环境搭建 打开运行Vue项目

    [相关推荐]IntellIJ IDEA 配置 Vue 支持 打开Vue项目 所需文件 node.js环境(npm包管理器)(node-v8.11.3-x64.msi)(npmV5.6.0) cnpm ...

  8. Helium文档6-WebUI自动化-S用于通过id\name\classname\xpth定位元素

    前言 S方法可以灵活定位元素特别注意,比如to_left_of参数的使用是查找在某个元素左侧的元素,但是默认只会找第一个S方法可以灵活运用,特别是没有id,没有name,只有classname的情况, ...

  9. Web自动化框架LazyUI使用手册(1)--框架简介

    作者:cryanimal QQ:164166060 web端自动化简介 web端自动化,即通过自动化的方式,对Web页面施行一系列的仿鼠标键盘操作,以达到对Web页面的功能进行自动化测试的目的. 其一 ...

随机推荐

  1. 记node,elementui,formidable上传图片

    卡了很久甚至心态爆炸,搞了半天才能成功上传图片,结果图片上传的位置也有问题.头大 https://www.jianshu.com/p/3a61318c24d1 先是参考这个来弄好大致的部署. 然后中途 ...

  2. pdb 进行调试

    import pdb a = 'aaa' pdb.set_trace( ) b = 'bbb' c = 'ccc' final = a+b+c print(final) import pdb a = ...

  3. HTML <hr> 标签

    高佣联盟 www.cgewang.com HTML <hr> 标签 实例 当内容的主题发生变化时,使用 <hr> 标签进行分隔: <h1>HTML</h1&g ...

  4. PHP debug_zval_dump() 函数

    debug_zval_dump 函数用于查看一个变量在zend引擎中的引用计数.类型信息. 版本要求:PHP 4 >= 4.2.0, PHP 5, PHP 7高佣联盟 www.cgewang.c ...

  5. 7.6 NOI模拟赛 灯 根号分治

    比较容易想的题目~ 容易发现 点亮一种颜色的贡献=新增灯的数量-已经存在的边的条数. 用线段树维护并不容易.暴力的话复杂度是\(Q\cdot n\)的. 考虑根号分治 只单纯考虑度数<B的点的话 ...

  6. CF R638 div2 F Phoenix and Memory 贪心 线段树 构造 Hall定理

    LINK:Phoenix and Memory 这场比赛标题好评 都是以凤凰这个单词开头的 有凤来仪吧. 其实和Hall定理关系不大. 不过这个定理有的时候会由于 先简述一下. 对于一张二分图 左边集 ...

  7. SSRS - 请求因 HTTP 状态 401 失败: Unauthorized。

    原因: 1.SSRS报表服务器停止了,重启就可以了 2.用户没有权限 3.用户登录密码过期了,重设密码就可以了(如果用户是安装了client的话,直接让他远程登录改一下密码)

  8. SpringCloud系列之客户端负载均衡Netflix Ribbon

    1. 什么是负载均衡? 负载均衡是一种基础的网络服务,它的核心原理是按照指定的负载均衡算法,将请求分配到后端服务集群上,从而为系统提供并行处理和高可用的能力.提到负载均衡,你可能想到nginx.对于负 ...

  9. [转]new一个对象的过程中发生了什么?

    来自:沉默哥 | 公号 :程序员小乐 链接:cnblogs.com/JackPn/p/9386182.html Java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就 ...

  10. centos,linux环境下安装JDK1.8完整

    进入oracle官网下载安装包,cetos一般选择xx-xx-linux-x64.tar.gz.获取到地址后可以点击下载,也可以使用wget命令下载. 在得到下载好的文件后下面就可以开始安装了.比如我 ...