01-自动化测试基础--(selenium八股文部分+环境配置+八大定位)

自动化测试 

1.单元自动化测试

单元自动化测试是指对软件中的最小可测试单元进行检查和验证。

将单元测试交给测试人员去做,有利有弊,整体来说,由开发人员去做更为合适。

测试人员做单元测试的优势是具备测试思维,在设计测试用例时考虑更加全面;但劣

势也很明显,目前,大多数测试人员很难做到像开发人员一样熟悉被测代码。

让开发人员去写单元测试,优势非常明显,没有谁比开发人员更熟悉自己写的代码了

他们只需掌握单元测试框架的使用和一些常用的测试方法,即可写单元测试,而且定位 bug

时更加方便。

所以,测试人员可以教开发人员如何使用单元测试框架和测试方法,而不是代替开发

人员去写单元测试。

2.接口自动化测试

Web 应用的接口自动化测试大体分为两类:模块接口测试和协议接口测试。

1)模块接口测试,主要测试程序模块之间的调用与返回。它主要强调对一个可实现

完整功能的类、方法或函数的调用的测试。

2)协议接口测试,主要测试对网络传输协议的调用,如  HTTP/SOAP  等,一般应用

在前端和后端开发之间,以及不同项目之间。

模块接口测试更适合开发人员去做;协议接口测试既可以由开发人员去做,也可以由

测试人员去做。

3UI 自动化测试

UI 自动化测试以实现手工测试用例为主,可降低系统功能回归测试的成本(人力成本

和时间成本)。UI 自动化测试由部分功能测试用例提炼而来,更适合测试人员去做。

在《Google  测试之道》一书中,Google 把产品测试类型划分为:小测试、中测试和大

测试,采用 70%(小)、20%(中)和 10%(大)的比例,分别对应测试金字塔中的 Unit层、Service 层和 UI 层。 

2、适合自动化测试的项目

参考以下几点:

1)任务测试明确,不会频繁变动。

2)每日构建后的测试验证。

3)比较频繁的回归测试。

4)软件系统界面稳定,变动少。

5)需要在多平台上运行的相同测试案例、组合遍历型的测试,以及大量的重复任务。

6)软件维护周期长。

7)项目进度压力不太大。

8)被测软件系统开发较为规范,能够保证系统的可测试性。

9)具备大量的自动化测试平台。

10)测试人员具备较强的编程能力。

当然,并非以上 10 条都具备的情况下才能开展自动化测试工作。根据我们的经验,一

般来说,满足以下 3 个条件就可以对项目开展自动化测试。

1)软件需求变动不频繁。

(2)项目周期较长。

3)自动化测试脚本可重复使用。

 2 章  测试环境搭建

1、安装 Python

官网:https://www.python.org

2 、安装 Selenium

通过“pip”命令安装 Selenium 包。

>  pip  install  selenium

3、安装浏览器驱动

告诉我们需要将 Chrome 浏览器对应的 ChromeDriver 驱动文件添加到“环境变量”的

Path 中。

各浏览器驱动下载地址如下。

GeckoDriverFirefox):https://github.com/mozilla/geckodriver/releaseshttp://https//github.com/mozilla/geckodriver/releases

ChromeDriverChrome):https://sites.google.com/a/chromium.org/chromedriver/homehttp://https//sites.google.com/a/chromium.org/chromedriver/home

IEDriverServerIE):http://selenium-release.storage.googleapis.com/index.htmlhttp://selenium-release.storage.googleapis.com/index.html

OperaDriverOpera):https://github.com/operasoftware/operachromiumdriver/releaseshttp://https//github.com/operasoftware/operachromiumdriver/releases

MicrosoftWebDriverEdge):

https://developer.microsoft.com/en-us/microsoft-edge/tools/http://https//developer.microsoft.com/en-us/microsoft-edge/tools/webdriver

webdriver

1.设置浏览器驱动

