web自动化测试教程

1、 web自动化快速度入门

1.1、什么是web自动化测试

 其实就是用代码模拟手工测试(点点点)。

1.2、selenium

Selenium是一个用于Web应用程序测试的工具,可以使用自动化的方式去操作你的浏览器。

selenium套件:

  • selenium IDE  。脚本录制工具,但录制的东西可用性不高,了解即可。
  • selenium webdriver, 核心
  • selenium grid

selenium的优势:

  • 行业标准 。大家要自动化测试先学selenium,在学其他的,因为其他的比如cypress、playwright其实都是借鉴selenium而重新开发出来的新框架。
  • 支持多浏览器
  • 支持多语言。python+selenium,java+selenium,go+selenium等等,主流的编程语言都支持
  • 远程支持

1.3、selenium安装

依赖:

  • 浏览器
  • python 绑定库 selenium
  • selenium webdriver 驱动

步骤:

  • 安装浏览器(谷歌或火狐)
  • pip install selenium
  • 下载webdriver 驱动。
        1、chrome浏览器为例下载地址如下,下载的版本要与浏览器版本匹配,chrome有一个比较恶心的强制更新机制,导致自动化脚本经常运行不了,此时需要更新驱动版本或者禁止chrome自动更新。

    官方网址:

    Chrome 114版本以前下载地址如下:

    http://chromedriver.storage.googleapis.com/index.html

 

    Chrome 115 版本以后下载地址如下:

    这个网站一般展示的都是最新的几个版本 ,建议推荐下载Stable版本的,比较稳定 。

    https://googlechromelabs.github.io/chrome-for-testing/

    国内镜像地址:

    Chrome 114版本以前下载地址如下:

    https://registry.npmmirror.com/binary.html?path=chromedriver

    Chrome 114版本以后下载地址如下:

    https://registry.npmmirror.com/binary.html?path=chrome-for-testing/

              2、火狐浏览器比较稳定。https://registry.npmmirror.com/binary.html?path=geckodriver/

              3、下载完将其入安装目录,python安装目录或者其他任意环境变量地址下,最好放python安装目录下。

1.4、selenium使用

  • 基础操作

 

from selenium import webdriver
driver = webdriver.Chrome()

# 访问网址--百度
driver.get('www.baidu.com')

# 页面刷新
driver.refresh()

# 访问另一个网址--豆瓣
driver.get('www.douban.com')
# back
driver.back() #回到了百度

# 前进
driver.back() #回到了豆瓣
# 最大化
driver.maximize_window()
# 最小化
driver.minimize_window()

# 全屏
driver.screen_window()

# 固定尺寸
driver.set_window_size(400,400)
# 关闭浏览器
driver.quit()
# 关闭标签页
driver.close()

  • 基础属性

  

1.5、selenium原理

 

  

 

 

1.6、selenium进行自动化测试流程

手工测试:

  • 打开浏览器
  • 输入网址
  • 点点点
  • 结果验证
  • 编写测试报告

自动化测试:

  • 打开浏览器
  • 输入网址
  • 点点点(先找到输入、点击的元素在哪儿) ==》 元素定位
  • 断言,预期与实际结果,assert
  • 生成测试报告

1.7、扩展:无法定位到元素,出现的原因可能有哪些?

    a、元素定位表达式有没有正确。怎么确定?浏览器当中ctrl +f 能不能找到元素,且是否唯一。

    b、元素表达式正确。检查是否设置了等待。(正常情况下全局设置隐性等待,可在报错位置加强制等待进行调试)。

    c、元素是否在另一个窗口(driver.window_handles)。

    d、元素是否在iframe中,切换到iframe中在进行定位元素。

    e、元素动态变化(1、表达式动态变化、2、需要鼠标悬浮才能看到所要定位的元素,3、其他情况下,需要做某些动作元素才能显示出来进行定位。)

 

2、元素定位

2.1、8种元素定位方式及分类

  • id   唯一
  • name,常用来定位输入框
  • class_name,常用,中间不能有空格
  • link_text,通过文本定位
  • partial_link_text
  • tag_name 不常用
  • xpath,最常用
  • css_selector,最常用

  

2.2、元素定位的方法
 

     2.2.1、元素定位的方法

  • 方法1:

          find_element('','')  

          find_elements('','') 

  • 方法2:

          定位一个元素:

          find_element_by_id()
          find_element_by_name()
          find_element_by_class_name()
          find_element_by_tag_name()
          find_element_by_link_text()
          find_element_by_partial_link_text()
          find_element_by_xpath()
          find_element_by_css_selector()

          定位多个元素:

     find_elements_by_id()
     find_elements_by_name()
          find_elements_by_class_name()
          find_elements_by_tag_name()
     find_elements_by_link_text()
     find_elements_by_partial_link_text()
     find_elements_by_xpath()
     find_elements_by_css_selector()

    2.2.2、find_element('','')与find_element_by_xxxx('')用哪个

  • 通过查看find_element_by_xxxx底层实现方法, 发现底层是调用find_element方法进行的封装。
  • find_element_by_xxxx,这种用法不推荐,原因一是不灵活,原因二是已将被官方弃用。
  • 要用find_element('','')这种写法,这是标准写法。

       2.2.3、find_element('','')详解

       方法: find_element(by=By.ID, value=None)   需要两个参数,第一个参数为定位的类型由By提供, 第二个参数为定位的具体方式的值。

       该方法源代码如下:

       class By(object):
       """
       Set of supported locator strategies.
       """
       ID = "id"

       XPATH = "xpath"
       LINK_TEXT = "link text"
       PARTIAL_LINK_TEXT = "partial link text"
       NAME = "name"
       TAG_NAME = "tag name"
       CLASS_NAME = "class name"
       CSS_SELECTOR = "css selector"

      示例:
      导入By类:from selenium.webdriver.common.by import By
      1. driver.find_element(By.CSS_SELECTOR, '#emailA').send_keys("123@126.com")
      2. driver.find_element(By.XPATH, '//*[@id="emailA"]').send_keys('234@qq.com')
      3. driver.find_element(By.ID, "userA").send_keys("admin")
      4. driver.find_element(By.NAME, "passwordA").send_keys("123456")
      5. driver.find_element(By.CLASS_NAME, "telA").send_keys("18611111111")
      6. driver.find_element(By.TAG_NAME, 'input').send_keys("123")
      7. driver.find_element(By.LINK_TEXT, '访问 新浪 网站').click()
      8. driver.find_element(By.PARTIAL_LINK_TEXT, '访问').click()

    2.2.4、find_element和fid_elements区别

  • find_element得到的是一WebElement对象,而find_elements得到的WebElement对象列表
  • find_element只会返回查到到的第一个元素,如果找不到报NoSuchElementException错,而find_elements找不到不报错返回空列表。
  • 自动化测试尽量不使用不加s的,加s在爬虫时会用到,把所有的都爬出来保存起来。
  • find_element找到不报错,需做要异常捕获,而find_elements则不需要做。

    2.2.5、元素对象的属性和操作

  属性:tagname、text、parent...... 详见1.4章节

       操作:click() 单击元素、send_keys()、submit()、clear() 清空......详见1.4章节

 

       扩展一、真的有8大元素定位吗?

