[运营专题]零预算引爆个人和企业品牌【原文链接】
原来这样做,才能向架构师靠近【原文链接】
Cordova App 打包全揭秘【原文链接】
TensorFlow on Android:物体识别【原文链接】
TensorFlow on Android:训练模式【原文链接】
图解敏捷教练和 ScrumMaster【原文链接】

说在前面:达人课是GitChat的一款轻阅读产品,由特约讲师独家发布。每一个课程你都可获得6-12篇的深度文章,同时可在读者圈与讲师互动交流。GitChat达人课,让技术分享更简单。进入我的GitChat

作者简介

本文作者就职于中科软科技股份有限公司高级测试工程师-王海宝(勇气老师),3年以上软件测试经验,擅长接口测试、自动化测试,对分布式测试有独到的见解,擅长测试分析。下面一起看看勇气老师如何带大家从零开始。查看原文

课程简介

本课程注重自动化实践,同时讲解一些基础的自动化测试理念,以及常用的 Java 思维,以便快速理解并掌握自动化测试体系、掌握自动化测试的基础核心内容以及自动化框架的整合实现。以“亚马逊购物流程”为例,着重讲解调用被测元素、测试框架 TestNG 的使用,尽量做到让刚入门自动化的读者也能感受到自动化的魅力。

导读:自动化定位解析

写在前面的话

测试自动化是现在的一种趋势,更是许多厌倦功能测试想转型高端测试的测试从业者的迫切需求。关于测试自动化的资料比比皆是,但是杂乱无章,而且好多知识只是一带而过,并且更多针对 Selenium 这块的测试以 Python 语言居多,Java 语言很少。其实,Java 语言更加灵活,毕竟面向对象语言中 Java 才是当之无愧的王者。

怎样良好的整合 Java 知识与 Selenium 完美结合,是本课要讲解的内容,同时,会以实际案例来逐步引出 Selenium 的使用。课程主要有以下特色:

(1)内容由浅入深,零基础自动化人员也能看得懂。

(2)始终以解决实际问题为出发点,通过实际案例引出 Selenium 的相关知识,最大限度的避免课程枯燥,用生动的语言来描述自动化。

(3)细化每个实施的细节,希望讲解一个知识点就能彻底的讲透,并且会以一种由浅入深的形式进行讲解。

说了这么多,希望读者阅读完全部文章后会以最大限度的掌握自动化,并且爱上自动化!好了,下面开始步入正题。

准备工作

“工欲善其事必先利其器”,做自动化也是如此,所以先花一点时间来介绍要准备的工作。

(1)软件工具准备:JDK 和 Eclipse,搭建 Java 的开发环境,需要注意的是二者的版本必须统一,即 32 位的 JDK 必须对应 32 位的 Eclipse。

(2)框架软件准备:TestNG

安装方式有两种:

  • help-Eclipse Markplace 市场查找下载安装。 在 TestNG 官网上下载对应版本的插件,help-Install
  • new Software 安装已经下载好的插件。

当然所有的插件安装都是这两种方式。

(3)Foxfire(火狐浏览器,建议使用 30~32 版本,目前最新的版本兼容性不好且对插件的支持不够理想)。在火狐浏览器里要下载其插件,必须使用的有:

  • Firebug+firepath 用来辅助我们进行元素定位。
  • Selenium IDE 主要用来验证自动化脚本是不是与实际情况一致。

需要说明的是,Selenium IDE 本身就有用来做简单 UI 界面录制回放的功能。

(4)Google Chrome(谷歌浏览器),演示的时候可能只调用火狐浏览器,但是谷歌浏览器是当前 UI 自动化测试的首选,因为其稳定,插件更新快。

(5)必要的 jar 包

  • log4j-1.2.11.jar,用来支持日志功能的 jar。
  • selenium-server-standalone-2.43.1.jar,核心 jar 必须要有。

(6)浏览器必要的 driver

  • 谷歌的 chromedriver.exe。
  • IE 的 IEDriverServer64.exe。
  • Windows 10 自带的 Microsoft Edge 的 Microsoft WebDriver。

写到这里有可能会问,为什么需要这么多的 driver,其实如果只针对一套流程进行自动化操作,只需要操作一个浏览器即可,但是如果想用同一个流程验证不同浏览器的兼容性时,那么需要同时启动多个浏览器,所以提前准备好主流浏览器的 driver,对我们的工作来说是非常有必要的。

上面的工作全都完成,在 Eclipse 里创建一个纯净的自动化工作目录,将下载好的插件、驱动、jar 都配置好,此时 Eclipse 的工程目录如下图所示:

其中 files 是新建的目录,用来存储各种浏览器的驱动。lib 也是新建的目录,用来存储各种 jar 包。当然,这两个文件的名称都可以自行改变。好了准备工作到此结束,下面进行定位的讲解。

定位实战
- UI 自动化的实质其实就是做下面两件事情:
- 定位到 Web 界面的被测试元素;
对定位到的元素进行录入、单击、双击、拖拽、上传文件、清空等等操作的过程。

请看下面的例子。
(1)打开百度网站的首页:

(2)在输入框输入 GitChat:

此场景运用自动化的思维解决就是:首先要打开一个浏览器 | 在导航栏处输入百度的网址 | 定位到输入框 | 键盘敲入 GitChat 的过程。操作火狐浏览器实现 Java 代码如下:

package com.test.baidu;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;public class Baidu {
public static void main(String[] args) {//启动火狐浏览器WebDriver driver = new FirefoxDriver();//将导航栏导航到百度首页driver.navigate().to("http://www.baidu.com");//定位到输入框WebElement element = driver.findElement(By.id("kw"));//输入 GitChatelement.sendKeys("GitChat");}
}

这里重点先讲解里面的定位问题:

WebElement element = driver.findElement(By.id("kw"));

定位方式

常用的定位方式如下:

这些都是常用的定位方式,有 by.id、by.name、by.cssSelector、by.xpath 等等。其中除了 by.cssSelector、by.xpath 外,其他的 by 后面的 id、name、link Text 等指的是 HTML 标记语言中页签内的属性内容,如百度输入框的 HTML 源代码如下:

<span class="bg s_ipt_wr quickdelete-wrap ipthover">
<span class="soutu-btn"/>
<input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd"/>
<a id="quickdelete" class="quickdelete" href="javascript:;" title="清空" style="top: 0px; right: 0px; display: none;"/>
</span>

这段代码里的 class、id 就是属性。所以针对百度输入框我们使用的是其 id 的属性。

xpath 定位

首先要明白为什么使用 xpath 定位,它的好处有如下几个方面:

  • 方便维护
  • 定位准确
  • 推荐以后大家无论任何被测试对象都采用 xpath 定位的方式

其次需要了解 xpath 常用符号说明,常用的符号及含义如下所示:
- /:表示绝对路径,绝对路径是指从跟目录开始
- //:表示相对路径
- .:表示当前层
- ..:表示上一层
- *:表示通配符
- @:表示属性
- []:属性的判断条件表达式

最后运用上面的符号结合 xapth 的相关语法进行定位演示。

演示场景

任找一个 HTML 网页进行定位实战,按照页面代码结构逐级定位得出的结果解释如下,希望通过下面的逐级定位内容能理解相对路径、HTML 的层级结构。

(1)/html/div:没有节点可以被选择,因为 / 代表绝对路径,本定位表示的是 HTML 下一级目录的元素,很明显 HTML 的下一级是 head 和 body,所以本写法无法定位到任何元素。

(2)/html//div:选中 HTML 标签中的所有 div 元素,// 相对路径。就完全等价于 //div 的写法。

(3)//div/div 表示所选择的 div 元素下又包含 div 元素的所有元素。此时完全等价于 //div/div/. 的写法。

(4)//div/div/..:表示 //div/div 定义到的上一层 div 上。

(5)//div/div/*:此时会将 div 下的子节点含有 div 的这层节点下的所有元素都匹配到。

(6)//div[@id=”input”]:此时表示在 div 目录下选择一个 id=input 的子节点。

and 与 or 连接符在 xpath 中的使用

and 的使用:此种定位的应用场景为下图所示:

此种场景的 HTML 编码为:

<td class="widgetStyle">
<div id="radio">
<input class="Volvo" type="radio" name="identity"/>
<label>Volvo</label>
<br/>
<input class="Saab" type="radio" name="identity"/>
<label>Saab</label>
<br/>
<input class="Opel" type="radio" name="identity"/>
<label>Opel</label>
<br/>
<input class="Audi" type="radio" name="identity"/>
<label>Audi</label>
</div>

此时我们想定位到 Saab 怎么写呢?(当然也可以不使用 and 连接符进行书写)书写为://input[@class=”Saab” and @name=”identity”],当然若写成 //input[@class=”Saab”] 肯定也不会有问题。

or 的使用:如果定位到 Saab 或者定位到 Opel,此时书写方式为://input[@class=”Saab” or @class=”Opel”]。

定位顺序(从1开始切记)

现在学习第二种方式,比如定位 Saab。可以这样写://input@name=’identity’,同理定位 Volvo,//input@name=’identity’(这就是一开始强调的,这种写法必须从 1 开始编号)。

  • 定位 Opel,写成://input@name=’identity’
  • 定位 Audi,写成://input@name=’identity’

常用函数

Xpath 定位还可以使用一些函数,常用的函数如下:

(1)contains():包含。若要匹配出 Saab 还可以这样写://input[@name=”identity” and contains(@class,’S’)]

(2)text():一个节点的文本值。举个例子,这里面篮字显示的英文结果,HTML 代码为:

<a target="_self" href="/s?rsv_idx=1&amp;wd=111&amp;usm=3&amp;ie=utf-8&amp;sl_lang=en&amp;rsv_srlang=en&amp;rsv_rq=en&amp;rqlang=cn">英文结果</a>

可见这四个字没有任何属性值信息,所以定位此信息的时候需要使用 text() 函数。场景如下图所示:

此时定位英文结果即可使用://a[text()=”英文结果”]

(3)last()函数,定位 Audi 写成 //input@name=’identity’,可以看到 Audi 这个元素本身就处于 input 最后一个了,此时可以使用 last() 函数进行匹配://input[@name=”identity”][last()]。

(4)starts-with:以 starts-with 为开头写法实例://input[starts-with(@id,’user’)]代表 input 下 id 以 user 为开头的元素。

(5)not():表示否定,一般情况下会与返回值为 true 或者 false 的函数组合起来使用。比如上面提到的 contains() 与 starts-with。

用实例来说:现在想要定位到不是 Audi 车除外的三种车元素,此时写法为://input[@name=”identity” and not (contains(@class,’A’))]。

当然 not() 还有一种特殊用法就是直接 Not。//input[not(@class)] 表示匹配出 input 下所有不含 class 属性的元素。

总结:唯一需要注意的是所有函数的写法 function(@属性,’内容’)。

Xpath 轴定位说明

(1)基本轴

轴可以在位置路径中快捷引用特定的节点(忽略属性和名称空间节点)。child 例子:

 "child::*"当前节点的子节点。  "child::childnodename"当前节点名为childnodename的子节点。"child::text()" 当前节点文本子节点。 "child::node()"当前节点的子节点。"child::*/child::nodename"取当前节点的子节点的名为nodename的子节点。

(2)特殊轴

self 当前节点

descendant 当前节点的后代(子节点或子节点的子节点…)

parent 当前节点的父节点

ancestor 当前节点的祖先节点(父节点和父节点的父节点…)

preceding 按文档顺序位于当前节点之前的非祖先节点

attribute 当前节点的属性

namespace 当前节点的名称空间

preceding-sibling 当前节点之前的所有兄弟节点

following 当前节点之后的所有节点

following-sibling 当前节点之后的所有兄弟节点

descendant-or-self 当前节点和后代节点

ancestor-or-self 当前节点和祖先节点

以上的两种轴类型,没什么好说的,先记住吧。具体怎么用请看下面实例。

第一个实例:继续定位上述中的 Volvo,使用 xpath 轴书写如下://div[@id=”radio”]/descendant::input1 也可以定位到。

第二个实例:定义 Audi 上的所有节点,使用 xpath 轴写法如下://input[@name=”identity” and @class=”Audi”]/preceding-sibling::*

(3)需要注意的几个问题。

[] 后面需要跟 /,/ 后面在加上关键字。

轴关键字后面必须使用 ::,这个后面可以接节点名称,如 input、div 等。如果后面跟的是 *,代表全部。

轴后面接节点名称是节点前面的定位方式全部可以继续适用。

对于轴的使用建议是能不用就不用,条条大路通罗马,没必要非使用轴进行定位。

cssSelector 定位

了解即可,能用 xpath 就不用 cssSelector。原因很简单,HTML 的代码我们更熟悉。

CSS 常用符号说明

  • #表示 id
  • .表示class
  • : 表示子元素,层级

值得注意的是:一个空格也表示子元素,但是所有的后代子元素,就相当于 xpath 中的相对路径。

想知道所有的 CSS 属性建议搜索其他资料学习下。

最后请记住定位没有最好,只有是否合适。选择最合适的定位方法,就能使得定位变得得心应手。

下一篇

课程内容

导读:自动化定位解析

第01课:自动化编程的两大重点

第02课:基于 Selenium 3.0 启动与配置浏览器

第03课:亚马逊购物流程实战

第04课:亚马逊购物流程分析

第05课:工程化整合自动化代码

第06课:TestNG 与断言类的使用

第07课:Page Object 自动化框架实施

Selenium 自动化测试从零实战相关推荐

  1. 一套完整的Selenium自动化测试框架设计实战,这次38K, 妥了

    金九银十,大家都铆足干劲想抓住机会涨薪进大厂.结合这几年的行业趋势,想要挑战大厂面试,首先必须吃透Selenium自动化测试框架设计. 这里说一下原因: 首先,一线互联网大厂无一例外,全都要求测试人掌 ...

  2. Selenium 自动化测试从0实战经验

    测试自动化是现在的一种趋势,更是许多厌倦功能测试想转型高端测试的测试从业者的迫切需求.关于测试自动化的资料比比皆是,但是杂乱无章,而且好多知识只是一带而过,并且更多针对 Selenium 这块的测试以 ...

  3. element 登录_Python selenium自动化测试框架入门实战--登录测试案例

    本文为Python自动化测试框架基础入门篇,主要帮助会写基本selenium测试代码又没有规划的同仁. 本文应用到POM模型.selenium.unittest框架.configparser配置文件. ...

  4. 自动化测试 | Selenium自动化测试框架,实战遇到的坑都在这了,玩转自动化测试

    目录:导读 前言 一.浏览器出现新的页面 二.下拉选框的选择 三.常用的键盘事件 四.切换Frame(重要) 五.常见报错:element not interactble 六.属性几乎相同的div等元 ...

  5. python自动化测试登录_Python selenium自动化测试框架入门实战--登录测试案例

    本文为Python自动化测试框架基础入门篇,主要帮助会写基本selenium测试代码又没有规划的同仁. 本文应用到POM模型.selenium.unittest框架.configparser配置文件. ...

  6. (七)Selenium自动化测试实战—工具开发

    上一篇:(六)Selenium自动化测试实战-unittest框架_要开朗的spookypop的博客-CSDN博客 之前的自动化测试实践都是基于代码的管理,需要测试人员都有一样的代码水平,在公司推广起 ...

  7. 【软件测试】自动化测试战零基础教程——Python自动化从入门到实战(一)

    第一章:自动化测试基础 第一节 软件测试分类 关于软件测试领域名词颇多,发现有许多测试新手混淆概念,从不同的角度可以将软件测试有不同的分类的方法:所以,这里汇总常见软件测试的相关名词,对软件测试领域有 ...

  8. (五)Selenium自动化测试实战—PO模式

    上一篇:(四)selenium自动化测试之上传本地文件_要开朗的spookypop的博客-CSDN博客_selenium上传本地文件 先看下测试代码运行效果: 在做自动化测试时,测试框架设计很重要,测 ...

  9. selenium自动化测试实战案例哔哩哔哩信息至Excel

    文章目录 前言 明确目标 最终效果 开发环境 思路分析 实现步骤 运行效果 以下是全部代码 前言 最近在B站学习知识,于是看完了视频就想着练习一下巩固一下知识,就地取材的做了个B站selenium小项 ...

最新文章

  1. 9 个技巧让你的 PyTorch 模型训练变得飞快!
  2. Java反射机制实例解析
  3. js目标时间与当前时间差转换年月日天数
  4. Java中JDBC连接数据库(MySQL)
  5. 统计字符串元素出现的个数_LeetCode 1295. 统计位数为偶数的数字
  6. log4j每天生成一份html格式的日志
  7. git删除某次提交(某个commit)的方法【转】
  8. Codeforces Round #383 (Div. 1): D. Arpa’s letter-marked tree…(dsu on tree+状压)
  9. 我国终于有了密码法,将2020年1月1日起施行!
  10. 搭建一个基于 Vue + Vant 的移动端项目模板
  11. Linux内核同步原语之原子操作(Atomic)
  12. jQuery源码分析-10事件处理-Event-事件绑定与删除-bind/unbind+live/die+delegat/unde
  13. C入门学习之水仙花数个人总结
  14. Gradle(古rua都)vs Maven(马文)
  15. cocos2d-x传智播客_10年和超过520集播客-科技是一场马拉松,而不是短跑
  16. QT FTP上传文件
  17. 栅格计算器函数之Con
  18. Day09 - 面向对象进阶
  19. vps服务技术的5大优势
  20. update 在mysql_update SQL在MySQL的内部生命历程是怎样的?

热门文章

  1. Anaconda 下安装xgboost的最简单最快速方法
  2. cloudflare免费证书_使用百度云加速免费加速你的博客
  3. c语言求偶数的积,动物行为学1
  4. 手工注入完成SQL注入漏洞
  5. AI会P图:你来描述,我来P
  6. Dashboard的安装及其配置
  7. 执行RMAN恢复的高级场景_还原使用旧版本的RMAN创建的备份
  8. 1.27 Watermelon
  9. Android 实现微信语音聊天
  10. 【java初学】List集合