设置浏览器的方式非常简单。我们可以手动创建一个存放浏览器驱动的目录,如

D:\drivers,将下载的浏览器驱动文件(例如 ChromeDriverGeckoDriver)放到该目录下。

右击“此电脑”,在右键菜单中单击“属性→高级系统设置→高级→环境变量→系统变量→Path”,将“D:\drivers”目录添加到 Path 中。

变量名:Path

变量值:;D:\ drivers

2.验证浏览器驱动

下面验证不同的浏览器驱动是否能正常使用,当然,你需要在操作系统中安装这些浏

览器。

from  selenium  import  webdriver

driver = webdriver.Firefox() # Firefox 浏览器

driver = webdriver.Chrome() # Chrome 浏览器

driver = webdriver.Ie() # Internet  Explorer 浏览器

driver = webdriver.Edge() # Edge 浏览器

driver = webdriver.Opera() # Opera 浏览器

第一个 Selenium 自动化测试脚本

下面编写第一个 Selenium 自动化测试脚本,创建 test_baidu.py 文件。

from  selenium  import  webdriver

driver  =  webdriver.Chrome()
driver.get("https://www.baidu.com")

driver.find_element_by_id("kw").send_keys("Selenium")
driver.find_element_by_id("su").click()

driver.quit()

第 1 行代码,导入 selenium 下面的 webdriver 模块。
第 2 行代码,调用 webdriver 模块下的 Chrome()类(注意大小写),赋值给变量 driver。
第 3 行代码,通过 driver 变量,调用 Chrome()类提供的 get()方法访问百度首页。
第   4、5   行代码,通过   find_element_by_id()方法分别定位页面上的元素,并且通过
send_keys()和 click()做输入、单击操作。
第 6 行代码,通过 quit()关闭浏览器。

第三章 python基础

(见作者的python专栏)

第四章 WebDriver

4.1 从定位元素开始

WebDriver 提供了 8 种元素定位方法,在 Python 中,对应的方法如下:
	id 定位	→	find_element_by_id()
	name 定位	→	find_element_by_name()
	tag 定位	→	find_element_by_tag_name()
	class 定位	→	find_element_by_class_name()
	link_text	→	find_element_by_link_text()
	partial link 定位	→	find_element_by_partial_link_text()
	XPath 定位	→	find_element_by_xpath()
	CSS_selector 定位	→	find_element_by_css_selector()
4.1.1	id 定位

HTML 规定,id 在 HTML 文档中必须是唯一的,这类似于我国公民的身份证号,具有
唯一性。WebDriver 提供的 id 定位方法是通过元素的 id 来查找元素的。通过 id 定位百度输
入框与百度搜索按钮的用法如下。

find_element_by_id("kw")
find_element_by_id("su")

find_element_by_id()方法是通过 id 来定位元素的。

4.1.2	name 定位

HTML 规定,name 用来指定元素的名称,因此它的作用更像是人的姓名。通过 name
定位百度输入框的用法如下。

find_element_by_name("wd")

find_element_by_name()方法是通过 name 来定位元素的。

4.1.3	class 定位

HTML 规定,class 用来指定元素的类名,其用法与 id、name 类似。通过 class 定位百
度输入框的用法如下。

find_element_by_class_name("s_ipt")

find_element_by_class_name()方法是通过 class 来定位元素的。

4.1.4	tag 定位

HTML 通过 tag 来定义不同页面的元素。例如,<input>一般用来定义输入框,<a>标签
用来定义超链接等。不过,因为一个标签往往用来定义一类功能,所以通过标签识别单个
元素的概率很低。例如,我们打开任意一个页面,查看前端代码时都会发现大量的<div>、
<input>、<a>等标签。


通过标签名(tag name)定位百度输入框的用法如下。

find_element_by_tag_name("input")

find_element_by_tag_name()方法是通过元素的标签名来定位元素的。

4.1.5	link 定位

link  定位与前面介绍的几种定位方法有所不同,它专门用来定位文本链接。百度输入
框上面的几个文字链接的代码如下。
<a class="mnav" name="tj_trnews"  href="http://news.baidu.com">新闻</a>
<a class="mnav" name="tj_trhao123"  href="http://www.hao123.com">hao123</a>
<a class="mnav" name="tj_trmap"  href="http://map.baidu.com">地图</a>
<a class="mnav" name="tj_trvideo"  href="http://v.baidu.com">视频</a>
<a class="mnav" name="tj_trtieba"  href="http://tieba.baidu.com">贴吧<a>

查看上面的代码可以发现,通过  name  定位是个不错的选择。不过这里为了演示  link
定位的使用,现给出通过 link 定位链接的用法如下。
find_element_by_link_text("新闻")
find_element_by_link_text("hao123")
find_element_by_link_text("地图")
find_element_by_link_text("视频")
find_element_by_link_text("贴吧")

find_element_by_link_text()方法是通过元素标签对之间的文字信息来定位元素的。

4.1.6	partial link 定位

partial  link 定位是对 link  定位的一种补充,有些文字链接比较长,这个时候我们可以
取文字链接的部分文字进行定位,只要这部分文字可以唯一地标识这个链接即可。
<a  class="mnav"  name="tj_lang"  href="#">一个很长的文本链接</a>

通过 partial link  定位链接的用法如下。
find_element_by_partial_link_text("一个很长的")
find_element_by_partial_link_text("文本链接")

find_element_by_partial_link_text()方法是通过元素标签对之间的部分文字定位元素的。
前面介绍的几种定位方法相对来说比较简单,在理想状态下,一个页面当中每个元素

都有唯一的 id 值和 name 值,可以通过它们来查找元素。但在实际项目中并非想象得这般
美好,有时候一个元素没有 id 值和 name 值,或者页面上有多个元素属性是相同的;又或
者 id 值是随机变化的,在这种情况下,如何定位元素呢?
下面介绍 XPath 定位与 CSS 定位,与前面介绍的几种定位方式相比,它们提供了更加
灵活的定位策略,可以通过不同的方式定位想要的元素。

4.1.7	XPath 定位

在 XML 文档中,XPath 是一种定位元素的语言。因为 HTML 可以看作 XML 的一种实
现,所以 WebDriver 提供了这种在 Web 应用中定位元素的方法。

1.绝对路径定位

XPath 有多种定位策略,最简单直观的就是写出元素的绝对路径。如果把元素看作人,
假设这个人没有任何属性特征(手机号、姓名、身份证号),但这个人一定存在于某个地
理位置,如 xx 省 xx 市 xx 区 xx 路 xx 号。对于页面上的元素而言,也会有这样一个绝对地
址。

参考开发者工具所展示的代码层级结构,我们可以通过下面的方式找到百度输入框和
百度搜索按钮。

find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")
find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span[2]/input
")

find_element_by_xpath()方法是用 XPath 来定位元素的。这里主要用标签名的层级关系
来定位元素的绝对路径,最外层为 html,在 body 文本内,一级一级往下查找。如果一个层
级下有多个相同的标签名,那么就按上下顺序确定是第几个。例如,div[2]表示当前层级下
第二个 div 标签。

2.利用元素属性定位

除使用绝对路径外,XPath 还可以使用元素的属性值来定位。

find_element_by_xpath("//input[@id='kw']")
find_element_by_xpath("//input[@id='su']")

//input 表示当前页面某个 input 标签,[@id='kw']  表示这个元素的 id 值是 kw。下面通



第 4 章   WebDriver API  ∣  47


过 name 和 class 来定位。

find_element_by_xpath("//*[@name='wd']")
find_element_by_xpath("//*[@class='s_ipt']")