2.3、HTML

   什么是 HTML?

  • HTML 指的是超文本标记语言 (Hyper Text Markup Language)
  • HTML 不是一种编程语言,而是一种网页标记语言 (markup language)
  • 标记语言是一套标记标签 (markup tag)
  • HTML 使用标记标签来描述网页

  上面提到八大元素定位方式,那么这八大元素定位方式怎么来的,实际上就是根据html的特征来的。

 

  2.3.1 THML构成

  • 标签 ,即<标签名>...... </标签名>,标签名:div 、form、span......很多
  • 属性, 即<标签名 name=value>......</标签名>,开始标签中,带等号的叫属性,等号左边叫属性名,右边叫属性值
  • text,  即<标签名 name=value>text</标签名>,一个标签可以有文本,也可以没有文本
  • 内嵌标签,即<div><li><a>....</a></li></div>

  对于一个hmlt来说最外层只有一个标签<html>....</html>,html标签又分成两个子标签<head>...</heat>和<body>...</body>,head标签存放网页的一些摘要信息如网页的标题,body标签里又嵌套了好多子标签,一个网页面所展示出来的内容全部都在body里边。

  2.3.2、常见HTML标签

  • p           表示段落
  • h1 -h6  标题,1-6级标题
  • div        表示空的标签块,没有具体的内容,相当于给你一个方框,你自己去往里边填数据。可以往div里边放一些子标签。
  • span     此标签是可以不换行的
  • a           表示超连接,通过属性href的配合实现超连接
  • img      通过属性src配合,src表示图片路径
  • iframe  一个html里边嵌套另一个html,需要src="另一个网址"来配合
  • input: 此标签一般不成对出现,通常有name、value、type属性,type类型有text、password、checkbox、radio、file
  • select  下拉选择框,通常与<option></option>配合使用
  • form     对于前台向后台有交互的标签都可以放在<form>......<form>之间,form表单的作用是用户前后端进行数据交互一种方式。把前台的数据通过form表单方式传给后端。
  • ul    无序列表,<ul></ul>标签表示无序列表,里面只能包含li,没有顺序,li中可包含任何标签
  • li           列表,可以嵌入<ul></ul>之中

  2.3.3、常见HTML属性
      html属性是HTML元素提供的附加信息,也就是指各个标签所具有的属性,html属性是书写于标签当中的。HTML标签可以拥有属性,并且属性提供了有关HTML元素的更多的信息。不同的标签还有各自的专属属性,比如表格元素所专用的 colspan rowspan。常见属性如下(当然,用户还可以自定义属性):

  • id
  • name
  • class_name
  • value
  • style
  • type
  • value
  • readonly
  • disabled
  • checked
  • placeholder

    例:
    <input type="text" name="" id="">       input是标签名,而type、name、id都是这个标签的属性
    <a href="http://www.baidu.com"> this is link</a>     HTML 链接由 <a> 标签定义。链接的地址在 href 属性中指定

3、xpath定位详讲

3.1、xpath定义

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。andriod app前端就是用xml编写的。xml因与html长的过于相似,所以xpath也可以用来查找html元素,可以通用。

3.2、xpath语法

  • 绝对路径:从根目录开始。例如/html/body/.........
  • 相对路径:在一个路径下,另外的路径以这个路径作为叁照。例如//input[@name="q"]。抽象后的语法://标签名[@属性名="属性值"]
  • 相对路径和绝对路径都是可以找到元素,但一般不用绝对路径查找元素。因为一是前端改了面页效果(如加一个特效、加几个div)都会影响绝对路径,二是绝对路径太长,不便维护

  表达式                             描述

  nodename                       选取此节点的所有子节点。

  /           从根节点选取。

  //             从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置。相对路径。

  .           选取当前节点。

  ..             选取当前结点的父节点,例如//div[@id="anony-nav"]//../.. 找祖先的时候只能一层一层上找

  @           选取属性

  and                                   条件组合,例如://input[@name="q" and @type="text" and @size="12"]

  text()            可重点掌握,因为text()在css选择器里没有,只有xpath里才有。        

  contains()        

  索引            1、加括号[] 2、索引从1开始。

 

3.3、轴定位

  轴:你想通过一个元素去找另外一个元素,能找到前提这两个元素之间的有关系如父亲、儿子、祖先、兄弟。

 

  轴名称                                 结果

  ancestor        选取当前结点的所有先辈(父、祖先等)。

  ancestor-or-self     选取当前结点的所有先辈(父、祖先等)以及当前节点本身。

  attribute         选取当前节点的所有属性

  child          选取当前节点的所有子元素

  descendant         选取当前节点的所有后代元素(子、孙等)

  descendant-or-self      选取当前节点的所有后代元素(子、孙等)以及当前结点本身

  following         选取文档中当前节点的结束标签之后所有节点。

  namespace       选取当前结点的所有命名空间节点。

  parent          选取当前节点的父节点。

  preceding          选取文档中当前节点的开始标签之前的所有节点。

  preceding-sibling      选取当前节点之前的所有同级节点。哥哥。姐姐

  self            选取当前节点

  • following-sibling、preceding-sibling、ancestor 这三个轴用的多,其他的轴不太怎么用。

  (1)ancestor:a//ancestor::div[@id="anony-nay"], 表示去找a标签的祖先,这个祖先名字叫div且有id属性值为"anony-sns“

  (2)following-sibling:表示从后面的同胞(同一层级)中找元素(有可能会找出多个)。//*[@class="account-form-3rd-hd"]//following-sibling::div

  (3)preceding-sibling:表示从前面的同胞(同一层级)中找元素(有可能会找出多个)。

         

  xpath用法总结:

  • //input[@id=""],哪个属性特征最明显就用哪个。比如id属性,因为元素的id是唯一的(在同一个页面中不可能存在两个元素id相等。)
  • and 组合属性,例如://input[@name="q" and @type="text" and @size="12"]
  • //div/input 单斜杠通过父亲找儿子
  • //div//input 通过祖先找子孙
  • 两个点,通过儿子找父亲,找祖先的时候只能一层一层上找。例如://div[@id="anony-sry"]//../..     
  • //a[text()="读书"],通过文本找元素,text()不用@,因为不是属性是个函数,text()经常与contains()组合使用,因为原代码中的文本经常左右两边会有空格,对显示没影响,但对定位是有影响的,会导致定位不到,所以要与contains()组合使用。如//a[contains(text(),'读书')]、//a[contains(@class,'anoly')]
  • 索引有两个注意事项:1、加括号 2、索引从1开始。(//a[contains(text(),'读书')])[1]
  • * 表示通配符,任意元素名称。//*[@id="anony-sns"]
  • 轴定位

 

3.4、获取元素xpath三种方式

  • 浏览器,按F12,鼠标单击元素位置,右键复制xpath,ctrl +f,弹出搜索框,可输入xpath反查代码
  • chropath 插件复制xpath
  • 手写xapth,必要时可手写(如复制出来的过长)

 

4、CSS定位详讲

4.1、什么是CSS

CSS( Cascading Style Sheets) 是一种语言, 它用来描述HTML元素的显示样式,html是用来展示元素的,但展示的效果不太美观,CSS的功能就是起到排版美化的作用。比如下面这段代码把所有的h2元素都变成红色。

  <style type="text/css">

    h2{

    color: red

    }

  </style>

4.2、什么是CSS选择器

1、CSS选择器,用于选择需要添加样式的元素,HTML页面中的元素就是通过CSS选择器进行控制的,在Selenium中也可以使用这种选择器来定位元素;
2、每一条CSS样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code] 在{}之前的部分就是“选择器”。 “选择器”指明了{}中的“样式”的作用对象,也就是“样式”作用于网页中的哪些元素。

3、在CSS选择器中,最常用的是ID选择器和类选择器,因为它们可以直接定位到某一个元素,便于自动化测试。

 4.3、CSS选择器的书写位置

1、第一种方式:内联样式/行内样式(不推荐使用)

写在开始标签里,写一个style属性,在style属性值里面写样式,样式分为 样式名:样式值; 名值对的结构,可以写多组样式,以;隔开即可。

缺点:结构和样式耦合;不容易修改。

举例如下代码:

<span style="color: yellow; font-size: 40px">内联样式/行内样式</span>

2、内部样式表

在head标签中,写一个style标签,在style里先选中对应的元素,然后设置样式可以多组样式,以;隔开即可,最后一个样式可以不写;,但我们一般都写。

缺点:不方便重复使用,不利于其他文件使用

举例如下代码:

 

3. 外部样式表( 最推荐使用)

在html文件外新建一个css文件,在css文件内书写样式,然后通过link标签引入css文件。(引用文件的具体方式自行百度,非本次重点)

<head>
<link rel="stylesheet" href="./index.css" />
<!--./后面接的是你文件所在的位置 -->
</head>

 

4.4、CSS选择器种类

1、ID选择器 

2、class选择器 

3、标签选择器

4、属性选择器

5、后代选择器

6、子代选择器

7、相邻兄弟选择器

8、通用兄弟选择器 

9、群组选择器

10、通配符选择器

 

1、id选择器

说明: 根据元素id属性来选择
格式: #id属性值{     }
例如:

2、class选择器
说明: 根据元素class属性来选择
格式: .class属性值{     }
例如:

3、标签选择器
说明: 根据元素的标签名选择
格式: 标签名{     }
例如: 

4、属性选择器

说明: 根据元素的属性名和值来选择
格式: [attribute=value]{     }
例如:有7种写法

写法1:[属性]
a[title]{ } --表示选择到a标签且有title属性的变
a[lang][target]{ } --表示选择到a标签且有title属性和target属性的变

写法2:某某[属性=属性值]
a[lang="zh"]{ } --表示选择a标签且有lang属性且属性值为"zh"的变
.item[lang="zh-cn"]{ }
#last[title][class="links"]{ }

写法3:子串匹配属性选择器:某某[属性^=属性值]
a[class^="li"] --表示选择a标签有class属性且属性值是li开头的变

写法4:子串匹配属性选择器:某某[属性$=属性值]
a[class$="t"]{ } --表示选择a标签且有class属性且属性值结尾是t的变
a[href$=".pdf"]{ }
a[href$=".doc"]{ }
a[href$=".png"]{ }

写法5:某子串匹配属性选择器:某[属性*=属性值]
a[href*="b"]{ } --表示选择到a标签且有href属性且属性值包含有字母b的变

写法6:根据部分属性值选择:某某[属性~=属性值]

来选择具有指定属性,并且该属性的多个值中包含给定值的元素。

 写法7:特定属性选择类型:某某[属性|=属性值]

*[lang|="en"] {color: red;}

上面这个规则会选择 lang 属性等于 en 或以 en- 开头的所有元素。因此,以下示例标记中的前三个元素将被选中,而不会选择后两个元素:

 

<p lang="en">Hello!</p>

<p lang="en-us">Greetings!</p>

<p lang="en-au">G'day!</p>

<p lang="fr">Bonjour!</p>

<p lang="cy-en">Jrooana!</p>

 

 

5、后代选择器

说明: 用来选择特定元素或元素组的后代,将对父元素的选择放在前面,对子元素的选择放在后面,中间加一个空格分开。

格式: element1 element2 通过element1来定位element2, 并且element2为element1的后代元素
例如: 

6、子代选择器

说明: 请注意与后代选择器的区别,子选择器(child selector)仅是指它的直接后代,而后代选择器是作用于所有子后代元素。

格式: element1>element2 通过element1来定位element2, 并且element2必须为element1的直接子元素
例如:

 

7、相邻兄弟选择器

说明: 除了上面的子选择器与后代选择器,我们可能还希望找到兄弟两个当中的一个。

格式: 元素A+元素B{     }
例如:

8、通用兄弟选择器

说明:

格式: 元素A~元素B{     }
例如:

 

+和~的区别:类似上面一个,两者都表示兄弟关系,但是+必须是“大哥+二哥”,~还能是“大哥~三弟”、“二哥~四妹”

 

9、群组选择器

说明:  当几个元素样式属性一样时,可以共同调用一个声明,元素之间用逗号分隔。

格式:选择器1,选择器2,选择器3...{}
例如:

 

10、通用配符选择器

语法 : *{}

作用 : 让页面中所有的标签执行该样式,通常用来清除间距

例子 :

*{

             margin: 0;  //外间距

             padding: 0;  //内间距

}

11、伪元素选择器

看后面扩展

12、伪类选择器

看后面扩展

 

4.5、CSS选择器语法

  .class                         .intro                   选择class="intro"的所有元素                            

  #id               #firstname    选择id="firstname"的所有元素                         

  *                *         选择所有元素                                                   

  element               p        选择所有<p>元素 

        ----或关系                               

  element,element  div,p          选择所有<div>元素和所有<p>元素

        ----后代          

  element element    div p          选择父元素为<div>,所有子元素的为<p>的元素                

  element>element      div>p         选择父元素为<div>,所有直接子元素的为<p>的元素

        ----兄弟   

  element+element    div+p        选择<div>元素之后,紧挨着<div>元素的兄弟<p>元素

  element~element   div~p      选择<div>元素之后,所有<div>的兄弟为<p>的元素

        ----伪类选择器      

  :nth-last-child(n)        p:nth-last-child(2)      同上,从最后一个子元素开始计数        

     :nth-of-type(n)           p:nth-of-type(2)         选择属于其父元素第二个<p>元素的每个<p>元素  

  :nth-last-of-type(n)     p:nth-last-of-type(2)  同上,但是从最后一个子元素开始计数             

