【selenium】UI自动化面试题
题记:
最近也想换工作了,所以整理一下该复习的笔记,也提供大家参考与学习
1、selenium的原理是什么?
selenium 的原理涉及到 3 个部分, 分别是: 1.浏览器 2.driver:一般我们都会下载driver 3.client:也就是我们写的代码
运行过程:
client 其实并不知道浏览器是怎么工作的,但是 driver 知道,在 selenium 启动以后,driver 其实充当了服务器的角色,跟 client 和浏览器通信
client 根据 webdriver 协议发送请求给 driver,driver 解析请求,并在浏览器上执行相应的操作,并把执行结果返回给 client。这就是 selenium 工作的大致原理。
2、WebDriver提供哪些常见类型的驱动程序?
WebDriver 中常见驱动程序有(这部分建议在面试前查阅一下官网,做到 实时同步更新):
FirefoxDriver
InternetExplorerDriver
ChromeDriver
SafariDriver
OperaDriver
AndroidDriver
3、webdriver的协议是什么?
client与driver之间的约定,无论client是使用java实现还是c#实现,只要通过这个约定,client 就可以准确的告诉drier它要做什么以及怎么做。
webdriver 协议本身是 http 协议,数据传输使用 json。这里有webdriver协议所有endpoint,稍微浏览下就知道这些endpoints涵盖了selenium 的所有功能。
4、什么是page object设计模式?
简单来说就是用 class 去表示被测页面。在 class 中定义页面上的元素和 一些该页面上专属的方法。
简要:
将页面操作放入一个类整体封装
将页面元素放入一个类整体封装
将页面动作整合一个类,在这个类中将元素跟操作结合成动作
测试用例类,直接调用页面动作类进行测试(测试类)
5、什么是page factory?
Page Factory 实际上是官方给出的 java page object 的工厂模式实现。
6、如何查找元素是否显示在屏幕上?
WebDriver 通过 isDisplayed(),isSelected(),isEnabled() 这三种方法判断 Web 元素的可见性,这类方法将返回结果是布尔类型; Web元素可以是按钮,下拉框,复选框,单选按钮,标签等。 ①isDisplayed():boolean b1 = driver.findElement(By.id(“XXX”)).isDisplayed(); ②isSelected():boolean b2 = driver.findElement(By.id( “XXX”)).isSelected(); ③isEnabled():boolean b3 = driver.findEleme nt(By.id(“XXX”)).isEnabled();
7、selenium中如何判断元素是否存在?
selenium 中没有提供原生的方法判断元素是否存在,一般我们可以通过定位元素+异常捕获的方式判断. # 判断元素是否存在 try: driver.find_element_by_id('none') except NoSuchElementException: print 'element does not exist'
8、selenium中hidden或者是display = none的元素是否可以定位到?
不可以,selenium不能定位不可见的元素。display=none的元素实际上是不可见元素。
9、selenium中如何保证操作元素的成功率?也就是说如何保证我点击的元素一定是可以点击的?
1.增加固定等待或者隐式等待,让页面元素先加载出来 2.被点击的元素一定要占一定的空间,因为 selenium 默认会去点这个元素的中心点,不占空间的元素算不出来中心点; 3.如果是元素被遮挡住,先去除遮挡元素,可以使用js或者修改元素属性实现 4.如果是下拉框,先点击下拉框,在定位里面的值
5.如果是iframe框架中,则需要先跳入框架中,再去定位元素
6.判断元素是否能点击/选择
10、selenium自动化页面元素找不到存在异常的原因?
1.页面没加载出来,就开始点击查找元素 2.元素被遮挡 3.元素可能在嵌入的iframe框架当中 4.定位的元素信息错误,定位方法有问题
5.定位的元素不在当前页面,需要下拉滚动条才能识别到
11、如何去定位属性动态变化的元素?
1.使用相对定位的方法,父节点、子节点、兄弟节点定位 2.可以使用findelements然后去遍历元素取下标定位元素 3.部分元素属性,xpath中的contains/strats-with/ends-with都可以
12、如何去定位页面上动态加载的元素?
触发动态事件,继而 findelement;如果是动态菜单,需要一级一级的 find。
举例:
下拉框里面的元素定位
点击下拉框
点击选中的元素
13、如何提高selenium脚本的执行速度?
使用更高配置的电脑和选择更快的网络环境;
使用效率更高的语言,比如 java 执行速度就快过 python;
优化代码;
不要盲目的加 sleep,尽量使用显式等待;
可以考虑分布式执行 或者使用 selenium grid;
chrome 浏览器和 safari 浏览器的执行速度看上去是最快的
14、用例在运行过程中经常会出现不稳定的情况,也就是说这次可以通过,下次就没办法通过了,如何去提升用例的稳定性?
测试专属 profile,尽量让静态资源缓存;
尽量使用显式等待;
尽量使用测试专用环境,避免其他类型的测试同时进行,对数据造成干
扰。
15、id,name,clas,xpath,css selector这些定位器,你最偏爱哪一种,为什么?
xpath 和 css 最为灵活。id、name 等需要开发支持。(因人而异,看你自己喜欢用什么)
16、selenium为什么不推荐使用xpath定位?
selenium 使用 xpath 定位时采用遍历页面的方式,性能指标较差。
另外 xpath 定位有通过绝对路径定位的,有时会不准确;
而用 css 选择器定位比较简洁,运行速度更快,通常用于性能要求严格 的场景。
17、如何去定位页面上动态加载的元素?
显式等待。(显示等待就是有条件的等待,隐式等待就是无条件的等待, 如 sleep、driver.implicitly_wait())
显示等待例子: WebDriverWait(driver, 3, 0.5) #传入三个参数,第一个是浏览器驱动,第 二个是等待多少秒,第三个是每隔多少秒监控一次
18、如何去定位属性动态变化的元素?
找出属性动态变化的规律,然后根据上下文生成动态属性
19、如何通过子元素定位父元素?
通过父元素定位子元素,可以通过二次定位来找到。 第一种:通过子元素定位父元素,css/xpath父子级查找,轴定位查找 第二种:通过 xpath 的语法直接定位。 如.//*[@name="hello"]/.. 两 个点代表父级元素。
20、selenium中隐藏元素定位,你该如何做?
隐藏元素可以正常定位到,只是不能操作(定位元素和操作元素是两码 事,操作元素是指 click 、clear 、send_keys 等这些方法)。我们可以 用 js 来操作隐藏元素。js 和 selenium 不同,只有页面上有的元素(在 dom 里面的)都能正常操作。
21、如何判断一个页面上元素是否存在?
法 1:用 try...except 在代码块加上 法 2:用 elements 定义组元素方法 然后根其元素个数 len()<1 存在 返回 True, 不存在则返回 False 法 3:结合 WebDriverWait 和 excepted_conditions 条件判断(强烈推荐)
WebDriverWait(driver,30,1).until(excepted_conditions.title_contains(u”软件测试部落”)) #判断 title,每间隔 1 秒判断一次,30 秒超时,存在返回 True,不存在则返回 False
22、page object设置模式中,是否需要在page里定位的方法中加上断言?
一般不要,除非是要判断页面是否正确加载。
23、driver.close() 和driver.quit() 有什么区别?
driver.close() 关闭用户当前正在使用的 Web 浏览器窗口
quit()方法 用于关闭程序已打开的所有窗口。
24、selenium 上传文件操作,需要被操作对象的type属性是什么?
file
25、selenium如何处理web弹窗?js弹窗?
需要使用 driver.switch_to.alert()
26、如何在webdriver中调用应用程序?
driver.get('url') 或者 driver.navigate().to('url')
27、selenium中常见的异常?
NoSuchElementException
ElementNoInteractac
tableException
NoAlertPresentException
28、怎样去选择一个下拉框中的value=xx的option?
需要二次定位 :
①拿到所有的 option;
②遍历 option 的 value 并与后台拿到的值进行比较(相同则选择该option)。
29、点击链接以后,selenium是否会自动等待该页面加载完毕?
不会。所以有的时候,当 selenium 并未加载完一个页面时再请求页面资源,则会误报不存在此元素。所以首先我们应该考虑判断,selenium 是否加载完此页面。其次再通过函数查找该元素。
30、selenium 是否可以调用js来对dom对象进行操作?
可以
31、selenium 是否可以向页面发送鼠标滚轮操作?
不能。(可利用 javaScript 来实现拖拽页面滚动条。)
32、selenium可以处理window弹窗吗?
selenium 本身是不可以处理 windows 弹窗的,但是可以借助 AutoIT 小工具来完成对 windows 弹窗的操作,比如 上传下载附件等。
33、如何在定位元素后高亮元素(以调试为目的)?
使用 javascript 将元素的 border 或者背景颜色改成黄色或其他颜色即 可。
34、selenium是否有读取excel文件的库?
没有,需要借助第三方工具。例如 Apache PIO 插件
35、上传图片的几种方式?
send_keys 和 AutoIT 工具实现.
可以使用pyautogui
36、selenium是否支持桌面应用软件的自动化测试?
不支持。selenium 是根据网页元素的属性来确定范围元素的。
37、Selenium是否支持用例的执行的引擎。
引擎好比就是一个发动机。Selenium 是没有关于测试用例和测试套件管 理和执行的模块。我们需要借助第三方单元测试框架来实现用例管理和 用例的执行。例如 Java 中有 Junit 或者 testNG,python 中有 unittest 单元测试框架。
38、列举Selenium的局限性有哪些?
Selenium 仅支持基于 Web 的应用程序的测试; 无法使用 Selenium 测试移动应用程序,可以选择 Appium 进行移动端 功能测试;
验证码和条形码阅读器无法使用 Selenium 进行测试;Selenium 本身不具有生成测试报告的功能,以JAVA 为例,需要结合第三方框架如 TestNG 或 JUnit 来生成测试报告。
39、Selenium如何拖动滚动条
# 滚动到底部 # document.body.scrollHeight 是用来获取滚动条的高度 js = 'window.scrollTo(0, document.body.scrollHeight)' driver.execute_script(js)
40、在你做自动化过程中,遇到了什么问题吗?
当然有遇到问题和挑战,主要有以下几点:
频繁地变更UI,经常要修改页面对象里面代码
运行用例报错和处理,例如元素不可见,元素找不到这样异常
测试脚本复用,尽可能多代码复用
一些新框架产生的页面元素定位问题,例如ck编辑器,动态表格等
脚本上传涉及到windows跟mac系统的差异,使用不同的脚本windows可以使用pyautogui,或者是autoit
多人合作编写测试用例的时候会导致冲突等,使用分excel分表格分模块的方法
40、在Selenium中如何处理多窗口?
使用切换tab的方法 用到swithTo方法。需要获取当前浏览器多窗口句柄,然后根据判断跳转新句柄还是旧句柄 # 句柄封装 def get_window_handle(self): """获取句柄""" return self.driver.window_handles def switch_to_window_by_handle(self, window_handle): """ :param window_handle: 切换到某个句柄 :return: """ self.driver.switch_to.window(window_handle)
后续持续更新~敬请期待