Selenium面试题+答案
• Selenium是否支持桌面应用软件的自动化测试
Selenium不支持桌面应用软件的自动化测试,Selenium是通过操作HTML页面中的DOM树上的节点进行模拟用户行为,暂时不支持桌面应用
• Selenium是否支持用例的执行的引擎。
selenium只是一个用来操作HTML页面元素的库,并不支持用例的执行引擎,python中需要使用unittest 或pytest 等测试框架完成用例的执行的引擎。
• Seleinum是否有读取excel文件的库
selenium无读取excel文件的库,我一般使用openpyxl 库进行excel的读写操作
• Selenium有哪些组件?
Selenium的组件有Selenium Grid(用于调度),webdriver(用于生成对应的浏览器实例,进行模拟用户浏览操作),Selenium IDE(浏览器录制回放)
• Selenium有什么限制或者缺陷
Selenium只能完成浏览器或者移动端基于DOM元素的操作,无报告,用例执行引擎等功能
• 在selenium中,有哪些不同定位元素方法
id/xpath/name/link_text/className/PartialLinkText/CSS selector,测试脚本编写过程中使用最多的xpath,css这两种
• 什么是imlicitlyWait (隐式等待)
全局只需设置一次,元素或脚本执行的结果在设定的最长时间内出现则返回,未出现则在最长时间后抛出找不到元素的异常
• 什么是expliciteWait (显式等待)
一般设置两个参数,一个为最长时间,一个为间隔轮询时间,例如WebDriverWait(10,0.5).until(...),则代表每间隔0.5s查询一次元素是否出现,出现则返回,未出现则间隔0.5s后再查找一次。10s后仍未找到则抛出找不到元素异常
• 什么是线程等待(硬式等待)
time.sleep(3) 强制当前线程等待3s后再继续执行。
• 什么是pollingEvery
python 的selenium中未发现这个,可能是指WebDriverWait中的poll_frequency参数
• 你写的测试脚本能在不同浏览器上运行吗,支持跨浏览器平台吗
支持,在初始化driver的时候使用不同的Webdriver即可,我使用pytest做自动化测试时通过定义addoption方法,在pytest启动时根据传参不同,调用不同的浏览器
• 什么是POM,为什么要使用它
PageObjectModel,页面对象模型,将页面映射成代码中的类,页面上的元素映射成类中的属性,页面上的操作映射成类的方法,使用POM在进行测试用例编写时只需要调用在页面类中定义好的方法即可,页面发生变动只需修改维护对应页面类中的属性或方法即可,无需修改测试用例,减少因页面频繁变动而造成的大量维护成本。
• 在你做自动化过程中,遇到了什么问题吗?举例下
在做UI自动化时,数据的前置我通过接口进行生成,接口返回成功了,但是真正到页面上可查询存在一个时间差,导致case运行失败,我通过参考显示等待的方式,在页面上操作接口生成的数据无法找到时,同样使用类似轮询的机制,未找到,则刷新页面再找,直到超时时间内找到未知,再继续执行后续的case操作。
有些手工操作时单击的操作通过代码单击会报元素不可点击,使用双击解决。
UI运行受客户端环境影响较大,我使用docker selenium,保证了每次运行的浏览器实例都是新的无污染。
• 举例一下你遇到过那些异常,在selenium自动化测试
超时,元素不可点击,未找到元素,元素没有某个属性
• 如何处理alert弹窗
a =driver.switch_to.alert
a.accept()
a.dismiss()
a.text
• 在selenium中如何处理多窗口?
driver.window_handles #获取窗口列表
driver.switch_to.windows(windows_name)
• 你查找元素遇到过在Frame里面吗?你是如何处理
暂时没遇到,driver.switch_to.fram(id/name/索引)
• Frame里面元素定位的?
切换至Frame内后继续操作即可
• 怎么验证勾选框是enable/disabled/checked/Unchecked/ displayed/not displayed?
ele=driver.find_element((locator,value))
ele.is_displayed()
ele.is_enabled()
ele.is_selected()
• 如何处理下拉菜单?
我的项目中下拉框是div+li组成的下拉框,无法使用selenium中的select类提供的方法,我通过点击下拉框,唤出菜单,然后使用xpath,定位文本内容进行内容选择点击操作
• 在日历这种web表单你是如何处理的?
日历表单如果可点击,可以使用点击操作,如果不可点击可使用driver.execute(js代码),进行赋值操作(据反馈目前一些日历表单可能需要键盘操作配合才可以)
• 关闭浏览器中quit和close的区别
close只是关闭窗口,session连接并没有关闭,浏览器进程仍然处于运行状态,quit是断开session连接,浏览器进程关闭
• 在Selenium中如何实现截图,如何实现用例执行失败才截图
driver.get_screenshot_as_png()
在用例执行时进行try expect 异常捕获,expect时截图
• 在Selenium中如何实现拖拽滚动条?
使用js进行拖拽,滚动至顶部:driver.execute("windows.scrollTo(0,0)")
• 如何实现文件上传?
文件上传若是input类型的可尝试使用send_keys() 方法(据反馈VUE组件中input类型为file的以无法使用send_keys方法)
其它类型需使用借助第三方实现.
• 如何处理“不受信任的证书”的问题?
# Firfox
profile = webdriver.FirefoxProfile()
profile.accept_untrusted_certs = True
driver = webdriver.Firefox(firefox_profile=profile)
# Chrome
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
driver = webdriver.Chrome(chrome_options=options)
# IE
capabilities = webdriver.DesiredCapabilities().INTERNETEXPLORER
capabilities['acceptSslCerts'] = True
driver = webdriver.Ie(capabilities=capabilities)
• 如何实现鼠标悬停,键盘事件和拖拽动作?
使用ActionChains类的方法
click(on_element=None) ——单击鼠标左键
click_and_hold(on_element=None) ——点击鼠标左键,不松开
context_click(on_element=None) ——点击鼠标右键
double_click(on_element=None) ——双击鼠标左键
drag_and_drop(source, target) ——拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
key_down(value, element=None) ——按下某个键盘上的键
key_up(value, element=None) ——松开某个键
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
move_to_element(to_element) ——鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
perform() ——执行链中的所有动作
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素
使用Keys类实现键盘事件:
ele.send_keys(Keys.CONTROL,'x') #实现"CTRL + X"
• 如何获取页面标题,悬浮文本和错误文本,并验证?
assert driver.title == 'xx标题'
悬浮文本和错误文本可以使用ActionChains().move_to_element() 然后ele.text
• 在selenium自动化测试中,你-般完成什么类型的测试?
回归测试
• 你是如何管理你的测试用例并执行?
测试用例按照业务模块划分成以test开头的py文件,pytest测试框架可识别以test开头或结尾的测试类或方法或文件,运行在根目录执行pytest 即可,当需要指定较多的参数或需要其他操作时定义run入口文件,直接运行run文件即可
• 关于自动化测试报告生成?
使用的是pytest-html库生成html报告及allure
• 你如何用Selenium测试?
将基础通用操作封装成base类,然后页面对象模型继承Base类。
• 如何解决问题?
针对UI自动化中遇到的问题,先查看报错信息,定位是自己封装问题则修改封装,非自己代码问题则先看实现相关功能模块依赖库的官方说明文档,官方文档中未解决问题,若是开源库则对应github参考查看issue栏目,最后再百度或谷歌
• 你是怎么开发测试框架的?
• 做自动化测试的目的?
接口自动化测试可尽快介入项目测试,在联调前发现编码中的问题,在版本更新发布后即进行接口自动化可对既有功能进行验证,保证此次新功能或bug修复对原有功能无影响。UI自动化可减少手工操作,进行兼容性测试。加快版本更新发布进度
• 如何判断case是否通过?
接口的case 根据规定的响应状态码 + 接口响应的值 + db 中对应的数据变化进行判断
UI的case 根据业务场景进行后页面上的变动及相关特定提示语 ,也同样可根据db中的数据状态进行判断
• 你项目中有多少case,通过率怎么样?
UI的case 单次运行目前通过率大约在95% 以上,通过加入失败重试机制后大约98%-99%左右
• 失败截图的原理是什么?
我在框架中使用driver.get_screenshot_as_png() 方法在Base类中使用try expect在expect时即调用截图方法
• 报告哪里来,主要统计什么?
使用第三方库实现,统计用例成功失败,跳过,条数,运行时间、环境等
• 写出selenium中你最熟悉的接口或者类
WebDriverWait:显示等待的类
webdrier.Chrome:实例化Chrome driver实例
• Xpath是什么?
一门查找XML文档中信息的语言
• findElement()和findElements()方法有什么区别
前者返回一个WebElement对象,后者返回一个由WebElement 组成的list
• 登录按钮除了click方法还有其他方式吗?
driver.submit()
• 怎么对含有验证码的功能进行自动化测试
简单验证码使用PIL库进行解决,过于复杂,识别难度过高与开发沟通使用通用验证码,或者使用第三方服务提供的图片识别服务
• 举一个WebDriver中方 法重载的例子
webdriver.Chrome() 的__init__方法即重载了RemoteWebDriver的__init__方法
• 你如何模拟浏览器的前后移动?
driver.forward()
driver.back()
• 你如何获得当前页面的URL?
driver.current_url
• 如何从文本框中获取打字文本?
ele.text
• 你如何清除中文本框的内容?
ele.clear()
原文地址:http://www.grassroadsz.top/article/selenium_know/
--------------------------------------------------------------------------------
关注微信公众号(测试工程师小站)即可在手机上查阅,并可接收更多测试分享,发送【测试资料】更可获取百G测试教程~