如果不想指定标签名,那么可以用星号(*)代替。当然,使用 XPath 不局限于 id、name
和 class  这三个属性值,元素的任意属性都可以使用,只要它能唯一标识一个元素。

find_element_by_xpath("//input[@maxlength='100']")
find_element_by_xpath("//input[@autocomplete='off']")
find_element_by_xpath("//input[@type='submit']")

3.层级与属性结合

如果一个元素本身没有可以唯一标识这个元素的属性值,那么我们可以查找其上一级
元素。如果它的上一级元素有可以唯一标识属性的值,就可以拿来使用。参考  baidu.html
文本。
…
<form  id="form"  class="fm"  action="/s"  name="f">
<span  class="s_ipt_wr">
<input id="kw" class="s_ipt" autocomplete="off" maxlength="100"	name="wd">
</span>
<span  class="s_btn_wr">
<input  id="su"  class="bg  s_btn"  type="submit"  value="百度一下">
</span>
…

假如百度输入框没有可利用的属性值,那么可以查找它的上一级属性。例如,小明刚
出生的时候没有名字,也没有身份证号,那么亲朋好友来找小明时可以先找到小明的爸爸,
因为他爸爸是有很多属性特征的。找到小明的爸爸后,就可以找到小明了。通过 XPath 描
述如下:

find_element_by_xpath("//span[@class='bg  s_ipt_wr']/input")

span[@class='s_ipt_wr']  通过 class 定位到父元素,后面的/input 表示父元素下面的子元
素。如果父元素没有可利用的属性值,那么可以继续向上查找父元素的父元素。

find_element_by_xpath("//form[@id='form']/span/input")
find_element_by_xpath("//form[@id='form']/span[2]/input")

我们可以通过这种方法一级一级向上查找,直到找到最外层的<html>标签,那就是一个绝对路径的写法了。

4.使用逻辑运算符

如果一个属性不能唯一区分一个元素,那么我们可以使用逻辑运算符连接多个属性来
查找元素。

find_element_by_xpath("//input[@id='kw'  and  @class='s_ipt']")

and 表示必须满足两个条件来定位元素。

5.使用 contains 方法

contains 方法用于匹配一个属性中包含的字符串。例如,span 标签的 class 属性为“bg
s_ipt_wr”。

find_element_by_xpath("//span[contains(@calss,'s_ipt_wr')]/input")

contains 方法只取了 class 属性中的“s_ipt_wr”部分。

6.使用 text()方法

text()方法用于匹配显示文本信息。例如,前面通过 link text 定位的文字链接。
find_element_by_xpath("//a[text(),'新闻')]")

当然,contains 和 text()也可以配合使用。
find_element_by_xpath("//a[contains(text(),'一个很长的')]")

它实现了 partial link 定位的效果。

4.1.8	CSS 定位

CSS 是一种语言,用来描述 HTML 和 XML 文档的表现。CSS 使用选择器为页面元素
绑定属性。

CSS 选择器可以较为灵活地选择控件的任意属性,一般情况下,CSS 定位速度比 XPath
定位速度快,但对于初学者来说,学习起来稍微有点难度,下面介绍 CSS 选择器的语法与
使用。

CSS 选择器的常见语法如表 4-1 所示。

下面同样以百度输入框和百度搜索按钮为例,介绍 CSS 定位的用法。
…
<span  class="bg  s_ipt_wr">
<input  id="kw"  class="s_ipt"  autocomplete="off"  maxlength="100"   name="wd">
</span>
<span  class="bg  s_btn_wr">
<input  id="su"  class="s_btn"  type="submit"  value="百度一下">
</span>
…

1.通过 class 定位

find_element_by_css_selector(".s_ipt")
find_element_by_css_selector(".s_btn")

find_element_by_css_selector()方法用于在  CSS  中定位元素,点号(.)表示通过  class
来定位元素。

2.通过 id 定位

find_element_by_css_selector("#kw")
find_element_by_css_selector("#su")

