88
11.6 自动化测试用例的来源
手工编写测试用例
把原来手工的测试用例,当成自动化测试用例
11.7 自动化测试的优点与缺点
优点:
1、对程序的回归测试更方便
2、可以运行更多更繁琐的测试
3、提高测试效率和准确性,节约时间成本
4、可以执行一些手工测试困难或不可能进行的测试(例如,对于大量用户的测试,可以通过自动化测
试模拟同时有许多用户,从而达到测试的目的)
5、自动化测试不存在执行过程中的疏忽和错误,从而增加软件信任度
缺点:
1、不能取代手工测试
2、手工测试比自动测试发现的缺陷更多
3、对测试质量的依赖性极大
4、由于自动测试比手动测试更胞弱,所以维护会受到制,从而会制约软件的开发
5、工具本身无想像力
11.8 你们自动化覆盖率有多少?
2 年以内,把原来手工做的事情 30%用自动化脚本去替代
2 年以上,实现 40-70%
当时覆盖的确实也不是很多,差不多 30-40%的样式吧
11.9 自动化测试环境的搭建是怎样的?
1、首先要安装 Python
2、然后安装编写代码工具 pycharm
3、导入 selenium 库(pip install seleniun 在 pycharm 安装 selenium3 下载源码包
4、下载浏览器驱动(谷歌.火狐等),把驱动程序发到 Python 根目录下
11.10 seleniun 的原理是什么?
我们用的 selenium3x 以上的版本,对于 selenium2x 以上的版本原理是这样的:
Selenium2.0 则是把 selenium1.0 中 selenium RC 替换为了 WebDriver
WebDriver 利用浏览器原生的 API,封装成一套更加面向对象的 SeleniumWeb Driver API
89
直接操作浏览器页面里的元素,甚至操作浏器本身(截屏,回口大小,启动,关闭,安装插件,配置
证书之类的),由于使用的是浏览器原生的 API 速度大大提高,而且调用的稳定性交给了浏览器厂商
本身,显然是更加科学,然而带来的一些副作用就是,不同的浏器厂商,对 Web 元素的操作和呈现多
少会有一些差异,这就直接导致了 SeleniumWebDriver 要分浏览器厂商不同,而提供不同的实现,例
如 Firefox 就有专门的 FirefoxDriver,
Chrome 就有专门的 ChromeDriver 等等
11.11 Selenium2 与 Selenium1 的区别是什么?
Selenium1.0 使用的是 Javascript 注入技术与浏览器打交道,需要 Selenium 启动一个 Server,将
操作 Web 元素的 AP 调用转化为一段段 Javascript,在 Selenium 内核启动浏览器之后注入这段
Javascript,开发过 Web 应用的人都知道, Javascript 可以获取并调用页面的任何元素,自如的进
行操作,由此才实现了 Selenium 的目的:自动化 Web 操作,这种 Javascript 注入技术的缺点是速度
不理想,而且稳定性大大依赖于 Selenium 内核,对 API 翻译成的 Javascript 质量高低
Selenium2.0 则是把 selenium1.0 中 selenium RC 替换为了 Web Driver
WebDriver 利用浏览器原生的 API,封装成一套更加面向对象的 SeleniumWebDriverAPI
直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装播件,配
置证书之类的),由于使用的是浏览器原生的 AP,速度大大提高,而且调用的稳定性交给了浏览器厂
商本身,显然是更加科学,然而带来的一些副作用就是,不同的浏览器厂商,对 Web 元素的操作和呈
现多少会有一些差异,这就直接导致了 SeleniumWebDriver 要分浏览器厂商不同,而提供不同的实现
例 Firefox 就有专门的 Firefox Driver,
Chrome 就有专门的 ChromeDriver 等等
11.12 seleniun 库中用过哪些函数?
driver = Web Driver ChromeO
driver.quit() #退出浏览器
driver.closed() #关闭窗口
driver.implicitly_wait() #设置隐性等待延迟
driver.current_url #获取当前的 URL
driver.page_source #获取当前页面的源代码
driver.title #获取当前页面的标题
driver.maximize_window() #窗口最大化
driver.get() #加载一个网页
元素定位的:
90
driver.find_element_by_id()
driver.find_element(By.xxx,’’)
frame 跳转的:
driver.switch_to.frame()
driver.switch_to.parents_frame()
driver.switch_to.default_content()
窗口跳转:
driver.switch_to.window()
对话框的处理:
Driver_switch_to.alert
.accepto
.dismiss
.text
.send_keys()
执行 js 脚本的:
driver.execute_script(js)
Element 类:
element.click()
element.submit()
element.send_keys()
element.clear()
element.text
element.get_attribute()
element.is_displayed()
element.find_element_by_xpath()
11.13 定位元素的 8 个方法是什么?
1、通过 id 定位
find_element_by_id()
2、通过 name 定位
find_element_by_name()
3、通过 class name 定位
91
find_element_by_class_name()
4、通过 css 定位
find_element_by_css_selector()
5、通过 link 定位
find_element_by_link_text(‘文本’)没有空格一般 a 链接
6、通过 partial_link 定位
find_element_by_partial_link_text(部分文本)--般有空格 a 链接
7、通过 xpath 定位
find_element_by_xpath()
8、通过 tag_name 定位
find_element_by_tag_name()
11.14 js 定位的 5 个方法
js 用到 css 定位
1. driver.execute_script("document.getElenmentByld().value='';")
2. driver.execute_script("document.getElenmentByName().value='';")
3. driver.execute_script("document.getElenmentsByClassName()[0].value='';")
4. driver.execute_script("document.getElenmentsByTagName()[0].value='';")
11.15 jQuery 定位的方法
1. driver.execute_script("$(#id 定位值)vaC")")-输入值 a()处也可以用 cick()表示点击
2. driver.execute_script("$(name=name 定位值 va(")输入值
3. driver.execute_script("$(cas 定位值)va()")输入值
4. driver.execute_script("$((class=]").val().)
5. driver. execute script ("SCIvalue= ]").val()")
11.16 css 定位的方法?
#通过样式 #id 样式, .cass 样式为多
1. find_element_by_css_selector("#id")
2. find_element_by_css_selector(".classname 定位值")
#通过元素属性
3. find_element_by_css_selector("[name=name 定位值]")
Find_element_by_css_selector("[class=定位值]")
92
#样式,属性结合
find
_element_by_css_selector(div#fanwe_msg_box>table>tbody>tr>td:nth-child(2)>div(@class='d
ialog-content'))
5.父子元素定位
Find_element_by_css_selector(div#fanwe msg box> table>tbody>tr> td:nth-child(2)
>div:nth-child(2))
11.17 xpath 定位的方法? xpath 怎么写?
Xpath 写法://*div[@id=’u1’]/a[7] #相对路径
Xpath 写法:/html/boy/div[1l/div/div/divl3/a[7 #绝对路径
#先找父元素,结合属性
Find_element_by_xpath(//div(@id=u1"/a[@name=tj_login])
11.18 如何去定位下拉框
1、首先要导入一个包: from selenium.webdriver.support.select import Select
2、先给下拉框元素定位定义一个变量:a= diver.find_element_by_css_selector()
3、再通过根据下拉框的 value\visible_text\index 去选择值
Select(a).select_by_value('')--根据下拉框的 vaue 值去选取值
Select(a).select_by_visible_text('')--根据下拉框的内容去选值
Select(a).select_by_index('')--根据下拉框的下标去选。从 0 开始
11.19 如何去定位内嵌界面
1、定位元素的时候看到 fame 的需要进入内嵌
2、如果有内嵌有 id 或 name 值时直接进入内嵌 driver.switch_to.frame(id 值或 name 值)
3、如果内嵌没有 id 或 name 值,先定义一个内嵌再进入:
a=driver.find_element_by_class_name(‘’)
driver.switch_to.frame(a)
4、如果有多层内嵌,要一层一层进入
5、记得退出内嵌: driver.switch_to_default_content()
6、driver.switch_to.parent_frame()---进入父级内嵌,调至上一级内嵌
11.20 如何在不同的网页之间切换
1.首先要获取多个界面的句柄
93
先通过定位元素几个界面: driver.find_element_by_id().click 或者其他,获取一个界面打印一个:
print (diver.window_handles)
然后获取几个界面的句柄,定义成一个变量:window_list= diver.window_handles()---以列表形式
存在
2.通过界面句柄的下标进入不同的界面: driver.switch_to_window(window_list[O])
通过界面句柄的下标进入不同的界面,0 表示第一个,下标-1 代表最新的界面
注意:如果进入一个界面里面是内嵌,记得退出内嵌再进入另一个界面
11.21 如何去定位滚动条?滚动条怎么处理?
一般当我们西面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接操作的,会报元素不可见
异常的。这时候需要借助滚动条来拖动屏幕,使被操作的元素显示在当前的屏幕上,selenium 提供
了一个操作 js 的方法: execute.script(),可以直接执行 js 的脚本,
滚动到底部:
Js='var q=document.getElementByld('id')scrollTop=10000'
Driver.execute_script(js)
滚动到顶部:
js='var q=document.documentElementscrollTop=0'
driver.execute_script(js)
#把滚动条拉到指定位置
虽然用上面的方法可以解决拖动滚动条的位置问题,但是有时候无法确定我需要操作的元素在什么位
置,有可能每次打开的页面不一样,元素所在的位置也不一样,这个时候我们可以先让页面直接跳到
元素出现的位置,然后就可以操作了。
Target_element = driver.find_element_by_xpath(‘//*[@id="4"]/h3/a’)
Driver.execute_script("arguments[O].scrollIntoView();",target_element)
11.22 如何去模拟键盘与鼠标的操作?
模拟键盘:
1、要导入一个包 rom selenium. wedriver common keys import Keys
2、快捷键输入,通过 send_keys()方法可以来模拟键盘输入操作。
Send_keys(Keys.CONTROL,'a’) 全选(Ctrl+A)
Send_keys(Keys.CONTROL,'C') 复制(Ctrl+C)
Send_keys(Keys.CONTROL,’X’) 剪切(Ct+X)
Sen_ keys(Keys.CONTROL,’V’) 粘贴(Ctr+V)
94
Send_keys(Keys.ENTER) 回车键
Send_keys(Keys.BACK_SPACE) 删除键
Send_keys(Keys.SPACE) 空格键
Send_keys(Keys.TAB) 制表键
Send_keys(Keys.ESCAPE) 回退键
模拟鼠标:
语法: ActionChains(diver).鼠标操作动作操作的元素. Perform()
鼠标操作动作有:click()单击、 context_click()右击、 double_click()双击、
Move_to_element()鼠标悬停
1.先导入一个鼠标的包:from selenium.webdriver.common.action_chains import Action Chains
2.然后定位元素: driver.find_element_by_xpath()可以定义为一个变量 aa
3.然后通过语法执行:Action Chains(driver).move_to_element(aa).perform()
11.23、如何去处理上传 Windows 文件?
1.可直接赋值 send_keys 输入图片的地址
其实上传文件的按钮就是一个 input 元素,只是它的 type 类型是 file 类型,
我们在处理这种上传文件的按钮的时候,可以直接通过普通定位方式去定位它,
再利用 send_keys 方法去输入图片的地址就可以了。
Load_file_element=driver.find_element_by_xpath(‘/html/body/div(8l/div(1)/div(2/div/div
[3]/form/div/div/div/inpu’)
2.需要用到一个工具,Autolt 工具
帮助我们识 Windows 控件信息利用 Autolt 生成一个操作 Windows 对话框的 exe 执行文件
然后在 python 代码中去调用这个可执行文件
这里需要用到 os 模块,利用 os.system 去执行 windows 的 exe 文件,
把 exe 文件的路径传入,并传入需要上传的图片的路径即可
Drver.fnd_ement_by_xpath(‘html/body/divoiv1/dw2]/div/div3form/dvd/di)cick()#点击浏览
time.sleep(1)
ossystem(C:\Users\\Administrator\\ Desktop\\AA.exe D:\\QQ.png)
11.24 如何去定位时间控件
1、首先 js 去定位元素,去除元素中的属性:js="$(‘’).removeAttr(要删除的属性)
2、然后执行 js 脚本: driver.execute.script(js)
3、然后输入时间日期
95
driver.find_element_by_xpath(//[@id=start time]").send keys("2018-12-29 10:55:55)#输入日
期
11.25 弹出框的操作?
弹出框一般有三种:警告消息框,确认对话框,提示消息框
在 selenium 中提供了一个方法 switch_to.alert,跳转到对话框上面去对 alert 对话框进行操作的函
数/法
Accept() #点击确定按钮
Dismiss() #点击取消按钮
Text #获取对话框上的文本信息
Send_keys() #输入内容
11.26 等待时间有哪三种,区别是什么?
1、sleep 强制等待,要导入 from time import sleep,必须等待那么多秒定位才执行
2、driver.implicitly_wait 隐式等待多秒内只要找到元素就开始执行,超多设定时间就超时
3、Web DriverWaite(driver,20.1).until(lambdax.x.find_element_by_name()).send_keys()-首先
需要导入一个包:fom selenium.webdriver.support.wait import WebDriverWait, driver 1s 钟找一
次元素,最多找 20 秒,一直发送请求,直到找到元素位置以后,进行下一步操作。
11.27 有没有修改过页面元素的属性,具体怎么修改?
有的,有时候我们会碰到一些元素不可见,这个时候 selenium 就无法对这些元素进行操作了。例如,
下面的情况:页面主要通过“display.none”来控制整个下拉框不可见。这个时候如果直接操作这个
下拉框,就会提示:我们需要通过 javaScript 修改 display 的值
具体修改方式如下:
js='document.queryselectorAll(‘select’)[1].style.display="block";’
driver.execute_script(js)
11.28 定位不到元素,你碰到过哪些?怎么解决的?
1、像页面加载延迟的问题,这个需要通过等待延迟的方式来处理。
2、不过有时候,页面加载完成,但是元素暂时还不可见,导致定位不成功
这个可以选择使用显示等待来处理,这里需要用到 WebDriverWait 类来实现
3、还有就是像内嵌网页的问题,需要使用 driver.switch_to.frame(name/index)这个函数来跳转到
处理。
4、还有要注意多窗口问题,动态 id 问题等的问题,对于多窗口处理,可以使用
96
driver.switch_to.window()的方式来进行处理,而对于动态 id 的问题,需要注意的是有些 id 跟数
字有关,可能会动态变化,可以使用 xpath 也可以使用 css_select 属性定位或者样
式定位,或者可以通过父元素来找元素,或者通过兄弟节点来找对应的元素。等等
5、还有要特别注意滚动条的问题,这里通过调用 js 代码来实现的,driver.execute_script(js)
6、再这就是有时候会碰到某些元素的是不可见的,比如 display 属性为 none 这就需要通过 java
Script 修改 display 的值。
js ='document. querySelectorAll("select")[1]. style. display="block";
driver.execute_script(js)
11.29 元素定位,有时候定位得到,有时候定位不到,可能是什么原因,你会怎么处理?
1、可能是网络问题,导致页面加载延迟,这个可以做延迟等待,一般选择隐式等待,在脚本前面加
上 driver.implicitly_wait(20)。
2、也有可能是页面结构发生变化导致的,这个时候最好选择通过 xpath 或 css 结合属性进行或者样
式定位可能会好点,或者采用 JQuery 定位的方式来进行定位元素
11.30 对于不可见/隐藏的元素,你如何定位,如何处理?
我们可以通过 javaScript 修改 display 的值,来实现
#修改元素的属性
#我们需要通过 javaScript 修改 display 的值。
js='document.querySelectorAll('select')[1].style.display="block";’
driver.execute_script(js)
11.31 如果元素经常变动你怎么做?
1,少用绝对路径,多用 css 或者 jQuery 定位
2,单个元素属性进行封装
自动化测试相关教程推荐:
2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂!!_哔哩哔哩_bilibili
2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibili
测试开发相关教程推荐
2023全网最牛,字节测试开发大佬现场教学,从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili
postman/jmeter/fiddler测试工具类教程推荐
讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程,学jmeter接口测试一套教程就够了!!_哔哩哔哩_bilibili
2023自学fiddler抓包,请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程!!_哔哩哔哩_bilibili
2023全网封神,B站讲的最详细的Postman接口测试实战教学,小白都能学会_哔哩哔哩_bilibili
如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。
如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步
在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。
我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,
测试开发视频教程、学习笔记领取传送门!!