4.6、xpath和css选择器语法比较

  祖先关系:

  xpath:        //input//div

  css:      input div

  父子关系:

  xpath:  //input/div

  css:   input>div

  第几个儿子:

  xpath:  //form[@id="form"]/input[1]

  css:     form#form>input:nth-child(1)

  大弟弟:

  css:    form#form + div

  或者:

  xpath:  //input/div | //input/a

  css:   input div,input a

 

 

4.7、xpath和css选择器各有什么优势

  • css写法更简洁
  • css速度更快,但这个快基本上感觉不到
  • css不支持文本写定位,即text()
  • xpath功能更强,支持的函数也多,比如说contains()等,所以说对于复杂难定位用xpath反而更简洁

扩展1:伪元素操作

1、伪元素

(1)定义:

在实践过程当中会遇到一些关于css的问题,比如说“伪元素”,再比如说"Shadow DOM "即影子节点。

什么是”伪元素“?,伪元素它不是一个真正的元素,它不是一个真正的标签,而是通过css样式去动态载入某一个元素的,不属于dom树,所以不能通过xpath等手段直接获取。如下面代码在所有h4前面都加一个前缀hello。CSS 在渲染文档的时候,伪元素可以通过 css 给 HTML 添加一个元素(叫标签也行),这个元素在文档树中是找不到的。伪元素被当做 CSS 的样式来进行展现,用法和普通的元素用法是一样的。这个东西有什么特别的地方吗?特别的地方在说于在html代码中看不到hello,所以通过自动化测试不能直接定位到hello的,一般来说这种伪元素目前来说不会遇到特别多,那怎么处理呢?详看如下 。 

  h4::before{

    content: Hello

  }

 

(2)伪元素特点

优点:

  • 不占用 DOM 节点,减少 DOM 节点数。
  • 让 CSS 帮助解决了一部分 JavaScript 问题,简化了开发。
  • 避免增加毫无意义的页面元素。


缺点:

  • 不利于调试。
  • 伪元素不真正在文档内容中体现,只在视觉效果上体现,所以不能给伪元素添加具有实际意义的内容,这部分内容不会搜索引擎抓取。

 

(3)伪元素类型

伪元素前面可以是一个冒号,也可以是两个冒号,不影响结果

  • ::before和::after

  ::before和::after在被选中元素现有内容之前(后)插入内容,需要使用content属性指定要插入的内容。 该内容默认不脱离文档流,占据实际元素空间。可通过定位实现与选中元素的绝对定位。::before和::after常被用来和content属性配合实现各种辅助效果。

  特点:

  默认display: inline;

  必须设置content属性,否则一切都是无用功;

  默认user-select: none,

  ::before和::after的内容无法被用户通过鼠标长按滑动选中的;

  会继承原本元素的CSS属性(如原元素的颜色等)

 

 

  • ::first-line和::first-letter

 

  ::first-line:只能用于块级元素。用于设置附属元素的第一个行内容的样式。可用的CSS属性为font,color,background,word-spacing,letter-spacing,text-decoration,vertical-align,text-transform,line-height,clear。

  :first-letter:只能用于块级元素。用于设置附属元素的第一个字母的样式。可用的CSS属性为font,color,background,marin,padding,border,text-decoration,vertical-align,text-transform,line-height,float,clear。

 

  这两种伪类适用频率较低。

  • ::selection

  ::selection:匹配鼠标长按拖动选中的内容。可用的CSS属性为background,color

 

(4)伪元素定位

比如【百度疫情大数据平台】

 以【百度疫情大数据平台】为例,“累计确诊”文本并没有显示在 HTML 源代码中,如果通过常规的 xpath 元素定位方式是没办法的,因为“累计确诊”文本并不存在当前页面 dom 树中。

如何处理?

我们要弄清楚的是该元素的特殊之处,文本究竟存放在哪?其实很简单,通过 Chrome 的 F12,我们将 style 选项展示出来。

 

可以看到元素的文本保存在 CSS 样式里面,通过 content 属性进行设置。

这里还有个小问题:文本根本对不上呢?

因为这里使用了 Unicode 编码,使用在线的 Unicode 编码转换工具即可看到

 

::after 元素也是同理,这种性质的元素我们称之为伪元素:

之所以被称为伪元素,是因为他们不是真正的页面元素,HTML 没有对应的元素,但是其所有用法和表现行为与真正的页面元素一样,可以对其使用诸如页面元素一样的 CSS 样式,表面上看上去貌似是页面的某些元素来展现,实际上是 CSS 样式展现的行为,因此被称为伪元素。

 

伪元素的定位

由于伪元素是通过 CSS 样式展现的行为,所以我们可以通过 CSS 样式选择器来进行定位,以“百度疫情大数据为例”:

先定位伪元素的父元素:div.Virus_1-1-318_3W7bs_

再定位到伪元素本身:div.Virus_1-1-318_3W7bs_>label

 

伪元素文本的获取

有些情况下我们需要获取到文本信息,其中伪元素的文本主要是通过 content 属性设置,我们可以通过 JavaScript 可以进行提取:window.getComputedStyle(document.querySelector('.样式'),':after').getPropertyValue('content')

window.getComputedStyle(document.querySelector('.样式'),':before').getPropertyValue('content')

 

 

2、伪类

(1)定义

伪类使用单冒号(如:hover,:visited),

first-child

last-child

nth-child

nth-last-child

nth-of-type

 

 

first-child和last-child可直接使用,例如 ul li:first-child,ul li:last-child, 但是其余的选择都需要在后面加入(),例如ul li:nth-child(n); ->选中ul元素下面第n个li元素,且n是从1开始。

 

(2)nth-child的使用方法

 

 

 

 

 

 

 

 

这里我们可以看到只是选中了li标签,并没有选中p标签;但是如果使用nth-child()的话,就会从第一个p标签开始进行匹配,而不是第一个li标签,此时第一个li标签成为了第6个,而且如果是p:nth-child(1)的话,样式也不会生效;此时要写的是li:nth-child(6);

 

 

 

 

 

 

 

 

 

(3)伪类定位

例如:伪类定位 目标 查找div#home下的第一个子元素

     CSS表达式 div#home :first-child

          python表达式 dirver.find_element_by_css_selector(“div#home :first-child”)

 

3、伪类和伪元素有什么区别

伪类(Pseudo-classes)和伪元素(Pseudo-elements)是两种不同的CSS选择器,虽然它们的名称相似,但它们的作用和使用方式有所不同。 伪类是用来为某些元素添加一些特殊的效果,例如当用户鼠标悬停在链接上时改变链接的颜色、当元素被点击时改变元素的背景色等。伪类通常用单冒号(:)来表示,例如:hover、:active等。 伪元素则是用来在某些元素的前面或后面添加一些内容或样式,例如在元素前面添加一个小图标、在元素后面添加一些文本等。伪元素通常用双冒号(::)来表示,例如::before、::after等。

 

 扩展2:Shadow DOM

 

5、等待

5.1、为什么要用等待

  页面打开因为要有个加载过程,要等页面出来才能方便定位元素。

5.2、三种等待方式

   1、强制等待,不够灵活,time.sleep(),暂停代码运行,适用于所有类型的等待。

   2、隐式等待(只能用来查询元素,find_element开头的方法能用),背后默默的等感觉不到他的存在,全局只需设置一次,所以一般来说启动浏览器之后不要忘记设置隐性等待,之后每次找元素的时候就会自动触发隐性等待。超时找不到元素会报错。

  • driver.implicitly.wait(10)
  • 类似于系统监控,效率高,比较隐藏的找到凶手

   3、显示等待(明确等待的条件),每需要用到一次,就需要调用一次(非全局配置),另外不仅可以等元素查找还可以适用其他的等待(如等待获取浏览器的标题,这种时候用隐式等待就不行,因为获取浏览器的标题不属于元素定位,所以只能用time.sleep()或显示等待)。显示等待一般可以用time.sleep()替换掉,但是time.sleep()有个硬伤,时间时死的不够智能,所以为了代码智能一点还是用显示等待。显示等待时间超出了就会报错。

  • 类似于派出专项小分队设卡检查
  • 隐式等待某些情况找不到,就要用显示等待

  

  from selenium import webdriver
  from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
# 访问百度
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
# 设置显性等待
wait = WebDriverWait(driver, 10)
locator = ['id', 'kw']
 # 显式等待使用方式之一:等待元素(常见有三种)

# 等待某个元素加载
elem = wait.until(expected_conditions.presence_of_element_located(locator))
# 等待元素可见
elem = wait.until(expected_conditions.visibility_of_element_located(locator))
# 等待元素可以被点击
elem = wait.until(expected_conditions.element_to_be_clickable(locator))
#元素出现后在进行各种操作
elem.send_keys('NBA')
elem.submit()
 # 显式等待使用方式之二:等待非元素(此处也可用time.sleep()进行强制等待)
wait.until(expected_conditions.title_contains('NBA'))#等待标题栏出现文本包含NBA
 # 输出标题栏内容(如果上面不用显示等待,而用隐式等待,输出的内容有可能是不正确的(输出之前的标题),因为隐式等待只能等元素,不能等非元素。)  
print(driver.title)
 4、三种等待使用流程

  全局用上隐式等待,如果遇到隐式等待不起作用,再用time.sleep()调试,如果好用在把time.sleep()替换换成显示等待。

 

6、三大切换

 

6.1、窗口切换

 driver.current_window_handle # 获取当前窗口的句柄handle
 driver.window_handles # 获取所有窗口句柄,以列表形式返回
 driver.switch_to(driver.window_handles[-1]) # 切换到最新窗口,-1 表示获取最新的窗口,0表示第1个窗口

6.2、iframe切换

  (一)切换 iframe

  switch_to.frame(iframe_reference)进行切换,可以以下3种方式进行切换:

  • 1、index,从0开始,这种方式一般不用,很难通过页面确定是第几个iframe,例如driver.switch_to.frame(0)切换到第1个iframe,下标是从0开始的
  • 2、name 属性,例如driver.switch_to.frame(‘iframeResult’)
  • 3、WebElement 对象,先把iframe元素本身找到,然后再传进来。如iframe = driver.find_element('id','iframeResult'),driver.switch_to.frame(iframe)

  (二)切换默认的HTML

  switch_to.default_content()

  (三)切换到上一级iframe

  switch_to.parent_frame()

 

  例子:https://www.w3school.com.cn/tiy/t.asp?f=eg_html_iframe

 

6.3、alter弹框切换

       

 

 

   alter弹框,当页面上出现alter弹框后,此时按F12是看到不到页面上的元素的一片空白,导致没法定位元素,因为此时此刻页面停留在弹框上面,里面所有的元素都会消失,此时怎么定位页面页面上的元素,必须把现alter弹框关掉,关掉后其他元素才会出来。像这样原始的alter现在已经很少出现了,现在的弹框不是通过alter实现的,而是通过标签实现的直接点接就可以了。

  • my_alter =driver.switch_to.alter # 切到alter弹框上。注意alter没有括号,也不需要传参,因为alter全局只会出现一次。
  • myalter.accept() # 点击弹框上确认按钮的意思,现次回到主页面。
  • myalter.dismiss() # 点击弹框上取消按钮的意思,现次回到主页面。

  上面这种弹框用的比较少了,都用新技术了,现在很多弹框都是通过js去加载一个新的元素,然后把它悬浮在老的元素上面更多是用到css和js组合。

6.4、切换的等待

  (1)窗口切换要不要等待,万一没切换过来怎么办?

   基本不需要,因为窗口切换很快,除非遇到个别情况下电脑卡顿造成的,正常情况下不需要等待,如果设置等待可用强制等待或显示等待。

   

   from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
driver = webdriver.Chrome()
driver.get('www.baidu.com')
elem = driver.find_element('id','kw')
elem.send_keys('NBA')
elem.submit()

# 注意此处是方法二的一个参数,获取所有的窗口句柄,一定要在点击新页面前获取
all_handles = driver.window_handles
driver.find_element_by_link_text('雅虎').click() # 打开一个新的窗口

# 方法一设置强制等待
time.sleep(2) # 设置2秒等待新窗口打开

# 方法二设置显式等待
wait = WebDriverWait(driver,2)
wait.until(expected_conditions.new_window_is_opened(all_handles)) #注意这个参数,all_handles

handle = driver.switch_to(driver.window_handles[-1])# 然后在手工切换
driver.switch_to.window(handle)
time.sleep()
print(driver.title)

 (2)iframe切换要不要等?一般也不需要等。但等了也无所谓可以让代码更健壮,只是代码变复杂
  ......
  
iframe =driver.find_element('id','iframeResult')
  # 执行下面这个等待后,会自动完成切换,不用在手工切换iframe
WebDriverW(driver,2).until(expected_conditions.frame_to_be_available_and_switch_to_it(iframe))
  
  ......
  也可用强制等待,但需要手工切换ifame   
  (3)alter,道理同iframe切换。现在页面很少用原生弹窗,所以此方法了解即可,用的时候在查。
   wait = WebDriverWait(driver,2)
wait.until(expected_conditions.alert_is_present))

7、ui交互操作

  web测试过程中的都有哪些浏览器操作?

  1、点点点(鼠标操作:单击、双击、拖拽、悬停)

  2、用户输入(文本框、单选、多选、下拉框选择)

  3、控件操作(如日期)、文件上传

  4、验证码(让开发关闭验证,设置固定验证码)

  5、窗口滚动。

  各式各样的浏览器操作工具如,selenium,cypress,playwright,pupeter,其封装浏览器的操作都是类似的。

7.1、鼠标操作

  ActinoChains类来实现。流程举例:(1)ac = ActionChains(driver) (2)定位元素elem =driver.find_element('xpath','//h2')(3)操作 ac.click(elem).perform()

  1、单击,有两种方式来实现。

   简单版:(1)定位元素,elem =driver.find_element('xpath','//h2')(2)elem.click()

   复杂版:(1)ac = ActinoChains(driver) (2)定位元素,elem =driver.find_element('xpath','//h2')(3)操作 ac.click(elem).perform()

   说明:简单版虽简单但是功能单一,只能做单击。复杂版功能强大如将ac.click(elem).perform()中的click(elem)可替换成别的操作如双击    

   ac.double_click(elem).perform(),换成什么就是什么操作。

  2、双击 ac.double_click(elem).perform()

  3、右击 ac.context_click(elem).perform()

  4、移动(悬停) ac.move_to_element(elem).perform()     例子:百度首页:设置--》高级设置

  5、拖拽 ac.drag_to_drop(elem1,elem2).perform()

  6、连续操作:ac.move_to_element(setting).click(adv_setting).drag_and_drop().context_click().perform() # 可以任意加,只要最后有.perform()即可。

7.2、选择select下拉框

       

  这种下拉框用的比较少了,但是有的在用,现在更多用的是新的一些框架用这个div元素去加载的。

  有两种方式可能操作select下拉框:

  方式一:也是最简单的方式,直接去定位option,点击即可(此种方式所有类型下拉框通用):

  driver.find_element('xpath','//option[text()="吃"]')

  注:因为现在很多很多框架虽然不在用select元素去代表下拉框,比如vue.js(中国人写的风靡全球一个框架)写的前端,例如下面这个下拉框,就是普通的文本框+选项列表组成,但是它的展示实现起来会通过一些css样式让它看起来像是select元素,实际上根本不是。像这种与定位。一样的先找你你要点击的元素(点开下拉,鼠标放置选项上右击检查元素)点击即可。所以下拉弹不管是不是select元素都是可以通过点击取操作。

      

 

     

 

 

   方式二:仅适用select下拉框,了解即可,即先找到select元素,再把元素对象传入Select

  from selenium.webdriver.support.select import Select

  s = driver.find_element('id','myselect'.)

  s_obj = Select(s)

  s_obj.选一种定位方式即可。

  

 

  

7.3、键盘输入

  • Keys 类
  • send_keys()
  • enter 回车
  • 右移光标
  • ctrl +a ,全选
  • ctrl +c 复制
  • ctrl +v 粘帖

  以百度搜索为例子,提交的三种方式:

  ......

  driver.get('http://www.baidu.com')

  input = driver.find_element('id','kw')

  input.send_keys('NBA')

  方式一、找到"百度一下"这个按钮,点击元素。此种为万能方式。

  方式二、如果该元素在form表单下,可以以submit()实现提交,如果不在form表单下则不能用这种方式。

       input.submit()

  方式三、触发键盘上的回车健。如果前端没有做回车提交,这种方式也不了。

  from selenium.webdirver.common.keys import Keys

  input.send_keys(Keys.ENTER)

  # 也可传多个参数

  input.send_keys(Keys.CONTROL,Keys.SPACE)

 

  以上是在元素上的操作,下面是全局操作:

  from selenium.webdriver  import ActionChains

  from selenium.webdirver.common.keys import Keys

  ac = ActionChains()

     ac.send_keys(Keys.CONTROL).perform()

