1、如果页面元素经常发生需求变化,你是如何做?
利用po模式,业务逻辑和测试逻辑相分离,当某个页面经常发生变化只需要维护页面,包括元素定位表达式,封装业务方法;不需要修改测试逻辑;
页面经常变化正是自动化测试的痛点,我们改不了需求,目前利用po模式是最有效的解决方法。
2、在你做自动化过程中,遇到了什么问题吗?举例下
a、页面经常变化,需要修改脚本b、脚本不稳定,经常性的跑失败c、提升效率,会影响稳定性
3、如何处理alert弹窗
先切换到弹窗:alert=driver.switch_to.alert
确认:alert.accept()
取消:alert.dismiss()
获取弹窗中文本:alert.getText()
弹窗中输入内容:alert.sendkeys()
4、在selenium中如何处理多窗口?
以百度浏览器测试:
a、获得百度浏览器的搜索页面窗口
search_window=driver.current_window_handle
b、点击“hao123”标签,跳转到hao123页面
driver.find_element_by_xpath('//a[text()="hao123"]').click()
time.sleep(2)
c、获取所有的窗口句柄
all_handles=driver.window_handles
d、切换到hao123页面
for handle in all_handles:
if handle!=search_window:
driver.switch_to.window(handle)
driver.find_element_by_xpath('//a[text()="网易"]').click()
e、如果再次切换到搜索页面
driver.switch_to.window(search_window)
5、你查找元素遇到过在Frame里面吗?你是如何处理Frame里面元素定位的?
切换到frame中
def switch_frame(frame_el):
driver.switch_to.frame(frame_el)
el=driver.find_element_by_xpath('//input[@id="kw"]')
el.input('kobe')
frame_el=driver.find_element_by_xpath('//iframe[@name="baidu"]')
switch_frame(frame_el)
回到主页中
driver.switch_to.default_content()
6、如何处理下拉菜单?
a、通过text文本查找
def select(el):
s=Select(el) #初始化Select对象
s.select_by_visible_text('kobe')
el=driver.find_element_by_xpath('//select[@id="faver"]')
b、通过value值查找
def select(el):
s=Select(el)
s.select_by_value('double')
el=driver.find_element_by_xpath('//select[@id="faver"]')
7、关闭浏览器中quit和close的区别?
driver.quit():关闭整个浏览器
driver.close():关闭当前页
quit一般用在结束测试之前的操作,close用在执行用例过程中关闭某一个页面的操作
8、如何实现文件上传(待补充)
第一种方法:send_keys
a、找到上传文件的入口
b、获取入口的元素的表达式(file_el)
c、上传文件file_el.send_keys(r'c:\666.doc')
第二种方法:pywinauto
def upload_file(self):
# 点击上传文件按钮
self.browser.find_element_by_xpath('//span[contains(text(),"点击上传")]').click()
# 使用pywinauto来选择文件
app = pywinauto.Desktop()
# 选择文件上传的窗口
dlg = app['打开']
# 选择文件地址输入框,点击
dlg['Toolbar3'].click()
# 键盘输入上传文件的路径
send_keys(r'C:\Users\Lenovo')
# 键盘输入回车键,打开该路径
send_keys('{VK_RETURN}')
# 选中文件名输入框,输入文件名
dlg['文件名(&N):Edit'].type_keys('1.jpg')
# 点击打开
time.sleep(2)
#dlg['打开(&O)'].click()
dlg['打开(&O)'].double_click()
time.sleep(2)
return self
9、如何实现鼠标悬停,键盘事件和拖拽动作?
a、鼠标悬停
1、初始化一个action_chains对象
action=ActionChains(driver)
2、找到要悬浮的元素,
setting_el=driver.find_element_by_xpath(‘//span[@id=“s-usersetting-top”]’) -----> 设置
3、调用鼠标操作的函数,传入move_to_element()函数中
action.move_to_element(setting_el)
4、要让动作生效的话,必须加上perform
action.move_to_element(setting_el).perform()
5、再定位到高级设置标签
top_setting_el=driver.find_element_by_xpath(‘//a[text()=“高级搜索”]’)
top_setting_el.click()
b、拖拽动作
def drag_and_drop(el1,el2)
action=ActionChains(driver)
action.drag_and_drop(el1,el2)
action.proform()
drag_and_drop(el1,el2)
c、双击
def double_click(el)
action=ActionChains(driver)
action.double_click(el)
action.perform()
double_click(el)
10、在selenium自动化测试中,你一般完成什么类型的测试?
项目稳定
回归测试
监控
11、自动化测试有误报过bug吗?产生误报怎么办?(*)
有误报过,有时候自动化测试报告中显示发现了bug,实际去通过手工测试去确认又不存在该bug。
误报原因一般是:
a、元素定位不稳定(没有进行等待或者等待时间设置的太短;元素是动态变化的,需要优化元素表达式),
b、需要尽量提高脚本的稳定性(使用独立的测试环境,用例与用例之间要相互独立,尽量不要耦合性太强);
c、开发更新了页面但是测试没有及时更新维护!
d、网络问题(页面加载太慢)
12、web自动化测试过程中,你遇到了哪些问题,是如何解决的(*)(最新)
1、登录使用验证码的问题:
- 解决方式:开发关闭严重码、万能验证码、设置白名单
2、文件上传:由2种方式
-
input类型:
file_el=driver.find_element_by_name('user') file_el.send_keys(r'c:\666.doc')
-
非input类型:需要第三方库:pywinauto
- app=pywinauto.Desktop():选择文件
3、有些元素操作不方便,通过执行javaScript脚本更方便
-
例如修改时间控件
- 代码中实现修改文本框默认值操作:
driver.execute_script(‘document.querySelector(“#train_date”).value=“2024-01-01”’)
- 代码中实现修改文本框默认值操作:
-
js脚本滚动操作
- driver.execute_script(‘document.querySelector(“.c-title.t.t.tts-title”).scrollIntoView()’)
4、一个元素明明定位到了,点击无效(也没报错)
- 异步加载js导致点击事件无效 ,Selenium 有时候点击元素是会失效,使用js点击
解决方案:自己封装一个显性等待,循环点击,直到可以操作下一个步骤;如果在指定的次数下还是没有反义,提bug
5、定位动态元素
- 检查每次使用的这个元素的id是否一致,确定是否是否是动态元素;
如果是动态元素,使用其他的定位方式,xpath或者css的相对定位
6、整个业务流程涉及关联的
-
例如删除名字前面的复选框,名字是自己入参传的数据,当这条数据新增完成后,此时断言成功了,但是我要删除这条数据,一般这条数据前面是复选框,选中点击删除
- 所以要将入参参数作为联系,以文本的定位方式找到复选框的元素定位表达式进行删除。
7、cookie复用
- 前端修改了路由,需要批量查看路由是否正确,那就用到cookie复用了,如果不用cookie复用,那么就需要每个url去登录操作。
8、需求经常变动,脚本需要不断的修改
- po模式的使用,用于回归测试
13、如何提高selenium脚本的执行速度(最新)
-
尽量使用
by_css_selector()
方法;by_css_selector()
方法的执行速度比by_id()
方法的更快,因为源码中by_id()
方法会被自动转成by_css_selector()
方法处理; -
使用等待时,尽量使用显示等待,少用
sleep()
,尽量不用强制等待; -
尽量减少不必要的操作:可以直接访问页面的,不要通过点击操作访问;
-
并发执行测试用例;
-
尽量使用独立的测试环境,避免其他人修改环境配置
-
使用独立的测试账号
-
用例与用例尽量不要关联,减少用例的耦合性
-
定期清理浏览器缓冲,防止浏览器卡顿
-
不要选择太复杂的测试用例,按照用户的操作,从登录系统到完成一些业务流程
14、怎么对含有验证码的功能进行自动化测试
万能码
开发关掉
白名单
15、自动化测试的使用场景(重要)?
a、需求稳定,不会频繁变更。
b、研发和测试周期长,需要频繁执行回归测试。
c、需要在多种平台上重复运行相同测试的场景。
d、某些测试项目,通过手工测试无法实现,或者手工成本太高。
e、被测软件的开发较为规范,能够保证系统的可测试行
f、线上监控
16、请描述一下web自动化测试流程(重要)(最新)
不管是手工测试、还是自动化测试,工作的实际内容都源自需求
对于自动化工作来讲,需求是来源于已经测试完成的手工测试用例
- 1、确定功能测试的需求范围(需要转化哪些功能测试用例)
- 2、制定自动化测试的计划(时间、人员分配、环境等等)
- 3、确定自动化测试框架、语言、环境(语言、插件、环境都是有版本统一的要求)
- 4、搭建自动化测试环境(python安装、下载依赖包、插件安装、数据库配置、文件支持格式——》需要支撑你的自动化脚本运行的环境,叫自动化测试环境)
- 5、转化功能测试用例——》编写自动化代码,分工合作,也分周期(项目刚开展,第一阶段:写项目的核心流程;第二阶段:写项目核心流程的主分支;第三阶段:…)
- 6、调试整个项目的自动化脚本(print、debug模式、日志的打印、异常处理)
- 7、测试自动化的脚本执行(一旦本地没问题了,会引用到持续集成(CICD),定时执行自动化测试脚本)
- 8、跟进自动化报告跟进项目的bug
- 9、汇总自动化的项目报告
- 10、没问题进行上线的产出
17、web和app自动化有什么不同(重要)
a、启动差别
一部手机只能同时测试一个apk包
web端,由于多进程,一台电脑可以开启多个浏览器进行测试
b、安装差别
app端:需要先检查软件是否安装才能进行测试
web端:不需要安装,在浏览器中输入url就可以测试。
c、页面元素操作
d、采用自动化测试框架不同
selenium
appium
18、http和https不同点(重要)
a、HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。
b、HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
c、HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)
19、Selenium 中如何保证操作元素的成功率?也就是说如何保证我点击的元素一 定是可以点击的?
a、脚本中加入隐形等待和显性等待
b、必要的时候使用强制等待
c、try 方式进行id,name,clas,x path, css selector不同方式进行定位,如 果第一种失败可以自动尝试第二种
d、需要在指定的frame和窗口中
20、鼠标操作常用函数(待补充)
context_click()
右击 --> 此方法模拟鼠标右键点击效果double_click()
双击 --> 此方法模拟双标双击效果drag_and_drop()
拖动 --> 此方法模拟双标拖动效果move_to_element()
悬停 --> 此方法模拟鼠标悬停效果perform()
执行 --> 此方法用来执行以上所有鼠标方法