UI自动化测试
一.自动化测试
-
定义:可以理解为通过一定的技术手段,操作机器来得到人的模拟操作
-
目的:&意义:随着产品的完善,需要回顾验证的测试点越来越多,这个时候我们可以通过自动化测试的技术的手段,把需要回归的测试点中,可以使用自动化测试实现的部分实现,那么这样,我们需要回归测试的点就会减少,已实现的部分可以一劳永逸。
-
分类:
-
UI自动化测试:(前端自动化测试)--->selenium(工具&框架&库)
-
API自动化测试
-
单元自动化测试
-
二.UI自动化测试
-
环境搭建
-
安装selenium第三方库:pip3 install selenium
-
安装Chrome浏览器
-
下载浏览器对应的驱动,然后把Chromedriver放在python的安装目录下
-
查看浏览器的版本(设置--->关于chrome--->版本号)
-
-
-
-
-
到http://npm.taobao.org/mirrors/chromedriver/下载对应版本的驱动
-
-
-
-
-
下载后解压到python的目录下,然后以管理员身份运行,控制台跳出以下代码表示安装成功
Only local connections are allowed. Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe. ChromeDriver was started successfully.
-
-
-
查看selenium版本
-
查看元素定位方法
-
-
查看方法
-
-
-
结果
-
-
单个元素定位方法的的使用
-
-
id定位方法
- 查看id
-
-
-
- 通过代码实现自动化测试:
from selenium import webdriver import time as t #导入库 driver=webdriver.Chrome() #指定被测的浏览器并且对webdriver进行实例化 driver.get("http://www.baidu.com/") #导航到被测网址 t.sleep(2) #停留2秒 driver.find_element_by_id("kw").send_keys("python") #按照页面属性id定位到输入框并输入“python” driver.find_element_by_id("su").click() #按照页面属性id定位到百度一下并点击 t.sleep(3) #停留5秒 driver.quit() #退出
- 通过代码实现自动化测试:
-
name定位方法
- 查看name方法同上
- 代码
from selenium import webdriver import time as t #导入库 driver=webdriver.Chrome() #指定被测的浏览器并且对webdriver进行实例化 driver.get("http://www.baidu.com/") #导航到被测网址 t.sleep(2) #停留2秒 driver.find_element_by_name("wd").send_keys("python")#send_keys是输入 #按照页面属性name定位到输入框并输入“python” driver.find_element_by_id("su").click()#click是点击 #按照页面属性id定位到百度一下并点击 t.sleep(3) #停留5秒 driver.quit() #退出
-
class name定位方法
- 查看classname方法同上
- 代码
from selenium import webdriver import time as t #导入库 driver=webdriver.Chrome() #指定被测的浏览器并且对webdriver进行实例化 driver.get("http://www.baidu.com/") #导航到被测网址 t.sleep(2) #停留2秒 driver.find_element_by_class_name("s_ipt").send_keys("python")#send_keys是输入 #按照页面属性class name定位到输入框并输入“python” driver.find_element_by_id("su").click()#click是点击 #按照页面属性id定位到百度一下并点击 t.sleep(3) #停留5秒 driver.quit() #退出
-
xpath定位方法(在前面方法使用不了的情况下使用)
- 查看xpath方法
-
-
- 代码
from selenium import webdriver import time as t #导入库 driver=webdriver.Chrome() #指定被测的浏览器并且对webdriver进行实例化 driver.get("http://www.baidu.com/") #导航到被测网址 t.sleep(2) #停留2秒 driver.find_element_by_xpath('//*[@id="kw"]').send_keys("python") #按照页面属性xpath定位到输入框并输入“python” driver.find_element_by_xpath('//*[@id="su"]').click()#click是点击 #按照页面属性xpath定位到百度一下并点击 t.sleep(3) #停留5秒 driver.quit() #退出
-
css selector 定位方法
- 查看css selector方法
- 代码
-
-
- 代码:
from selenium import webdriver import time as t #导入库 driver=webdriver.Chrome() #指定被测的浏览器并且对webdriver进行实例化 driver.get("http://www.baidu.com/") #导航到被测网址 t.sleep(2) #停留2秒 driver.find_element_by_css_selector('#kw').send_keys("python") #按照页面属性css selector定位到输入框并输入“python” driver.find_element_by_css_selector('#su').click()#click是点击 #按照页面属性css selector定位到百度一下并点击 t.sleep(3) #停留5秒 driver.quit() #退出
- 代码:
-
link text 超链接精确定位方法
- 查看属性是否为超链接
-
-
-
- 代码
from selenium import webdriver import time as t #导入库 driver=webdriver.Chrome() #指定被测的浏览器并且对webdriver进行实例化 driver.get("http://www.baidu.com/") #导航到被测网址 t.sleep(2) #停留2秒 driver.find_element_by_link_text("新闻").click()#click是点击 #按照页面属性超链接定位“新闻”并点击 t.sleep(3) #停留5秒 driver.quit() #退出
- 代码
-
partial link text 超链接模糊定位方法
- 查看属性是否为超链接方法如上
- 代码
from selenium import webdriver import time as t #导入库 driver=webdriver.Chrome() #指定被测的浏览器并且对webdriver进行实例化 driver.get("http://www.baidu.com/") #导航到被测网址 t.sleep(2) #停留2秒 driver.find_element_by_partial_link_text("hao").click()#click是点击 #按照页面属性超链接模糊定位“hao123“并点击 t.sleep(3) #停留5秒 driver.quit() #退出
-
tag name定位方法
-
tag_name可以理解为是标签,怎么理解了,就是就是百度搜索输入框,它的标签是input,那么针对这种我们可以使用标签的方式来进行,使用到的方法是ftag_name
-
测试代码如下:
from selenium import webdriver import time as t driver=webdriver.Chrome() driver.get('http://www.baidu.com') driver.find_element_by_tag_name('input').send_keys('UI自动化测试') t.sleep(3) driver.quit()
当我们执行以上代码的时候,就会报错:
F:\python\code\testshare\练习\share\练习.py:11: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead driver.find_element_by_tag_name('input').send_keys('UI自动化测试') Traceback (most recent call last): File "F:\python\code\testshare\练习\share\练习.py", line 11, in
driver.find_element_by_tag_name('input').send_keys('UI自动化测试') File "F:\Python3\lib\site-packages\selenium\webdriver\remote\webelement.py", line 540, in send_keys self._execute(Command.SEND_KEYS_TO_ELEMENT, File "F:\Python3\lib\site-packages\selenium\webdriver\remote\webelement.py", line 710, in _execute return self._parent.execute(command, params) File "F:\Python3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 424, in execute self.error_handler.check_response(response) File "F:\Python3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable (Session info: chrome=96.0.4664.45) Stacktrace: Backtrace: Ordinal0 [0x01146903+2517251] Ordinal0 [0x010DF8E1+2095329] Ordinal0 [0x00FE2710+1058576] Ordinal0 [0x01008993+1214867] Ordinal0 [0x010080DF+1212639] Ordinal0 [0x010264D3+1336531] Ordinal0 [0x01003A36+1194550] Ordinal0 [0x010265BA+1336762] Ordinal0 [0x01035BBF+1399743] Ordinal0 [0x0102639B+1336219] Ordinal0 [0x010027A7+1189799] Ordinal0 [0x01003609+1193481] GetHandleVerifier [0x012D5904+1577972] GetHandleVerifier [0x01380B97+2279047] GetHandleVerifier [0x011D6D09+534521] GetHandleVerifier [0x011D5DB9+530601] Ordinal0 [0x010E4FF9+2117625] Ordinal0 [0x010E98A8+2136232] Ordinal0 [0x010E99E2+2136546] Ordinal0 [0x010F3541+2176321] BaseThreadInitThunk [0x7755FA29+25] RtlGetAppContainerNamedObjectPath [0x77B27A9E+286] RtlGetAppContainerNamedObjectPath [0x77B27A6E+238] 出现这个问题说明元素定位找不到,导致错误,那么有可能是定位到的元素属性是错误,还有一种是我们需要索引的方式来解决。
-
-
如果是后者,是单个元素定位的方式无法解决的,多个元素定位方法可以解决,如下。
-
多个元素定位方法
- 需求:当元素属性的ID,name等完全一致的时候,无法使用单个元素定位的方式来解决,那么可以使用多个元素定位的方式来进行
- 解决思路:获取元素的属性是一个列表,看我们被定位的目标属性是在第几位,通过索引来定位
- 如上面百度搜索输入框为案例,我们前面使用的是input标签的方式进行定位的,但是我们通过查找标签发现input有8个标签,不是唯一性的:
- 针对这种元素不是唯一性的,就可以使用多个元素定位方法解决,多个元素获取到的是一个列表,那么我们就可以使用列表的索引进行定位,通过上图我们得知搜索框的索引为7,测试代码如下:
from selenium import webdriver #导入库里面的模块 import time as t #导入库 driver=webdriver.Chrome() driver.get("http://www.baidu.com") tags=driver.find_elements_by_tag_name("input") #把查找到的是一个列表,给他一个变量tags tags[7].send_keys("UI自动化测试") #在列表中索引为7的位置(也就是搜索框)输入“UI自动化测试” t.sleep(3) #停留/等待三秒 driver.find_element_by_id("su").click() #点击搜索 t.sleep(3) driver.quit()#关闭
-
iframe框架定位方法
-
需求:如QQ邮箱的的登录页面,登录按钮是在一个框架中如QQ邮箱的的登录页面,登录按钮是在一个框架中如QQ邮箱的的登录页面,登录按钮是在一个框架中
我们通过查看源代码的方式也可以看到他是在一个frame的框架中
-
-
-
解决思路:首先进入框架,再定位到元素操作
-
id方法:
from selenium import webdriver#导入库的模块 import time as t#导入库 driver=webdriver.Chrome()#进入要操作的浏览器 driver.maximize_window()#浏览器最大化 driver.get("https://mail.qq.com/")#进入要测试的网址 driver.switch_to.frame("login_frame")#进入到要操作的框架 driver.find_element_by_link_text("帐号密码登录").click()#定位到元素并点击 driver.quit()#退出浏览器
-
name方法:
from selenium import webdriver#导入库的模块 import time as t#导入库 driver=webdriver.Chrome()#进入要操作的浏览器 driver.maximize_window()#浏览器最大化 driver.get("https://mail.qq.com/")#进入要测试的页面 t.sleep(3)#停留3秒 driver.switch_to.frame("login_frame")#通过name进入框架 t.sleep(3)#停留三秒 driver.find_element_by_link_text("帐号密码登录").click()#定位到元素并点击 t.sleep(3)#停留3秒 driver.quit()#退出
-
索引方法:
from selenium import webdriver#导入库的模块 import time as t#导入time库 driver=webdriver.Chrome()#进入测试的浏览器 driver.maximize_window()#浏览器最大化 driver.get("https://mail.163.com/") #进去需要测试的页面 t.sleep(5)#停留5秒 driver.switch_to.frame(0)#通过索引进入模块 driver.find_element_by_name("email").send_keys("242134")#定位到元素进行操作 t.sleep(5)#停留5秒 driver.quit()#退出
-
-
浏览器属性
-
current_url:获取测试的地址
from selenium import webdriver #导入库中的模块 driver=webdriver.Chrome() #打开测试需要使用的浏览器 driver.maximize_window() #浏览器最大化 driver.get("http://www.baidu.com") #进入测试的网页 print("测试的地址:",driver.current_url) #输出测试网页的地址 assert driver.current_url.endswith("baidu.com/")==True #assert 断言:期望结果与实际结果是否相符 driver.quit() #退出浏览器
输出结果:
测试的地址: https://www.baidu.com/
-
page_source:获取测试页面的源代码
from selenium import webdriver #导入库中的模块 driver=webdriver.Chrome()#测试需要使用的浏览器 driver.maximize_window()#浏览器最大化 driver.get("http://www.baidu.com")#测试页面的网址 print("页面源代码:",driver.page_source)#获取源代码并且输出 driver.quit()#退出
-
title:获取页面的title
from selenium import webdriver #导入库中的模块 driver=webdriver.Chrome()#测试需要使用的浏览器 driver.maximize_window()#浏览器最大化 driver.get("http://www.baidu.com")#测试页面的网址 print("页面的title:",driver.title)#获取页面的title并输出 #assert 断言:期望结果与实际结果是否相符 assert driver.title=="百度一下,你就知道"#判断页面的title是否为“百度一下,你就知道” driver.quit()#退出浏览器
输出结果:
页面的title: 百度一下,你就知道
-
也面对前进forw后退back和刷新refre
from selenium import webdriver #导入库中的模块 import time as t #导入库 driver=webdriver.Chrome()#测试需要使用的浏览器 driver.maximize_window()#浏览器最大化 driver.get("http://www.baidu.com")#进入测试页面A的网址 t.sleep(3)#停留3秒 driver.get("https://cn.bing.com/")#进入测试页面B的网址 t.sleep(3)#停留3秒 driver.back()#后退一步,会进入页面A print("页面地址",driver.current_url)#输出页面地址 t.sleep(3)#停留3秒 driver.forward()#前进一步,会进入页面B print("页面地址:",driver.current_url)#输出页面地址 driver.find_element_by_id('sb_form_q').send_keys("123421")#定位到输入框,输入内容 t.sleep(3)#停留3秒 driver.refresh()#刷新页面 t.sleep(3)#停留3秒 driver.quit()#退出浏览器
-
页面的切换
from selenium import webdriver #导入库里面的模块 import time as t #导入库 driver=webdriver.Chrome() #测试使用的浏览器 driver.maximize_window() #浏览器最大化 driver.get("http://www.baidu.com") #测试的页面A nowHandler=driver.current_window_handle#定义当前页面(页面A) t.sleep(3)#停留3秒 driver.find_element_by_partial_link_text("hao").click()#超链接定位属性hao123,并点击,会跳转到页面B t.sleep(3)#停留3秒 allHandlers=driver.window_handles#定义所有页面(页面A和页面B) driver.switch_to.window(nowHandler)#切换到当前页面(页面A) t.sleep(3)#停留3秒 for item in allHandlers: #对所有页面进行循环 if item!=nowHandler:#如果不是当前页面(页面A),那就是页面B,定义为item driver.switch_to.window(item)#切换到另外一个页面(页面B) t.sleep(3)#停留3秒 driver.find_element_by_xpath('//*[@id="search"]/form/div[2]/input').send_keys("hao123")#通过xpath方法定位到搜索框输入hao123 t.sleep(3)#停留3秒 driver.find_element_by_xpath('//*[@id="search"]/form/div[3]/input').click()#定位到搜索按钮,点击,会跳转到一个新的页面(页面C) t.sleep(3)#停留3秒 driver.close()#退出这个页面(页面B),就会剩页面A跟页面C t.sleep(3)#停留3秒 driver.switch_to.window(nowHandler)#进入当前页面(页面A) t.sleep(3)#停留3秒 driver.find_element_by_id("kw").send_keys("baidu")#定位到输入框输入baidu t.sleep(3)#停留3秒 driver.quit()#退出浏览器
-
clear清空
from selenium import webdriver #导入库里面的模块 import time as t #导入库 driver=webdriver.Chrome() #测试使用的浏览器 driver.maximize_window() #浏览器最大化 driver.get("http://www.baidu.com") #进入测试的页面 t.sleep(3)#停留3秒 os=driver.find_element_by_id("kw")#定位到搜索框定义为os os.send_keys("python")#输入框搜索python t.sleep(3)#停留3秒 os.clear()#清空输入框 t.sleep(3)#停留3秒 driver.quit()#退出浏览器
-
get_attribute获取元素属性的值(提示信息)
from selenium import webdriver #导入库里面的模块 import time as t #导入库 driver=webdriver.Chrome() #测试使用的浏览器 driver.maximize_window() #浏览器最大化 driver.get("http://www.lagou.com")#进入测试页面 t.sleep(3)#停留3秒 driver.find_element_by_link_text("登录").click()#点击超链接 t.sleep(3)#停留3秒 login=driver.find_element_by_xpath('/html/body/div[3]/div[1]/div/div/div[2]/div[3]/div[1]/div/div[2]/form/div[1]/div/input')#定位到输入框并定义 print("元素属性的值为:",login.get_attribute("placeholder"))#输出元素属性的值 t.sleep(3)#停留3秒 driver.quit()#退出浏览器
输出结果:
元素属性的值为: 请输入常用手机号
-
所有在input里面输入的值,都是value的属性
from selenium import webdriver #导入库里面的模块 import time as t #导入库 driver=webdriver.Chrome() #测试使用的浏览器 driver.maximize_window() #浏览器最大化 driver.get("http://www.baidu.com")#进入测试页面 t.sleep(3)#停留3秒 so=driver.find_element_by_id("kw")#定位到输入框并定义为so so.send_keys("python")#输入python t.sleep(3)#停留3秒 print("value的值:",so.get_attribute("value"))#输出value的值 driver.quit()#退出浏览器
输出结果:
value的值: python
-
is_displayed()查看元素是否可见
from selenium import webdriver #导入库里面的模块 import time as t #导入库 driver=webdriver.Chrome() #测试使用的浏览器 driver.maximize_window() #浏览器最大化 driver.get("http://www.baidu.com")#进入测试页面 t.sleep(3)#停留3秒 aboutBaidu=driver.find_element_by_link_text("关于百度")#定位到元素“关于百度”并定义 print("是否可见:",aboutBaidu.is_displayed())#判断是否可见并输出 driver.quit()#退出浏览器
输出结果:
是否可见: True
-
is_enabled:是否可编辑(readonly:只读属性)
from selenium import webdriver #导入库里面的模块 import time as t #导入库 driver=webdriver.Chrome() #测试使用的浏览器 driver.maximize_window() #浏览器最大化 driver.get("http://www.baidu.com")#进入测试页面 t.sleep(3)#停留3秒 aboutBaidu=driver.find_element_by_id("kw")#定位到输入框并定义 print("是否可以编辑/输入:",aboutBaidu.is_enabled())#判断是否可以编辑/输入并输出 driver.quit()#退出浏览器
输出结果:
是否可以编辑/输入: True
-
is_selected:判断单选按钮是否勾选
from selenium import webdriver #导入库里面的模块 import time as t #导入库 driver=webdriver.Chrome() #测试使用的浏览器 driver.maximize_window() #浏览器最大化 driver.get("https://mail.sina.com.cn/")#到需要测试的页面 autoLogin=driver.find_element_by_id("store1")#定位到单选按钮 t.sleep(3)#停留3秒 print("点击前是否勾选:",autoLogin.is_selected())#判断单选按钮是否勾选并输出 t.sleep(3)#停留3秒 autoLogin.click()#点击单选按钮 t.sleep(3)#停留3秒 print("点击后是否勾选:",autoLogin.is_selected())#判断单选按钮是否勾选并输出 driver.quit()#退出浏览器
输出结果:
点击前是否勾选: True 点击后是否勾选: False
-
-
下拉框的属性选择(使用以下页面代码操作)
"en"> "UTF-8">
htmlTitle 喜欢的编程语言: -
索引方法
from selenium import webdriver #导入库里面的模块 from selenium.webdriver.support.select import Select #导入模块 import time as t #导入库 driver=webdriver.Chrome()#测试需要的浏览器 driver.maximize_window()#浏览器最大化 driver.get('file:///F:/python/code/testdev/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/demo.html')#打开需要测试的页面 t.sleep(2)#停留2秒 nr=driver.find_element_by_id("nr")#定位到下拉框并定义 select=Select(webelement=nr)#Select类的实例化 select.select_by_index(3)#根据索引选择属性 t.sleep(3)#停留3秒 driver.quit()#退出
-
value方法
from selenium import webdriver #导入库里面的模块 from selenium.webdriver.support.select import Select #导入模块 import time as t #导入库 driver=webdriver.Chrome()#测试需要的浏览器 driver.maximize_window()#浏览器最大化 driver.get('file:///F:/python/code/testdev/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/demo.html')#打开需要测试的页面 t.sleep(2)#停留2秒 nr=driver.find_element_by_id("nr")#定位到下拉框并定义 select=Select(webelement=nr)#Select类的实例化 select.select_by_value("Java")#根据value选择属性 t.sleep(3)#停留3秒 driver.quit()#退出
-
文本方法
from selenium import webdriver #导入库里面的模块 from selenium.webdriver.support.select import Select #导入模块 import time as t #导入库 driver=webdriver.Chrome()#测试需要的浏览器 driver.maximize_window()#浏览器最大化 driver.get('file:///F:/python/code/testdev/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/demo.html')#打开需要测试的页面 t.sleep(2)#停留2秒 nr=driver.find_element_by_id("nr")#定位到下拉框并定义 select=Select(webelement=nr)#Select类的实例化 select.select_by_visible_text('Java语言')#根据文本选择属性 t.sleep(3)#停留3秒 driver.quit()#退出
-
-
-
拉勾网下拉框实战
from selenium import webdriver #导入库里面的模块 from selenium.webdriver.support.select import Select #导入模块 import time as t #导入库 driver=webdriver.Chrome()#测试需要的浏览器 driver.maximize_window()#浏览器最大化 driver.get("https://www.lagou.com/")#进入需要测试的页面 t.sleep(2)#停留2秒 driver.find_element_by_id('search_input').send_keys("测试开发工程师")#定位到输入框并输入“测试开发工程师” t.sleep(2)#停留2秒 driver.find_element_by_id('search_button').click()#定位到搜索并点击 t.sleep(2)#停留2秒 driver.find_element_by_xpath('//*[@id="jobsContainer"]/div[2]/div[1]/div[1]/div[2]/div/ul/li[2]/div/i').click()#定位到学历要求下拉框并点击 t.sleep(3)#停留3秒 driver.find_element_by_xpath('//*[@id="jobsContainer"]/div[2]/div[1]/div[1]/div[2]/div/ul/li[2]/div/div/ul[2]/li[4]/span').click()#选择下拉框属性并点击 t.sleep(3)#停留3秒 driver.quit()#退出测试
-