7.4、js脚本

  所有python代码、所有selenium指令比如找元素,发送按键最终都是会传给webdirver驱动(转换成js代码),通过webdriver控制浏览器,webdriver为什么可以控制浏览器,是因为浏览器中内置js解释器(也就是说浏览器可随便宜运行js代码),所以不管学的是什么语言python、java、php也好总之你想控制浏览器到目前为止是绕不开js(javascript)的。学js目的以防成万一,什么意思呢,因为现在所写的python指令最终都会转化成js代码,所以可以理解成selenium是对js指令的封装(转了一些转换转换成了python语言),但selenium只封装了部分浏览器操作,当你发现有一些操作用seleniuim玩不成的话,此时就可以直接发送js代码执行,你就可以调用这样的代码driver.execute_script()表示执行js指令。例如:js_code ="return document"   ,driver.execute_script(js_code)

  1、有哪些指令在selenium在不存在?

  (1)如修改元素的属性(比如修改readonly、disable属性等)

  (2)窗口的滚动

   ......

 

  2、写js代码,有两种方式:

  (1)可以直接在浏览器console(控制台)中写,如下图

         

  (2)写在html代码文件中,下面这些代码在自动化测试中用不到,只需要知道有这种机制就可以了,自动化测试要学的是哪些js呢?即,dom对象。  

  <!DOCTYPE html>
  <html lang="en">
  <head>
  <meta charset="UTF-8">
   <title>Title</title>
  </head>
  <body>

   <!--(方式三)同过各种事件触发执行(以on开头的都是事件)-->
  <!--例如,通过点击hello word,触犯执行myAlert()-->
  <!--<h2 onclick="myAlert()">hello world</h2>-->

   <!--例如,通过鼠标悬浮,触犯执行myAlert()-->
  <h2 onmouseover="myAlert()">hello world</h2>

   <script>
   <!--(方式一)线性代码-->
   <!--let name ='david'-->
   <!--if (name=='chenglong'){-->
   <!--alert('成龙')-->
   <!--}else{-->
   <!--alert('david')-->
  <!--}-->

   <!--(方式二)放到函数里执行-->
  function myAlert(){
  let name ='david';
  if (name=='chenglong'){
   alert('成龙')
  }else{
   alert('david')
   }
   }
  <!--(方式二)放到函数里执行,但需要调用才能被浏览器执行-->
  <!--myAlert()-->
  </script>

  </body>
  </html>

 

         

 

 

   3、js常用指令

  (1)打印,有两种方式实现打印 console.log()、alter()后者也是打印,只是把要打印的内容以弹框的形式弹出来。不管什么语言先要学的就是打印,因为可以帮助调试代码。

  (2)定义变量 var name = 'helloworld' ,现在已不太用这种方式定义js里的变量了。let name ='helloworld' 这是js新的定义变量的标准。

  (3)数据类型,let  name = "helloworld" ,name = 123 ,name = true(注意是小写的),name = [1,2,3] ,name = {"name":"david"}

  (4)条件语句

    if(age>18){
    alert("已经成年");
    }else if(age==18){
    alert("要成年了")
    }else{
    alert("未成年")
    }

           

     (5)for、while循环自动化测试用的不多。可以去菜鸟教程学习,https://www.runoob.com/js/js-tutorial.html

  (6)函数,function

           

  4、dom 对象,重点

  之前做过js 跟python的对比,用法是差不多的。python里什么东西都可以用类和对象来表示,比如selenium访问浏览器对象Chrome()、FireFox(),同时在js当中它也可以用类和对象的方式去表示所有的情况,但是js里的类和对象有一个非常特殊存在,特殊在哪里,即js的解释器集成在浏览器当中。那么这个特殊之处就会引发一系列连锁的反应,当我们打开任意界面的时候,js就会自动的把你打开的界面窗口封装成一个对象。打开一个html页面,它的源代码是由html文档构成,hmtl文档其实就是一些文字本质跟python里的字符串一回事,js就做了一些事情,即你打开这个文档以后会把它转化成js里对象,整个窗口包含标题存放到叫window的对象里面,window下有各种属性和方法是可以调用的。还有一个文档,这个文档是窗口里的一部分,叫做document,整体页面上的内容保存在document对象里,document对象里也有各种属性比如url可调用,document.body,document.url就能获取对应的属性,所以打开任意界面都帮助我们封装成js对象了,既然封装成对象了,那么想去操作页面、窗口,我们通过代码的方式怎么操作呢?  

  (1)通过代码方式如何去操作对象(document、window对象),即通过方法和属性两种方式。

    -属性:获取属性、修改属性。

    -方法:获取方法、修改属性。

      

 

 

          

 

         

 

 

    

  

 

 

   所以任何的网页面上任何的东西都可以通过js去控制,不管什么样的操作你想在selenium中如果你不知道怎么玩的在python中它实现不了的,就可以发送对应的js指令直接让前端的js代码去修改或操作浏览器,之后如果想深入研究ui自动化内容就要深入研究js,学的越深做UI自动化越得心应手。以上可知通过方法和属性都可以修改页面,那么这个页面和dom关键字有什么关联没有? 

   (2)什么是dom 对象

  DOM(DOM—Document Object Model)是W3C国际组织的一套Web标准。它定义了访问HTML文档对象的一套属性、方法和事件。DOM是以层次结构组织的节点或信息片断的集合。文档对象模型(Document Object Model)是给HTML与XML文件使用的一组API。DOM的本质是建立网页与脚本语言或程序语言沟通的桥梁。

  dom就是可它可以把一个html(docoment)变成一个对象,也就是整体html就是一个对象,html标签它也是个对象但是可以通过属性的方式去获取,即docment.getRootNode()、document.body、document.head......所以在整个页面所有的都是对象(标签是对象,属性也是对象、文本也是对象......这跟python是类似的一切皆对象)。

  总之,在自动化测试里边对dom的理解就基本上等同于对docement这个对象的操作,

 

 

  

7.5、日期控件操作(js应用场景1)

  方式一, 直接定位到元素,然后点击

        

        

 

 

  方式二, 通过js方式修改属性、value

  

 

  

 

 

  方式二,转换成python代码如下:

  from selenium import webdriver

  import time

  driver = webdriver.Firefox()

  driver = implicitly_wait(5)

  driver.get('https://www.12306.cn/index/')

  # 执行js语句写上日期

  time.sleep(5)  # 注意加强制等待,因为下面js代码已经超出selenium范围了

  js_code = " let input = document.getElementById('train_date');input.value = '2022-07-02';"

  druver.execute_script(js_code)

    

  # 还有一种表示方法,python和js混用,即有些东西可以通过python实现,有些东西必须通过js实现,比如上面的语句定位元素的代码可以用python实现。

  input_elem = driver.find_element('id','train_date') # 定位到了元素

  time.sleep(5) # 注意加强制等待,因为下面js代码已经超出selenium范围了

  js_coce = "arguments[0].value= ' 2022-07-02' " # arguments[0] 表示替换变量的意思,0表示第1个。

  driver.execute_script(js_code,input_elem)

  # driver.execute_script(js_code,input_elem,input_elem2) #多个变量的情 况,arguments[0]表示取input_elem,arguments[1]表示取input_elem2变量

 

 

  

7.6、窗口滚动(js应用场景2)

  1、懒加载,像这种方式只能通过下拉条去控制,没有按钮可以点的,那怎么去实现呢?先用js去实现,因为selenium没有对应的封装方法。

  window.scrollTo(0,1000) ,滚动到某一个像素点,滚动到高度为1000的位置。即根据高度进行判断。

  window.scrollTo(0,document.body.scrollHeight) 滑动到页面最底下。

  window.scrollTo(0,document.body.scrollHeight/2) 滑动到页面中间位置。

  window.scrollBy(0,1000)              ,是我要滚动多少像素点。

   在一个窗口里面,有一个元素它是可以滚动的,有没有见过,这种情怎么玩?首先要定位到可以滚动的那个元素,是最外层的那个元素,要找个整体可以滚动的窗口,然后这个窗口也是可以调用scrollTo这个方法的,就跟window.scrollTo(0,1000)是一样的,只是你要先定位到元素,然后在元素.scrollTo(0,100)。

  如何元素滚动到可视范围内?如果你发现你要点击的元素不生效,你就先看下,你能不能看到这个元素,如果看不到的话就很有可能点不了。以下非js实现。

  el = driver.find_element('xpath',"//h2[contains(text(),‘友情链接')]") # 找到需要定位的元素

  el.location_once_scrolled_into_view # 将元素滚动到可视范围之内

 

