软件测试入门自学笔记(7)web自动化测试

1.day1-初识自动化测试

常用工具:QTP、selenium、RFT、watir、sahi

使用自动化测试的条件

   1)手工测试已经完成,后期不影响进度;

   2)项目周期长,重复性工作给机器去实现;

   3)需求稳定,项目变动不大;

   4)自动化测试脚本复杂度比较低;

   5)可重复利用。

场景

   1)频繁的回归测试;

   2)冒烟测试;

   3)互联网迭代频繁;

   4)传统行业需求变化不大,应用频繁;

   5)性能测试

Xpath的写法和css选择器的写法

元素定位:计算机通过一系列计数手段找到元素(按钮、输入框、模拟键盘等)

Xpath:xml路径语言,是一种用来在html/xml文档中查找信息的语言。

   Xml 可拓展标记语言,传输和存储数据

   Html 超文本标记语言,展示数据

   Xpath

   通过节点名定位(http://www.ifeng.com/)

   html                     定位到html节点

   html/head                定位到head节点

   html/head/meta              定位好head中的所有meta节点

   相对路径定位节点(http://www.ifeng.com/)

   //title                     使用相对路径定位到title节点

   //meta                   使用相对路径定位到所有meta节点

   使用.和..定位本身和父节点(http://www.ifeng.com/)

   /html/head/title/./..       使用.定位到title本身再使用..定位到title的父节点

   /html/head/title/./../body  使用.定位到title本身再使用..定位到title的父节点,然后在定位到body子节点

   通过@定位   格式 标签名[@属性名='属性值']

   /meta[@name='author']       定位到所有的meta,再从中找到name=author的那一个

   //div[@id]               定位到所有div标签,再过滤出有id属性的节点

   通配符定位节点

   //*                      匹配所有节点

   /*                       匹配绝对路径最外层

   //*[@*]                     匹配所有有属性的节点

   /html/node()/meta        匹配所有含有meta的节点

   css选择器                  

   .weixinBottom            通过class的值进行定位

   #wx                      通过id的值进行定位

   div                      通过标签进行定位

   meta,link                匹配两种标签结果集

   div a                    匹配div标签中的所有后代a标签

   div>a                    匹配div后是一个a标签的节点

   div+div                     匹配div后面的同胞div节点

   [id]                     匹配所有含有id属性的标签

   [id='wx']                匹配所有含有id并且值为wx的标签

   [type="submit"]  

   [class~="Login"]         定位标签属性class值中有独立Login的节点

   [name|=msapplication]       定位标签属性name的值以msapplicatio开头的节点(该节点需为一个完整的单词)

2.day2-Selenium自动化测试框架

Selenium采用JavaScript单元测试工具JSunit为核心,只需在测试用例中把预期的用户行为与结果都描述出来,就得到了一个可自动化运行的功能测试套件。Selenium测试直接运行在浏览器中,像用户操作一样。

Selenium webdriver与selenium RC相比,支持无头执行,API更复杂,纯测面向对象的API,可测试Android/iphone应用程序

浏览器驱动的配置

   Pip install selenium==2.53.1         Pip list  已安装的服务        Pip freeze 显示自行安装的服务

Selenium IDE:一款Firefox的插件,提供了一个图形用户界面,用于记录使用Firefox浏览器,用于学习和使用selenium用户操作。

Selenium的API基础

窗口设置

    from selenium import webdriver

   driver = webdriver.xxx()

   maximize_window()   最大化

   get_window_size()   获取浏览器尺寸

   set_window_size()   设置浏览器尺寸

   close() or quit()

页面操作

   1)url的格式:

   形式   scheme://host[:port#]/path/…/[?query-string][#anchor]

   scheme:协议(例如:http, https, ftp)

   host:服务器的IP地址或者域名

  port:服务器的端口(如果是走协议默认端口,80  or 443)

   path:访问资源的路径 http://url的结构

   query-string:参数,发送给http服务器的数据,参数使用&隔开

   anchor:锚(跳转到网页的指定锚点位置)

   2)HTTP 默认端口号:80;HTTPS,HTTP + SSL(安全套接字层),默认端口号:443

   3)DNS域名服务

   4)页面请求操作

       driver.get(url) 请求某个url对应的响应

      refresh()   刷新页面

       back()   回退到之前的页面

       forward()   前进到之后的页面

获取断言信息:断言,表示为一些布尔表达式,程序员相信在程序的某个特定点该表达式为真,可以在任何时候启用和禁用断言验证。因此可以在测试时启用断言而在部署时禁用断言。

   Current_url  获取当前访问页面url

   Title   获取当前浏览器的标题

   Get_screenshot_as_png()   保存图片

   Get_screenshot_as_file(file)   直接保存

   Page_source   网页源码

3.day3-元素的定位

   2种方法——

       1.直接调用 driver.find_element_by_xxx(value)

       2.使用By类型 from selenium.webdriver.common.by import By

   Driver.find_element(By.xxx.value)

   8种方式——

       1.driver.find_element_by_id(value)

       2.driver.find_element_by_name(value)

       3.driver.find_element_by_class_name(value)

       4.driver.find_element_by_tag_name(value)

       5.driver.find_element_by_link_text(value)

       6.driver.find_element_by_partial_link_text(value)

       7.driver.find_element_by_xpath(value)

       8.driver.find_element_by_css_selector(value)

   定位一组元素  driver.find_elements_by_xxx(value)   返回一个元素对象列表

4.day-selenium的API高级

1.多标签/多窗口之间的切换

   场景:有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新开一个页面打开,这种情况下,计算机需要识别多标签或窗口的情况。

   1)获取所有窗口的句柄

       handles = driver.window_handlers

       调用该方法会得到一个列表,在selenium运行过程中的每一个窗口都有一个对应的值存放在里面。

   2)通过窗口的句柄进入的窗口  driver.switch_to_window(handles[n])

   driver.switch_to.window(handles[n])  通过窗口句柄激活进入某一窗口

2.多表单/多框架切换

   在网页中,表单嵌套是很常见的情况,尤其是在登录的场景

   多表单?实际上就是使用iframe/frame,引用了其他页面的链接,真正的页面数据并没有出现在当前源码中,但是在浏览器中我们看到,简单理解可以使页面中开了一个窗口显示另一个页面

   1)处理方法

       直接使用id值切换进表单     driver.switch_to.frame(value)/driver.switch_to_frame(value)

       定位到表单元素,再切换进入

          el = driver.find_element_by_xxx(value)

          driver.switch_to.frame(el)    /driver.switch_to_frame(el)

   2)driver.switch_to.default_content()        跳回最外层的页面。

      driver.switch_to.parent_frame()        跳回上层的页面。

3.鼠标和键盘操作

   手动测试时键盘的操作在selenium页有实现,关于鼠标的操作由ActionChains()类来提供,关于键盘的操作由Key()类来提供

   1)鼠标操作

       * 导入动作链类,动作链可以储存鼠标的动作,并一起执行

       from selenium.webdriver import ActionChains

       ActionChains(driver)

       * 执行ActionChains中储存的所有动作

          perform()

       * 鼠标右击

          el = driver.find_element_by_xxx(value)

          context_click(el)

          对el执行右击

       * 双击操作

       el = driver.find_element_by_xxx(value)

      ActionChains(driver).double_click(el).perform()

       * 鼠标悬停

       el = driver.find_element_by_xxx(value)

        ActionChains(driver).move_to_element(el).perform()

   2)键盘操作

       键盘操作使用的是Keys类,一般配合send_keys使用

       from selenium.webdriver.common.key import Key

       * 常用键盘操作

          send_keys(Keys.BACK_SPACE) 删除键(BackSpace)

          send_keys(Keys.SPACE)       空格键(Space)

          send_keys(Keys.TAB)         制表键(Tab)

          send_keys(Keys.ESCAPE)      回退键(Esc)

          send_keys(Keys.ENTER)       回车键(Enter)

          send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A) 类似还有c,x,v       

   3)弹出框操作

       1) 进入到弹出框中  driver.switch_to.alert()

       2) 接收警告  accept()

       3) 解散警告  dismiss()

       4) 发送文本到警告框  send_keys(data)

   4)下拉框操作

       selenium关于下拉框的操作都交由Select类进行处理,一般获取到下拉框元素之后使用该类构建对象,调用对象的响应方法就能操作元素

   1) 导入Select类

       from selenium.webdriver.support.select import Select

   2) 将定位到的下拉框元素传入Select类中

       selobj = Select(element) 下拉框元素已经定位到

   3) 调用响应方法选择下拉框中的选项

       select_by_index()        通过索引选择,index 索引从 0 开始

       select_by_value()        通过值选择(option标签的一个属性值)

       select_by_visible_text()    通过文本选择(下拉框的值)

       all_selected_options     查看所有已选

       first_selected_option    查看第一个已选

       is_multiple              查看是否是多选

       options                  查看选项元素列表

       取消选择

          deselect_by_index()

          deselect_by_value()

          deselect_by_visible_text()

   5)调用js代码

       JavaScript是世界上最流行的脚本语言,因为你在电脑、手机、平板上浏览的所有的网页,简单地说,JavaScript是一种运行在浏览器中的解释型的编程语言,用来给HTML网页增加动态功能。

       JavaScript 是属于网络的脚本语言,被数百万计的网页用来改进设计、验证表单、检测浏览器、创建cookies,以及更多的应用。

       1.重要的js代码

          * js = "window.scrollTo(x,y) "        

          x为水平拖动距离,y为垂直拖动举例

          * js= "var q=document.documentElement.scrollTop=n"

          n为从顶部往下移动滚动举例

       2.driver.execute_script(js)        执行js代码

   6)浏览器等待

       网速慢,网站内容过多,不进行等待而直接定位元素,可能会抛出异常,于是要进行等待。

       显示等待是根据条件进行等待,等待条件出现

          from selenium.webdriver.common.by import By

          from selenium.webdriver.support.ui import WebDriverWait

          from selenium.webdriver.support import expected_conditions as EC

          WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

       WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,

       默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置

       时间检测不到则抛出异常。

       隐式等待是根据是件进行等待,等待特定时间

          driver.implicitly_wait(n)

       n的单位为秒,n为最大值,在这个最大值内只要元素定位到就结束等待

   7)cookie操作

       Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行会话保持而储存在用户本地终端上的数据(通常经过加密)。1.因为http是无状态协议,他不对之前的的访问状态做管理,也就是说无法根据之前的登录状态进行本次访问的处理。2.没有状态管理就不能保持登录状态,这样就会很麻烦。所以要使用cookies。

       get_cookies()        获取所有cookies

       get_cookie(key)      获取key对应的值

       add_cookie(cookie_dict)  设置cookies

       delete_cookie(name)  删除指定名称的cookie

       delete_all_cookies()     删除所有cookie

5.day5-selenium的API的封装

函数封装是一种函数的功能,它把一个程序员写的一个或者多个功能通过函数、类的方式封装起来,对外只提供一个简单的函数接口。

If __name__ == ‘__main__’:

com = Common()

com.open_url(‘http://www.baidu.com’)

com.close_driver()

对selenium的常用操作进行封装

   (1)封装开启关闭浏览器;

   (2)封装定位操作;

   (3)封装对元素的基本操作

Unittest单元测试框架

是专门用来进行测试的框架

   test fixture:     代表了用例执行前的准备工作和用例执行之后的清理工作。

   test case:    测试用例,这个相信大家都不陌生。是测试的最小单位,一般检查一组输入的响应(输出)是否符合预期。unittest模块提供了TestCase类来帮助我们创建测试用例;

   test suite:   经常被翻译成”测试套件”,也有人称为”测试套”,是测试用例或测试套件的集合,一般用来把需要一起执行的用例组合到一起;

   test runner: 用来执行测试用例并输出测试结果的组件。可以是图形界面或命令行界面;

import unittest

Class Test1(unnittest.TestCase):

   def test_001(self):

       print(‘001’)

   def test_002(self):

       print(‘002’)

   def est_003(self):

       print(‘003’)

if __name__ == ‘__main__’:

   unittest.main()

   1.通过继承unittest.TestCase进行编写,继承unittest.TestCase的类会被框架识别为测试用例。

   2.setUp和TearDown是用于事前和事后做相关处理动作的,就是前面说的Test Fixture,会在每个测试用例运行前后被框架自动调用

   3.所有以test开头的方法会被框架自动识别为测试用例,并自动调用执行,不是以test开头的不会被调用

   4.unittest.main()是最简单的测试执行方式

   5.调用unittest.main()方法后,继承自unittest.TestCase类的类会被自动识别为测试用例并且被调用。也可用测试套件方式运行。

断言是测试用例的核心。我们使用assertEqual()来判断预期结果,用assertTrue()和assertFalse来做是非判断。

unittest支持命令行接口,我们可以在命令行里指定运行具体的测试用例。

python -m unittest test.Tese1

unittest+selenium

   1. Commonlib目录存放通用模块(我们封装的selenium模块)

   2.创建Business目录  ,根据业务创建测试功能模块

   3.创建Testcase目录存放测试用例

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Rainbow之星

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值