一.自动化测试
-
定义:可以理解为通过一定的技术手段,操作机器来得到人的模拟操作
-
目的:&意义:随着产品的完善,需要回顾验证的测试点越来越多,这个时候我们可以通过自动化测试的技术的手段,把需要回归的测试点中,可以使用自动化测试实现的部分实现,那么这样,我们需要回归测试的点就会减少,已实现的部分可以一劳永逸。
-
分类:
-
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 <module> 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
-
三.selenium中类的使用
-
Select:针对下拉框的属性选择操作
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <center> 喜欢的编程语言: <select id="nr"> <option value="" selected>请选择您喜欢的编程语言</option> <option value="Python">Python语言</option> <option value="Go">Go语言</option> <option value="Java">Java语言</option> </select> </center> </body> </html>
-
索引方法
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()#退出测试
-
-
Alert类:针对弹出框的操作处理
-
方法:
- text:获取弹出框的文本信息
- accept是接受Confirm弹出框
- dismiss是拒绝接受Confirm弹出框
- send_keys是在Prompt消息对话框里面输入想要输入的内容
-
警告框
from selenium import webdriver #导入selenium库的webdriver包 from selenium.webdriver.common.by import By #导入By模块 from selenium.webdriver.common.action_chains import ActionChains #导入ActionChains模块 import time as t #导入time库 driver=webdriver.Chrome() #打开测试的浏览器并定义 driver.maximize_window() #浏览器最大化 driver.get('http://www.baidu.com') #打开需要测试的网址 driver.implicitly_wait(30) #添加时间限制,如果30秒没有打开被测试网站,就会报错 locator=driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')#获取到百度设置的元素属性 action=ActionChains(driver=driver) #针对ActionChains类的实例化 action.move_to_element(locator).perform() #将鼠标移动到定位到元素的位置并执行 t.sleep(5) #停留5秒 driver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[1]').click()#点击搜索设置 t.sleep(5) #停留5秒 driver.find_element_by_xpath('//*[@id="se-setting-7"]/a[2]').click()#点击保存设置 t.sleep(5) #停留5秒 print('警告框的文本信息为:',driver.switch_to.alert.text)#获取到弹出框的文本信息并输出 driver.quit()#退出
输出结果:
警告框的文本信息为: 已经记录下您的使用偏好
-
确认框
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript"> function disp_confirm() { var r=confirm("请您点击按钮!") if(r==true) { document.write("您点击了确认按钮") } else { document.write("您点击了取消按钮") } } </script> </head> <body> <center> <input type="button" onclick="disp_confirm()" value="请点击"> </center> </body> </html>
测试代码如下:
from selenium import webdriver #导入selenium库的webdriver包 from selenium.webdriver.common.by import By #导入By模块 from selenium.webdriver.common.action_chains import ActionChains #导入ActionChains模块 import time as t #导入time库 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/%E6%B6%88%E6%81%AF%E4%BA%A4%E4%BA%92%E6%A1%86/%E4%BA%A4%E4%BA%92%E6%A1%86.html') #打开需要测试的页面 t.sleep(3)#停留3秒 driver.find_element_by_xpath('/html/body/center/input').click()#定位到元素并点击 t.sleep(3)#停留3秒 driver.switch_to.alert.accept()#选择确认 t.sleep(3)#停留3秒 driver.refresh()#点击确定 driver.find_element_by_xpath('/html/body/center/input').click()#定位到按钮元素并点击 t.sleep(3)#停留3秒 driver.switch_to.alert.dismiss()#选择取消 t.sleep(3)#停留3秒 driver.quit()#退出
-
消息对话框
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript"> function disp_prompt() { var name=prompt("请输入您的姓名:","") if(name!=null && name!="") { document.write("Hello "+name+"!") } } </script> </head> <body> <center> <input type="button" onclick="disp_prompt()" value="请点击我!"> </center> </body> </html>
测试代码如下:
from selenium import webdriver #导入selenium库的webdriver包 from selenium.webdriver.common.by import By #导入By模块 from selenium.webdriver.common.action_chains import ActionChains #导入ActionChains模块 import time as t #导入time库 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/%E6%B6%88%E6%81%AF%E5%AF%B9%E8%AF%9D%E6%A1%86/%E6%B6%88%E6%81%AF%E5%AF%B9%E8%AF%9D%E6%A1%86.html') #进入需要测试的页面 t.sleep(2)#停留2秒 driver.find_element_by_xpath('/html/body/center/input').click()#定位到元素并点击 t.sleep(2)#停留2秒 driver.switch_to.alert.send_keys("特昂糖")#定位到输入框并输入内容 t.sleep(3)#停留3秒 driver.switch_to.alert.accept()#点击确认按钮 t.sleep(3)#停留3秒 driver.quit()#退出测试
-
-
ActionChains类:针对鼠标事件的操作
-
悬浮:move_to_element
from selenium import webdriver #导入selenium库的webdriver包 from selenium.webdriver.common.by import By #导入By模块 from selenium.webdriver.common.action_chains import ActionChains #导入ActionChains模块 import time as t #导入time库 driver=webdriver.Chrome() #打开测试的浏览器并定义 driver.maximize_window() #浏览器最大化 driver.get('http://www.baidu.com') #打开需要测试的网址 driver.implicitly_wait(30) #添加时间限制,如果30秒没有打开被测试网站,就会报错 locator=driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')#获取到百度设置的元素属性 action=ActionChains(driver=driver) #针对ActionChains类的实例化 action.move_to_element(locator).perform() #将鼠标移动到定位到元素的位置并执行 t.sleep(5) #停留5秒 driver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[1]').click()#点击搜索设置 t.sleep(5) #停留5秒 driver.find_element_by_xpath('//*[@id="se-setting-7"]/a[2]').click()#点击保存设置 t.sleep(5) #停留5秒 print('警告框的文本信息为:',driver.switch_to.alert.text)#获取到弹出框的文本信息并输出 driver.quit()#退出
输出结果:
警告框的文本信息为: 已经记录下您的使用偏好
-
右键单击:context_click
from selenium import webdriver#导入模块 from selenium.webdriver.common.action_chains import ActionChains#导入模块 import time as t#导入库 driver=webdriver.Chrome()#打开测试需要的浏览器 driver.maximize_window()#浏览器最大化 driver.get('https://pan.baidu.com/')#打开测试的页面 t.sleep(3)#停留3秒 driver.find_element_by_id('TANGRAM__PSP_4__smsSwitchWrapper').click()#点击短信快捷登录 t.sleep(3)#停留3秒 driver.find_element_by_id('TANGRAM__PSP_4__smsPhone').send_keys('XXXXXXXXXX')#输入手机号 t.sleep(3)#停留3秒 driver.find_element_by_id('TANGRAM__PSP_4__smsTimer').click()#点击发送验证码 t.sleep(20)#停留20秒 driver.find_element_by_id('TANGRAM__PSP_4__smsSubmit').click()#点击登录 t.sleep(10)#停留10秒 obj=ActionChains(driver=driver)#ActionChains类的实例化 ceshi=driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[2]/div[3]/div/div/dd[3]/div[2]/div[1]/a')#获取元素属性的对象 t.sleep(3)#停留3秒 obj.context_click(ceshi).perform()#右键单击 t.sleep(3)#停留3秒 driver.quit()#退出测试
测试页面是以百度网盘为例
-
双击:double_click
from selenium import webdriver#导入模块 from selenium.webdriver.common.action_chains import ActionChains#导入模块 import time as t#导入库 driver=webdriver.Chrome()#打开测试需要的浏览器 driver.maximize_window()#浏览器最大化 driver.get("https://www.baidu.com")#打开测试的页面 t.sleep(3)#停留3秒 obj=ActionChains(driver=driver) driver.find_element_by_id('kw').send_keys("python自动化测试")#定位到元素并输入 t.sleep(3)#停留3秒 so=driver.find_element_by_id("su")#定位到元素并定义 obj.double_click(so).perform()#双击元素 t.sleep(3)#停留3秒 driver.quit()#退出测试
-
-
WebDriverWait类:等待
在UI的自动化测试中,经常会由于网络加载慢的问题导致资源加载不出来,从而影响测试的效率,之前我们对这样的处理方案是使用了time库里面的sleep()方法来休眠几秒钟,但是这样的方式毕竟不是很好的解决方案。
在UI自动化测试中,关于等待的部分,主要汇总为如下三点,具体如下:
1、固定等待,也就是使用sleep()方法 2、隐式等待,使用到的方法是implicitly_wait的方法,可以把它理解为设置最长等待时间(隐式等待实际是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步) 3、显式等待,主要指的是程序每隔一段时间执行自定义的程序判断条件,如果判断成立,程序就会继续执行,那么如果判断失败,就会报TimeOutExpection的异常信息
-
-
WebDriverWait参数
driver: 传入WebDriver实例,即我们上例中的driver timeout: 超时时间,等待的最长时间 poll_frequency: 调用until或until_not中的方法的间隔时间,默认是0.5秒 ignored_exceptions: 忽略的异常,如果在调用until或until_not的过程中抛出这个元组中的异常,则不中断代码,继续等待,
如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException这个模块中,一共只有两种方法until与until_not
until:当某个元素出现或者条件成立则会继续执行
until_not:当某元素消失或什么条件不成立则继续执行
method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False message: 如果超时,抛出TimeoutException,将message传入异常 -
实战(以百度首页为例)
-
隐式等待实战
'''模块跟库的导入''' from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as es import time as t driver=webdriver.Chrome()#测试测浏览器 driver.maximize_window()#浏览器最大化 driver.get("http://www.baidu.com")#测试的页面 '''设置一个隐式等待时间30秒,在这个时间内页面加载完成会进行下一步,如遇网络不良情况规定时间未完成加载就会报错''' #隐式等待 driver.implicitly_wait(30) #显示等待 '''当期望的元素出现才会继续执行,时间限制10秒,没出现条件就会报错''' wait=WebDriverWait(driver=driver,timeout=10).until(method=es.element_to_be_clickable((By.ID,'kw'))) wait.send_keys("等待")#元素中输入内容 t.sleep(3)#固定等待3秒 driver.quit()#退出测试
-
指定元素的文本位置
'''模块跟库的导入''' from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as es import time as t driver=webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(30) driver.get("https://mail.sina.com.cn/") #点击登录按钮 driver.find_element_by_class_name('loginBtn').click() t.sleep(3) divText=WebDriverWait(driver=driver,timeout=10).until( es.element_to_be_clickable(( By.XPATH, '/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]'))) t.sleep(3) assert divText.text=='请输入邮箱名' driver.quit()
-
元素是否可见
'''模块跟库的导入''' from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as es import time as t driver=webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(30) driver.get("http://www.baidu.com") aboutBaidu=WebDriverWait( driver=driver, timeout=10).until( es.element_to_be_clickable(( By.LINK_TEXT,'关于百度'))) aboutBaidu.click() driver.quit()
-
-
-
keys模块:键盘事件
-
模块的导入
from selenium.webdriver.common.keys import Keys
-
方法的查看
NULL = u'\ue000' CANCEL = u'\ue001' # ^break HELP = u'\ue002' BACKSPACE = u'\ue003' BACK_SPACE = BACKSPACE #删除键 TAB = u'\ue004' #TAB键 CLEAR = u'\ue005' RETURN = u'\ue006' ENTER = u'\ue007' #回车键 SHIFT = u'\ue008' #shift键 LEFT_SHIFT = SHIFT CONTROL = u'\ue009' #Ctrl键 LEFT_CONTROL = CONTROL ALT = u'\ue00a' LEFT_ALT = ALT PAUSE = u'\ue00b' ESCAPE = u'\ue00c' SPACE = u'\ue00d' PAGE_UP = u'\ue00e' PAGE_DOWN = u'\ue00f' END = u'\ue010' HOME = u'\ue011' LEFT = u'\ue012' ARROW_LEFT = LEFT UP = u'\ue013' ARROW_UP = UP RIGHT = u'\ue014' ARROW_RIGHT = RIGHT DOWN = u'\ue015' ARROW_DOWN = DOWN INSERT = u'\ue016' DELETE = u'\ue017' SEMICOLON = u'\ue018' EQUALS = u'\ue019' NUMPAD0 = u'\ue01a' # number pad keys NUMPAD1 = u'\ue01b' NUMPAD2 = u'\ue01c' NUMPAD3 = u'\ue01d' NUMPAD4 = u'\ue01e' NUMPAD5 = u'\ue01f' NUMPAD6 = u'\ue020' NUMPAD7 = u'\ue021' NUMPAD8 = u'\ue022' NUMPAD9 = u'\ue023' MULTIPLY = u'\ue024' ADD = u'\ue025' SEPARATOR = u'\ue026' SUBTRACT = u'\ue027' DECIMAL = u'\ue028' DIVIDE = u'\ue029' F1 = u'\ue031' # function keys F2 = u'\ue032' F3 = u'\ue033' F4 = u'\ue034' F5 = u'\ue035' F6 = u'\ue036' F7 = u'\ue037' F8 = u'\ue038' F9 = u'\ue039' F10 = u'\ue03a' F11 = u'\ue03b' F12 = u'\ue03c' META = u'\ue03d' COMMAND = u'\ue03d'
使用Ctrl+鼠标左键查看模块的源代码,就可以看到键盘的使用方法
-
方法的操作
-
回车事件:send_keys(Keys.ENTER)
'''模块跟库的导入''' from selenium import webdriver from selenium.webdriver.common.keys import Keys import time as t driver=webdriver.Chrome() #打开测试需要的浏览器 driver.maximize_window() #浏览器最大化 driver.get('http://www.baidu.com') #需要测试的页面 so=driver.find_element_by_id('kw') #定位到元素并定义为so t.sleep(3) #固定等待3秒 so.send_keys('自动化测试') #输入‘自动化测试’ t.sleep(3)#固定等待3秒 so.send_keys(Keys.ENTER)#元素按回车 t.sleep(3)#固定等待3秒 driver.quit()#退出测试
以百度首页输入框为例
-
快捷键的使用
-
复制
send_keys(Keys.CONTROL,'c')
-
粘贴
send_keys(Keys.CONTROL,'v')
-
剪切
send_keys(Keys.CONTROL,'x')
-
全选
send_keys(Keys.CONTROL,'a')
- 实战(以百度首页输入框为例)
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time as t driver=webdriver.Chrome() #打开测试需要的浏览器 driver.maximize_window() #浏览器最大化 driver.get('http://www.baidu.com') #需要测试的页面 so=driver.find_element_by_id('kw') #定位到元素并定义为so t.sleep(3)#固定等待3秒 so.send_keys("自动化测试") t.sleep(3)#固定等待3秒 so.send_keys(Keys.CONTROL,'a')#全选 t.sleep(3)#固定等待3秒 so.send_keys(Keys.CONTROL,'c')#复制 so.send_keys(Keys.BACKSPACE)#删除 t.sleep(3)#固定等待3秒 so.send_keys("接口测试")#输入内容 t.sleep(3)#固定等待3秒 so.send_keys(Keys.CONTROL,'v')#粘贴 t.sleep(3)#固定等待3秒 so.send_keys(Keys.ENTER)#回车 t.sleep(3)#固定等待3秒 driver.quit()#退出测试
-
-
-
-
JavaScript
-
浏览器的滑动
浏览器的滑动主要分为浏览器的向上和向下,比如我们就以百度搜索引擎为案例,我们进行关键字的搜索后,想点几下一步操作,但是下一步无法展示出来,就需要把页面滑动到底部才可以展示出来
测试代码如下:
from selenium import webdriver import time as t driver=webdriver.Chrome()#定义测试需要的浏览器 driver.maximize_window()#浏览器最大化 driver.get('http://www.baidu.com')#测试需要的页面 driver.implicitly_wait(30)#隐式等待30秒 t.sleep(3)#固定等待3秒 driver.find_element_by_id('kw').send_keys("测试开发")#定位到元素并输入 driver.find_element_by_id('su').click()#定位到元素并点击 t.sleep(3)#固定等待3秒 down='var q=document.documentElement.scrollTop=10000' #定义JavaScript driver.execute_script(down) #执行JavaScript t.sleep(3)#固定等待3秒 driver.find_element_by_xpath('//*[@id="page"]/div/a[10]').click()#点击下一页 t.sleep(3)#固定等待3秒 driver.execute_script(down)#执行JavaScript t.sleep(3)#固定等待3秒 up='var q=document.documentElement.scrollTop=0'#定义JavaScript t.sleep(3)#固定等待3秒 driver.execute_script(up)#执行JavaScript driver.quit()#退出测试
-
富文本的处理
现在互联网的产品基本都会使用到富文本的信息,针对富文本的特性,其实我们有两个思路来实现元素的定位方式,一种是iframe的思路,另外一种是JS的方式。
查看源代码:
iframe测代码如下:
from selenium import webdriver#模块的导入 import time as t#导入库 driver=webdriver.Chrome()#定义测试的浏览器 driver.maximize_window()#浏览器最大化 driver.get('https://uutool.cn/ueditor/')#测试的页面 driver.implicitly_wait(20)#隐式等待20秒 t.sleep(3)#固定等待3秒 driver.switch_to.frame('ueditor_0')#进入到iframe框架 t.sleep(3)#固定等待3秒 driver.find_element_by_xpath('/html/body/p').send_keys('测试开发工程师')#定位元素并输入内容 t.sleep(3)#固定等待3秒 driver.quit()#退出测试
Js测试代码如下:
from selenium import webdriver#模块的导入 import time as t#导入库 def richText(driver,content): ''' 实现在富文本里面输入内容:param driver:webdriver实例化后的对象信息:param content:富文本里面需要输入的文字内容:return: ''' js="document.getElementById('ueditor_0').contentWindow.document.body.innerHTML='{0}'".format(content) driver.execute_script(js) driver=webdriver.Chrome()#定义测试的浏览器 driver.maximize_window()#浏览器最大化 driver.get('https://uutool.cn/ueditor/')#测试的页面 driver.implicitly_wait(20)#隐式等待 t.sleep(3)#固定等待3秒 richText(driver=driver,content="我使用了Js来进行处理") #函数的调用 t.sleep(3)#固定等待3秒 driver.quit()#退出测试
-
时间控件的处理
在如上的代码中可以很清晰的看到它是只读属性,那么我们需要填写时间的属性,具体解决问题的步骤为: 1.取消时间控件的只读属性 2.取消只读属性后,操作input控件的value,其实我们知道input里面输入的内容最终是在value的属性里面。
测试代码如下:
from selenium import webdriver#模块的导入 import time as t#库的导入 def startTime(driver,content): '''开始时间控件''' js="$(\"input[placeholder='开始时间≥当前时间']\").removeAttr('readonly');" \ "$(\"input[placeholder='开始时间≥当前时间']\").attr('value','{0}')".format(content) driver.execute_script(js) def endTime(driver,content): '''结束时间控件''' js="$(\"input[placeholder='结束时间>开始时间']\").removeAttr('readonly');" \ "$(\"input[placeholder='结束时间>开始时间']\").attr('value','{0}')".format(content) driver.execute_script(js) driver=webdriver.Chrome()#定义需要测试的浏览器 driver.maximize_window()#浏览器最大化 driver.get('file:///F:/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/Time/index.html')#测试的页面 driver.implicitly_wait(20)#隐式等待 t.sleep(3)#固定等待3秒 startTime(driver,"2021-12-05 00:00:00")#调用开始时间控件 t.sleep(3)#固定等待3秒 endTime(driver,"2021-12-06 00:00:00")#调用结束时间控件 t.sleep(3)#固定等待3秒 driver.quit()#退出测试
-