7.7、文件上传

  1、简单版的上传,针对<input type="file">这种类型的文件上传,可直接通过send_keys发送文件路径

  f = driver.find_element('id','mfile')

  f.send_keys(r'D:\ydw.txt')

  time.sleep(2)

 

  2、非input type="file"的文件上传,点击上传按钮弹出上传文件的弹框,属于操作系统的弹框,selenium无法控制,只能借助系统的自动化工具操作。

  window平台,方式一,借用pywinauto  ,pip install  pywinauto (适用所有类型的上包括input type="file"类型的,如果是window建议用这种

  from pywinauto.keyboard import send_keys

  import time

  from selenium import webdriver

  driver = webdriver.Firefox()

  dirver.get('http://xxxxxxxxxxxxx')

  f = driver.find_element('id','mfile')

  time.sleep(2)

  f.click() # 触发点击事件,让系统的弹框出来

  time.sleep(1) # 加个等待,因为弹框弹出来需要时间

  send_keys(r'D:\ydw.txt')  # 此处的send_keys()不是selenium里的,而是pywinauto的。

  # send_keys(r'D:\ydw1.txt')  # 如果需要上传多个文件,多次调用send_keys()即可 

  # send_keys(r'D:\ydw2.txt')  # 如果需要上传多个文件,多次调用send_keys()即可 

  send_keys('{VK_RETURN}') # 上传确认,固定写法记住即可。

  time.sleep(2)

  3、pyautogui跨平台,适用window、linux、mac

  安装:

  pip install pillow==6.2.2

  pip install pyautogui

  用法:

  点击click()以后,即弹出上传文件的框。

  time.sleep(1)

  pyautogui.write(r'd:\ydw.txt')

  pyautogui.press('enter',2) # 需要连续按2次,是这个库的bug按1次不生效。

  4、pywin32,古老的方法,用起来麻烦,不建议使用。

8、自动化测试工程

8.1、自动化测试流程

从0开始组建自动化测试团队(前提要知道自动化测试流程),尤其小公司没有自动化测试招你进行组建自动化测试团队,对于已有经有自动化的公司那么只需维护即可

1、需求分析(熟悉业务,最好已经做过多次手工测试)
2、自动化测试方案。为什么要自动化,主要应用场景,主要使用模块,技术选型和对比,方案特点和优势、具体运行手册、产出和效率、运行策略、维护。
3、用例编写和自动化用例提取
4、用例评审
5、运行用例(代码编写)
6、报告

----步骤1到6,与手工流程基本一样

1、需求分析(熟悉业务,最好已经做过多次手工测试)
   想去做自动化测试,去做需求分析,基本上在手工测试时候就已经搞定了,如果你们公司之前已经有手工测试了,想让你去搭建自动化团队,那么肯定你之前是已经知道需求是什么样子了,你都做过几轮手工测试了,连需求都搞不清楚吗,这不太可能,所以你去做自动化之前你就须把整体业务流程要梳理清楚,最好是你分析需求的时候你先做几轮手工测试,看具体业务是怎么样子的,所以在没做手工测试之前是不建议直接开弄自动化测试。为什么要先做手工测试熟悉业务呢,因为自动化不是万能的,有的项目适合做自动化,有的项目不适合做自动化,有的功能适合做自动化,有的功能不适合做自动化,所以先要手工摸清楚。

2、自动化测试方案。
   参照手工测试方案去写,没有模版,每个公司方案差别挺大的。
   自支化测试方案要包含哪些内容:
  1)为什么要自动化。a、解决重复劳动,给公司节约成本
  2)主要应用场景。
  3)主要使用模块。比如主流程适用。支付业务需要拿个手机去扫就不适合做自动化测试。
  4)技术选型比对。你会用到哪些技术,你为什么要用。
       python/java: a、python开发效率更高、更快 b、python好招人
       web:selenium/cypress/ playwright 你要选择框架到底用哪个,比如你现在要用python语言,那肯定就不能用cypress,因为cypress是js写的。为什么要用selenium,即支持多浏览器、业界标准、支持多语句、远程支持。即把selenium优势说出来即可。

             pytest/unittest:你还要去选,你即然要用python,你肯定要去选单元测试框架,pytest还是unittest,到底用哪个,为什么要用他,因为1,2,3,4.。等等。所 以技术选型大家说原因的时候最好是做一个对比。对比可以也不写可以在网上找。

      PO模式,数据驱动,关键字驱动,这些东西你为什么要用,好处是什么。
  5)方案特点和优势。
             好维护、开发效率高、好招人。
  6)具体运行手册:环境搭建(告诉别人环境怎么搭建、怎么用的,需要哪些依赖)
  7)产出和效率:
        产出:自动化测试你会产出些什么东西出来?测试报告、要写一些自动化用例等等。
        效率:你去设计自动化用例,什么时候可以写多少个。是不是要告诉别人。时间节点要告诉别人。比较重要。deadline。框架要多久写完,用例要多久写完。这周做到什么地步,下周要做到什么时候地步。

   8)运行策略:什么时候去执行自动化。晚上12点跑or提交一个新的版本就去构建or手工点去运行。
   9)维护:后续可能会有哪一些发展或优化的空间比如搭建自动化测试的平台进行可视化。或者包装成小工具。
3、用例编写和自动化用例提取
4、用例评审
5、运行用例(代码用例)
6、报告

 

自动化测试方案:例子(目录)

一、自动化测试背景............................................................................................................................4
  1.1目的........................................................................................................................................4
   1.2当前业务的痛点&解决方案......................................................................................4
      1.3方案调研.................................................................................................................4
 二、业务系统概况.............................................................................................................5
   2.1测试项目..................................................................................................................5
   2.2功能模块..................................................................................................................5
 三、自动化测试框架选型及设计思想................................................................................5
   3.1编程语言..................................................................................................................6
   3.2单元测试框架对比选型号.........................................................................................7
      3.3主流移动端AppUI测试工具对比选型(Andriod)........................................................7
      3.4框架设计模式..........................................................................................................7
      3.5测试脚本执行流程图...............................................................................................8
 四、自动化测试框环境准备..............................................................................................9
   4.1相关工具.................................................................................................................9
 五、自动化测试用例产出.................................................................................................10
   5.1自动化覆盖功能模块...............................................................................................10
   5.2自动化用例评审......................................................................................................10
      5.3自动化用例编写及产出效率....................................................................................10
      5.4核心用例覆盖..........................................................................................................10
 六、自动化测试运行策略..................................................................................................11
 七、自动化测试执行阶段..................................................................................................12
      7.1自动化用例脚本填充策略........................................................................................12
      7.2失败重试机制,提高用例稳定性.............................................................................12
      7.3测试结果分析............。..........................................................................................12
      7.4测试报告样式..........................................................................................................13
 八、自动化测试维护阶段..................................................................................................14
      8.1脚本维护.................................................................................................................15
      8.2框架优化.................................................................................................................15
 九、总结...........................................................................................................................15
      9.1前期投入.................................................................................................................15
      9.2jenkins集成.............................................................................................................15

8.2、自动化测试适用场景

  • 需求稳定
  • 研发和测试周期长,需要频繁的执行回归测试
  • 需要在多种平台上重复运行相同测试的场景(什么场景可以在多端重复执行,接口,接口是多端都一样的,没有说web和andriod在后端不是同一套接口。一般来说web、andriod、ios都共用一套接口的。所以这套接口测试就可以在多个平台上重复执行。)
  • 某些测试项目通过手工测试无法实现,或者手工成本太高(并发测试、负载测试,即性能测试jmeter)
  • 被测软件的开发较规范,能够保证系统的可测试行

 

8.3、自动化测试工程效果

  • 实现代码,即实现功能
  • 易于维护
  • 节约功力

8.4、跑通自动化测试流程

  

 

 

posted @   DV哥  阅读(586)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示