由机器设备代替人工自动完成指定目标的过程
概念:让程序代替人工去验证系统功能的过程
回归测试:项目在发新版本之后对项目之前的功能进行验证
压力测试:可以理解多用户同时去操作软件,统计软件服务器处理多用户请求的能力
兼容性测试:不同浏览器(IE、Firefox、Chrome)等
程序代替人工自动验证Web项目功能的过程
功能测试完毕(手工测试)(1、时间问题;2、功能不完善)
按照代码可见度划分:
Web自动化测试属于黑盒测试(功能测试)
Web自动化测试的三板斧:
● 定位元素
● 交互元素
● 进行断言
Selenium是一个用于Web应用程序的自动化测试工具
- 开源软件:源代码开放可以根据需要来增加工具的某些功能
- 跨平台:Linux、Windows、Mac
- 支持多种浏览器:Firefox、Chrome、IE
- 支持多种语言:Python、Java、C#、JavaScript、Ruby、PHP等
- 成熟稳定:目前已经被谷歌、百度、腾讯等公司广泛使用
- 功能强大:支持商业化大部分功能,由于开源,可定制化功能
python+Pychram+selenium+chrome+谷歌浏览器驱动
谷歌版本和浏览器驱动一定要一致
查看:pip show selenium
卸载:pip unistall selenium
扩展:
○ 安装指定版本:pip install selenium==版本号
○ pip是python中包管理工具(可以安装,卸载,查看python工具)
○ pip list:查看通过pip包管理工具安装的插件或工具
提示:
使用pip必须联网;默认安装python3.5版本以上工具,自带pip包管理工具,默认会自动安装并且添加path环境变量
打开中国镜像站,下载驱动。中国镜像网址
说明:指定系统搜索的目录
dos命令默认搜索顺序:
- 检测是否为内部命令
- 检测是否为当下目录可执行文件
- 检测path环境指定的目录
- 如果以上搜索目录都检测不到输入的命令或可执行文件,系统会抛出不是内部或外部命令
在web环境中,如果不将浏览器驱动添加到path中,会提示selenium驱动有误
1、导包
import time
from selenium import webdriver
2、获取谷歌浏览器对象
driver = webdriver.Chrome()
3、打开网页
driver.get("https://www.baidu.com/")
#暂停三秒
time.sleep(3)
#退出浏览器
driver.quit()
推荐原因:安装到当前工程环境内
提示:如果使用pip install插件名安装过后,打开pycharm导包操作时,提示找不到此包,说明使用pip install默认安装的路径和当前工程的环境路径不是同一个环境,进行以上处理可以解决问题。
----让程序操作执行元素,就必须先找到此元素。
● 标签名
● 属性
● 层级
● 路径
如果元素定位不到,你是怎么去分析的?
汇总:
1.基于元素属性特有定有定位:id/name/class_name
2. 基于元素标签名称定位:tag_name
3. 定位超链接文本:link_text/partail_link_text
4. 基于元素路径定位:xpath
5. 基于选择器:css
"""底层代码"""
from selenium.webdriver.common.by import By
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"
HTML规定id属性在HTML文档中必须是唯一的
driver.find_element(By.ID, “id名”).send_keys(“输入内容”)
#打开浏览器
driver = webdriver.Chrome()
加载网页
driver.get("https://www.baidu.com/")
定位元素(利于封装)
driver.find_element(By.ID, "kw").send_keys("输入的内容")
driver.find_element(By.NAME, "wd").send_keys("输入的内容")
driver.find_element(By.CLASS_NAME,"login-top")
通过标签名来定位,一般很少使用
如果页面中存在多个相同的标签名,默认返回第一个
driver.find_element(By.TAG_NAME,"input").send_keys("admin")
精确匹配超链接
driver.find_element(By.LINK_TEXT,"新闻").click()
模糊匹配超链接
driver.find_element(By.PARTIAL_LINK_TEXT,"新").click()
如果要定位的元素没有id、name、class属性,该如何进行定位?
----使用xpath。
xPath是XML Path的简称,是一门在XML文档中查找元素信息的语言
XML是一种标记语言。
● 本质是一种查询语言
●支持逻辑运算、函数
● 实现非常强大的功能
● 可以用于APP自动化测试
依赖于元素的路径:
● 绝对路径:/开头是绝对路径
● 相对路径://开头是相对路径
#1、相对路径+索引定位 //form/span/input
driver.find_element(By.XPATH,"//form/span/input").send_keys("输入的内容")
#2、相对路径+属性定位 //input[@autocomplete='off']
driver.find_element(By.XPATH,"//input[@autocomplete='off']").send_keys("输入的内容")
#3、相对路径+通配符定位 *复制xpath不是万能的,经常会报错
driver.find_element(By.XPATH,"//*[@autocomplete='off']").send_keys("输入的内容")
driver.find_element(By.XPATH,"//*[@*='off']").send_keys("输入的内容")
#4、相对路径+部分属性值定位 input[starts-with(@autocomplete,'of')]
driver.find_element( # auto属性以of开头:starts-with
By.XPATH,"//input[starts-with(@autocomplete,'of')]"
).send_keys("输入的内容")
driver.find_element( # auto属性从第二个字符开始截取,为ff的:substring
By.XPATH,"//input[substring(@autocomplete,2)='ff']"
).send_keys("输入的内容")
driver.find_element( # auto属性包含字符of:contains
By.XPATH,"//input[contains(@autocomplete,'of')]"
).send_keys("输入的内容")
#5、相对路径+文本定位
value = driver.find_element(
By.XPATH,"//span[text()='按图片搜索']"
).get_attribute('class')
1、XPATH的语法
语法:表示层级+属性
- /(开头)表示根路径
/html/body/div- //(任意层级)(包括下级、下级的下级…)
//div- @属性
‘//a[@target=“_top”]’- /(中间)表示下一级
‘//p//input’- .表示本级
- …表示上一级
2、 XPATH的函数
函数是XPATH另一个魅力,常用的函数:
● text:获取元素内的文本
● contains:任意位置包含匹配
● starts-with:开头
● substring:截取
$x(“//a[text=(vivoX5MAX L 移动4G 八核超薄大屏5.5双卡)]”)
$x(“//a[contains( text=(),‘vivo’) ]”)
$x(“//a[start-with( text=(),‘vivo’) ]”)
$x(“//a[substring(@name,2)=‘vi’ ]”)
1. id选择器
2. class选择器
3. 元素选择器
4. 属性选择器
5. 层级选择器
6. 【css延伸】
input[type^=‘p’] type属性以p字母开头的元素
input[type$=‘d’] type属性以d字母结束的元素
input[type*=‘w’] type属性包含w字母的元素
#1.使用css id选择器 定位用户名 输入admin
driver.find_element(By.CSS_SELECTOR, "#userA").send_keys("admin")
#2.使用css 属性选择器 定位密码框 输入123456
driver.find_element(By.CSS_SELECTOR, "[name='passwordA']").send_keys("123456")
#3.使用css class选择器 定位电话号码 输入18611112222
driver.find_element(By.CSS_SELECTOR, ".telA").send_keys("18611112222")
#4.使用css 元素选择器 定位span标签获取文本值
span = driver.find_element(By.CSS_SELECTOR, "span").text
print("获取的span标签文本值为:",span)
#5.使用层级选择器 定位email 输入[email protected]
driver.find_element(
By.CSS_SELECTOR,"p>input[placeholder='电子邮箱A']"
).send_keys("[email protected]")
定位方式 | XPath | CSS |
---|---|---|
元素名 | //input | input |
id | //input[@id=‘userA’] | @userA |
class | //*[@class=‘telA’] | .telA |
属性 | 1.//*[text()==“xxx”] 2.//input[starts-with(@attribute,‘xxx’)] 3.//input[contains(@attribute,‘xxx’)] |
1.input[type^=‘p’] 2.input[type$=‘d’ 3.input[type*=‘w’] |
import unittest
from selenium import webdriver
class TestCase(unittest.TestCase):
def test_01_login(self):
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestCase(unittest.TestCase):
def test_01_login(self):
global driver
# 1、打开浏览器
driver = webdriver.Chrome()
# 2、加载网页
driver.get("https://www.baidu.com/")
# 3、定位元素
driver.find_element(By.XPATH, "//form/span/input").send_keys("输入的内容")
unittest运行测试用例的一个很大的坑: