中级面试题
如何判断一个页面上元素是否存在
面试题目
- 如何通过子元素定位父元素
公司
- 某金融公司
招聘类型
- 社招
- 校招
答案
考察点
面试官想了解:
- 是否真的做过 UI 自动化测试
-
在做测试的时候遇到元素难定位的问题如何解决,如何判断元素在页面上是否存在?是否有自己的思考与总结
-
是否了解显式等待的用法
-
是否了解
find_elements()
的用法
技术点
涉及的技术点:
-
通过异常处理来判断元素是否存在
-
通过查找元素列表
find_elements()
判断元素是否存在 -
显式等待
回答
-
方法一:通过异常处理来判断元素是否存在,可以使用
try…except…
未找到元素的时候捕获这个异常 -
方法二:通过查找元素列表
find_elements()
判断元素是否存在,定义一个方法,如果元素列表大于 0 则元素存在,返回 True, 如果元素列表等于 0 则元素不存在,返回 False -
方法三:显式等待,结合
WebDriverWait
和expected_conditions
判断(推荐)
如何通过子元素定位父元素
面试题目
- 如何通过子元素定位父元素
公司
- 某金融公司
招聘类型
- 社招
- 校招
答案
技术点
涉及的技术点:
-
..
代表通过子元素定位父元素。 -
通过
parent::*定位父元素
回答
- 方法一:通过 element/.. 定位父结果,例如:
# 查找节点的父节点
$x('//*[@id="site-logo"]/..')
- 方法二:通过 parent::*定位父元素,例如:
# 查找节点的父节点
$x('//*[@id="site-logo"]/parent::*')
显式等待与隐式等待的区别是什么
面试题目
- UI 自动化中,显式等待与隐式等待的区别是什么?
公司
- 某金融公司
招聘类型
- 社招
- 校招
答案
考察点
面试官想了解:
-
显式等待与隐式等待的区别
-
三种等待方式分别是什么,有什么区别
技术点
涉及的技术点:
-
显式等待
-
隐式等待
-
强制等待
回答
自动化测试中,Selenium 框架为了页面等待提供了两种等待方式:隐式等待、显示等待。
隐式等待
在创建 driver 时声明并且只声明一次,声明后在整个 WebDriver 周期都生效,相当于一个全局变量。隐式等待相当于告诉 driver 去等待一定时间后再去执行代码操作,即当页面加载完成后,才会执行下一步。
优点
只需声明一次,不需要在每个操作步骤声明。
缺点
设置隐式等待后,对应的影响的不是某一个元素而是整个页面,只有整个页面加载完成后才会执行下一步。
页面加载完成后,如果要操作的是某个元素,则需要等当前元素的所有属性加载完成。即不只是 UI 加载完成,还需要对应的元素的 js 文件、图片等加载完成,此时会增加不必要的加载时间。
代码 Java 代码声明如下:
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(等待时间秒数));
Python 代码声明如下:
driver.implicitly_wait(等待时间)
显式等待
需要定位某个元素时,但是元素有可能还未加载出来,这时就需要针对具体的元素或者页面进行显式等待条件的判断。
优点
针对指定元素或页面生效,不是整个 WebDriver 周期生效。所以,可以根据对应定位的元素来设置显式等待的判断条件,会节省加载其它无关文件的时间,即不需要等待页面加载完成。
缺点
必须在需要的操作前声明对应的显示等待及其判断条件,如果每个步骤都需要则需要在每个步骤前都声明。
代码 Java 代码声明如下:
WebDriverWait wait = new WebDriverWait(androidDriver,
Duration.ofSeconds(时间), //总共查找等待条件的时间
Duration.ofSeconds(时间));//每隔多少秒去查找一次显示等待的条件
wait.util(条件函数);
Python 代码声明如下:
Welement = WebDriverWait(driver, 最长等待时间, 执行间隔).until(条件函数)
显式等待和隐式等待的区别
隐式等待可以看作全局变量,显式等待可以看作为局部变量。
强制等待
直接是线程等待,只有等待完成后才能运行代码。
隐藏元素怎么定位
面试题目
- 级别: L1
- 知识模块: App自动化测试
隐藏元素怎么定位
公司
- 优酷外包
招聘类型
社招
题目解析
-
本题考察点为定位隐藏元素,即元素的 display 属性为 none。
-
selenium 常用的 XPATH 和 CSS 选择器,只能找到可见的元素,隐藏元素可以使用 execute_script 方法执行 JavaScript 代码来查找隐藏元素,用法示例如下:
# 使用JavaScript找到隐藏元素
hidden_element = driver.execute_script("return document.querySelector('<CSS 定位表达式>');")
# 执行某些操作,例如点击隐藏元素
driver.execute_script("arguments[0].click();", hidden_element)
- 还有一种方式是需要先将隐藏元素变为可见,使用 JavaScript 设置隐藏元素可见:
driver.execute_script("arguments[0].style.display='block';", hidden_element)
答案
隐藏元素可以通过定位其父元素或者兄弟元素来间接定位,也可以直接使用 JavaScript 代码来操作隐藏元素或者通过执行 JavaScript 代码使其显示。
元素明明定位到了,点击无效
面试题目
- 一个元素明明定位到了,点击无效(也没报错),如果解决?
公司
- 某金融公司
招聘类型
- 社招
- 校招
答案
-
方法一:页面上有的时候元素点了没有反应(比如时间日期组件),可以通过 js 操作
-
方法二:有的页面中按钮属性加载较慢,虽然能定位到这个元素,但还未加载出可点击属性,点了没有反应,这时可以使用显式等待,封装一个方法,如果点了没有反应,则利用显式等待,等一段时间再点一次,如果在显等的时间内,点了都没有反应,则抛出异常