井号(#)表示通过 id 来定位元素。

3.通过标签名定位

find_element_by_css_selector("input")

在 CSS 中,用标签名定位元素时不需要任何符号标识,直接使用标签名即可。


4.通过标签层级关系定位

find_element_by_css_selector("span  >  input")

这种写法表示有父元素,父元素的标签名为 span。查找 span 中所有标签名为 input 的
子元素。

5.通过属性定位

find_element_by_css_selector("[autocomplete=off]")
find_element_by_css_selector("[name='kw']")
find_element_by_css_selector('[type="submit"]')

在 CSS 中可以使用元素的任意属性定位,只要这些属性可以唯一标识这个元素。对属
性值来说,可以加引号,也可以不加,注意和整个字符串的引号进行区分。

6.组合定位

我们可以把上面的定位策略组合起来使用,这就大大加强了定位元素的唯一性。

find_element_by_css_selector("form.fm  >  span  >  input.s_ipt")
find_element_by_css_selector("form#form  >  span  >  input#kw")

我们要定位的这个元素标签名为 input,这个元素的 class 属性为 s_ipt;并且它有一个
父元素,标签名为 span。它的父元素还有父元素,标签名为 form,class 属性为 fm。我们
要找的就是必须满足这些条件的一个元素。

7.更多定位用法

find_element_by_css_selector("[class*=s_ipt_wr]")

查找 class 属性包含“s_ipt_wr”字符串的元素。

find_element_by_css_selector("[class^=bg]")

查找 class 属性以“bg”字符串开头的元素。

find_element_by_css_selector("[class$=wrap]")

查找 class 属性以“wrap”字符串结尾的元素。

find_element_by_css_selector("form  >  input:nth-child(2)")

查找 form 标签下面第 2 个 input 标签的元素。


CSS   选 择 器 的 更 多 用 法 可 以 查 看   W3CSchool   网 站 中 的   CSS   选 择 器 参 考 手 册
(http://www.w3school.com.cn/cssref/css_selectors.asp)。
通过前面的学习我们了解到,XPath 和 CSS 都提供了非常强大而灵活的定位方法。相
比较而言,CSS  语法更加简洁,但理解和使用的难度要大一点。根据笔者的经验,这两种
定位方式我们只需掌握一种即可解决大部分定位问题,至于选择哪一种就看读者的个人喜
好了。

4.1.9  By 定位元素

针对前面介绍的   8   种定位方法,WebDriver   还提供了另外一套写法,即统一调用
find_element()方法,通过 By 来声明定位,并且传入对应定位方法的定位参数,具体如下。

find_element(By.ID,"kw")
find_element(By.NAME,"wd")
find_element(By.CLASS_NAME,"s_ipt")
find_element(By.TAG_NAME,"input")
find_element(By.LINK_TEXT,"新闻")
find_element(By.PARTIAL_LINK_TEXT,"新")
find_element(By.XPATH,"//*[@class='bg  s_btn']")
find_element(By.CSS_SELECTOR,"span.bg  s_btn_wr>input#su")

find_element()方法只用于定位元素,它需要两个参数。第一个参数是定位的类型,由
By 提供;第二个参数是定位的值,在使用 By 之前需要先导入。

from  selenium.webdriver.common.by  import  By

通过查看 WebDriver 的底层实现代码可以发现,它们其实是一回事儿。

from  selenium.webdriver.common.by  import  By

通过查看 WebDriver 的底层实现代码可以发现,它们其实是一回事儿。对于 Web 自动化来说,学会元素的定位相当于自动化已经学会了一半,剩下的就是学

对于 Web 自动化来说,学会元素的定位相当于自动化已经学会了一半,剩下的就是学会使用 WebDriver 中提供的各种方法,接下来我们将通过实例介绍这些方法的具体使用。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老板来片烤面包

君子博学于文,赠之以礼,谢君~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值