初级面试题
请讲一下 Selenium 的工作原理?
面试题目
- 如果你在面试过程中,被面试官问到:请讲一下 Selenium 的工作原理?你会如何回答呢?
公司
- 某金融公司
招聘类型
- 社招
- 校招
答案
Selenium 介绍
- 官网:https://www.selenium.dev/
Selenium 通常被我们用做测试 web 的自动化测试工具,其实 Selenium 不仅仅是个 API,它是一组工具集合,它是由三大组件组成
-
WebDriver: 可以模拟真正的用户去操作浏览器页面,主要是通过控制浏览器厂商提供的 driver 来控制浏览器
-
Selenium IDE: 是安装在浏览器上一个扩展工具,可以将操作浏览器的过程录制下来,可以导出不同的语言,不同的框架格式
-
Selenium Grid: 可以在不同电脑上执行测试用例,实现分布式并发执行测试用例的效果。
Web 自动化测试的意义
通常我们所说的 Web 自动化测试,就是使用 Selenium WebDriver 来对浏览器进行自动化控制。可以调用 Selenium API 操作浏览器,解放人力成本(比如,打开一个 baidu.com ,然后找到搜索框,输入搜索内容,验证结果等一连串的用户行为),它的意义体现在如下几个方面:
-
回归测试
-
可以执行手工测试很难实现或者很耗时的测试工作,比如并发测试、压力测试
-
能够更好的利用资源,节省时间和人力成本
Selenium 工作原理
Selenium 实现自动化测试,主要由三部分在工作:
-
客户端脚本(Client)
-
浏览器驱动(Driver)
-
浏览器(Browser)
- 开始执行测试时,测试用例会作为 Client 端,用例调用 Selenium 库的 API, 完成对浏览器驱动的启动,此是驱动会开通一个端口,用来接收请求
- 当浏览器驱动 Driver 接收到客户端 Client 的请求,会将请求通过另一端口实现转发,转发给浏览器,执行相应的指令
- 浏览器执行完成相应指令,会将结果返回给浏览器驱动,浏览器驱动最终将结果返回给 Client。
- 客户端在向浏览器驱动发送请求的时候遵循了一个协议 WebDriver WireProtocal 。
这是一套完整的流程,所以搭建测试环境的时候,一定要 先下载【浏览器对应】的 WebDriver。
为什么能够支持这么多种浏览器?
-
Selenium WebDriver 是典型的 Server-Client 模式,Server 端就是 Remote Server
-
浏览器的厂商们给我们提供叫做 driver 的中间件, 通过编写脚本,去给这个中间件发送请求(遵循 WebDriver Wire 协议 )实现对浏览器的控制
举个例子,比如约定的协议 /session/{session id}/element
是查找元素,
/session/{session id}/element/{element id}/click
是点击元素
通过这个中间件 可以直接驱动浏览器执行各种操作,比如点击,滑动, 输入,下拉等等。
通过这个中间件,我们可以控制浏览器
我们可以通过写脚本,去给这个中间件(chrome - chromedrive , firefox-geckodriver)发送请求,那这个请求是如何发送的呢? 遵循一个特定的协议 进行通讯,
举个例子,提前约定好一个协议 ,你发给我的请求遵循一个特定的协议格式 ,比如约定的协议 /session/{sessionid}/find 就是查找元素,/click 就是点击元素, (这个协议 就是 Webdriver 协议)
代码演示
可以通过代码看一下具体工作过程
-
第一步:下载对应的 chromedriver 并配置环境变量
-
第二步:打印 DEBUG 级别的日志
-
第三步:创建 driver
-
第四步:打开浏览器
-
第五步:driver.quit()退出操作
代码:
# 创建文件 demo.py ****不要创建以test_开头*****
from selenium import webdriver
import logging
logging.basicConfig(level=logging.DEBUG) # 打印源码中的日志
driver = webdriver.Chrome() # 打开浏览器
driver.get("https://www.ceshiren.com") # 访问 测试人论坛
结果:
1. DeprecationWarning: executable_path has been deprecated, please pass in a Service object
driver = webdriver.Chrome(executable_path="D:\\mydriver\\chromedriver.exe") # 打开浏览器
2. DEBUG:selenium.webdriver.remote.remote_connection:POST http://localhost:53116/session {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "chrome", "pageLoadStrategy": "normal", "goog:chromeOptions": {"extensions": [], "args": []}}}}
3. DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): localhost:53116
4. DEBUG:urllib3.connectionpool:http://localhost:53116 "POST /session HTTP/1.1" 200 788
5. DEBUG:selenium.webdriver.remote.remote_connection:Remote response: status=200 | data=...省略...)
6. DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
7. DEBUG:selenium.webdriver.remote.remote_connection:POST http://localhost:53116/session/fea574de37447a010cc20ab992cb9ce9/url {"url": "https://www.ceshiren.com"}
8. DEBUG:urllib3.connectionpool:http://localhost:53116 "POST /session/fea574de37447a010cc20ab992cb9ce9/url HTTP/1.1" 200 14
9. DEBUG:selenium.webdriver.remote.remote_connection:Remote response: status=200 | data=...省略...)
10. DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
日志解析
-
DEBUG:selenium.webdriver.remote.remote_connection: 开始请求的标识
-
Finished Request 是一次请求结束的标识
-
首先,第二行发送 POST 请求,带着参数,创建一个 http 连接,第五行得到响应状态码为 200,并得到响应对象,第六行结束第一次请求
-
然后,第七行,发送一个 post 请求,打开网址,第 9 行,得到响应状态码 200,以及响应数据,第 10 行结束第二次请求
模拟 Selenium 底层请求过程
import requests
# 请求地址(打开浏览器)
driver_url = 'http://127.0.0.1:53119/session'
# 打开浏览器的请求参数
driver_value = {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "chrome", "platformName": "any", "goog:chromeOptions": {"extensions": [], "args": []}}}, "desiredCapabilities": {"browserName": "chrome", "version": "", "platform": "ANY", "goog:chromeOptions": {"extensions": [], "args": []}}}
# 发送求清
response_session = requests.post(driver_url, json = driver_value)
result = response_session.json()
sessionId = result['value']['sessionId']
print(f"sessionId ===>> {sessionId}")
# 访问 [测试人论坛]请求地址
url = 'http://127.0.0.1:53119/session/'+sessionId+'/url'
# # 访问我的博客的请求参数
value = {"url": "https://www.ceshiren.com"}
response1 = requests.post(url = url,json = value)
print(response1)
-
首先模拟发送一个 http 请求, 请求 session 对象
-
从结果中解析出 sessionid
-
再使用这个 sessionid 发送一个请求,打开页面,得到响应结果
-
其它操作也是一样(参考 w3c webdriver 协议)
工作中常用的定位方式有哪些
面试题目
- 级别: L1
- 知识模块: App自动化测试
工作中常用的定位方式有哪些
公司
- 优酷外包
招聘类型
社招
题目解析
- 面试官在这道题目主要考察 UI 自动化测试相关的定位知识。
-
因为题目没有明确 Web 或者 App ,所以可以从两个方面都补充。
答案
-
在 Web 当中,常用的定位方式有 ID、Name、ClassName 这些是在定位的时候用的最多的。这是元素比较清晰时,会单独使用这些元素。层级比较深也没有特殊的属性时,会用到 Xpath 或者 CSS,基本能定位到所有元素。
-
在 App 当中,常用的其实是 ID,Class 可能比较重复,所以会在相对定位当中用到。在 App 里用的相对定位都是 Xpath 来实现的。这个基本能满足对 App 当中元素的定位需求。
quit 方法和 close 方法的区别是什么
面试题目
- web 自动化中,使用 selenium 框架的 driver 调用 quit 方法和调用 close 方法的区别是什么?
公司
- 某金融公司
招聘类型
- 校招
- 社招
答案
回答
quit()
: 退出当前所有的窗口;close()
: 关闭当前的标签页,其他窗口不退出
场景
关闭所有的浏览器窗口,销毁 driver 操作,则需要使用的是 quit 方法;当打开了多个窗口,只想要关闭非最后一个窗口的时候,使用的是 close 方法。
演示代码
- quit: 所有的浏览器窗口退出
@Test
public void quit() throws InterruptedException {
WebDriver webDriver = WebDriverManager.chromedriver().create();
webDriver.get("https://www.baidu.com/");
webDriver.findElement(By.linkText("新闻")).click();
sleep(5000);
//输出当前的窗口
Set<String> windowHandles = webDriver.getWindowHandles();
System.out.println(windowHandles);
sleep(3000);
//切换到第一个窗口
webDriver.switchTo().window(windowHandles.stream().findFirst().get());
sleep(2000);
System.out.println(webDriver.getWindowHandle());
//Quits this driver, closing every associated window.
webDriver.quit();
sleep(6000);
}
- close: 只关闭当前的浏览器标签页,如果当前浏览器标签页剩下最后一个,则所有标签页面退出
@Test
public void close() throws InterruptedException {
WebDriver webDriver = WebDriverManager.chromedriver().create();
webDriver.get("https://www.baidu.com/");
String mainHandle = webDriver.getWindowHandle();
webDriver.findElement(By.linkText("新闻")).click();
sleep(2000);
//切换到第一个窗口
webDriver.switchTo().window(mainHandle);
sleep(2000);
webDriver.findElement(By.linkText("图片")).click();
sleep(2000);
webDriver.close();//关闭第一个窗口
System.out.println("浏览器关闭第一个窗口");
sleep(6000);
//切换到最后一个窗口关闭
Set<String> handles = webDriver.getWindowHandles();
ArrayList<String> hanleList = new ArrayList<>(handles);
String endHandle = hanleList.get(hanleList.size() - 2);
webDriver.switchTo().window(endHandle);
sleep(2000);
webDriver.close();
System.out.println("浏览器关闭最后一个标签页");
sleep(6000);
}
UI 自动化 3 种等待方式区别与优点
面试题目
- 级别: L1
- 知识模块: UI自动化测试
UI自动化3种等待方式区别与优点
公司
- 小米外包
招聘类型
社招
题目解析
- 本题主要考察UI自动化中的三种等待方式以及它们的区别和优点。
- 三种等待方式:隐式等待、显式等待、强制等待。
- 隐式等待:设置全局等待时间,在这个时间内,WebDriver 会不断地尝试查找元素直到找到元素或超时。优点为:
- 简单易用:设置一次后,对所有元素查找都生效
- 减少代码重复:无需在每个元素查找操作钱都写等待代码。
- 显示等待:针对某个特定的元素设置等待条件,在指定的时间内持续检测该条件是否满足。优点为:
- 灵活性高:可以为不同的元素设置不同的等待条件和等待时间
- 精准控制:只在需要时才进行等待,避免不必要的延迟。
- 强制等待:强制程序暂停一段时间。优点为:
- 简单直接:不需要检查任何条件,只需指定等待时间。
- 隐式等待:设置全局等待时间,在这个时间内,WebDriver 会不断地尝试查找元素直到找到元素或超时。优点为:
-
使用建议
- 隐式等待:适用于大多数情况下全局统一的等待需求,但应避免设置过长的等待时间。
- 显式等待:更适合特定场景,尤其是需要对某些元素进行条件检查时,推荐在需要使用显式等待来提高测试的灵活性和准确性。
- 强制等待:在正式上线测试代码时,通常不推荐使用,除非在某些特殊情况下确实需要强制等待一段时间。
答案
UI自动化测试中包含隐式等待、显式等待和强制等待三种等待方式,隐式等待的优点是全局应用,无需为每个元素单独设置,且能自动检测元素加载,显示等待的优点是灵活且精确控制等待时间和条件,强制等待的优点是简单直接,可以准确定位自动化测试代码的问题所在。
显示等待的参数
面试题目
- 级别: L1
- 知识模块: App自动化测试
显示等待的参数
公司
- 小米外包
招聘类型
社招
题目解析
-
本题考察点为显示等待的使用方法,即如何使用WebDriver的显示等待方法来等待页面元素的出现。
-
显示等待是指在等待一个元素出现在页面上时,如果元素一直不出现,则一直等待,直到超时。
-
显示等待的参数包括WebDriver实例对象、最长等待时间、检测的间隔步长(可选)、忽略的异常(可选)、条件方法 以及条件判断。
答案
显示等待是指在等待一个元素出现在页面上时,如果元素一直不出现,则一直等待,直到超时。主要参数包括WebDriver实例对象,最长等待时间,还可以包括检测的间隔步长,然后条件方法以及判断条件。
ui 自动化八大定位方式
面试题目
- 级别: L1
- 知识模块: UI自动化测试
ui自动化八大定位方式
公司
- 快手
招聘类型
社招
题目解析
- 本题主要考察UI自动化中常用的八种定位方式。
- UI自动化测试中常用的定位方式包括Id、Name、Xpath、Link Text、Partial Link Text、Tag Name、ClassName 和 CSS Selector
在 UI 自动化测试中,定位网页元素是实现自动化操作的基础,以下是八大常见的定位方式:
- ID :根据元素的唯一 ID 属性来定位。
- Name:根据元素的 name 属性来定位。
- ClassName:根据元素的 class 属性来定位。
- TagName:根据元素的 HTML 标签名称来定位。
- LinkText:根据链接文本来定位元素。
- PertialLinkText:根据部分链接文本来定位元素。
- CSS Selector:根据 CSS 选择器来定位元素。
- XPath:根据 XPATH 表达式来定位元素。
答案
UI自动化测试中常用的定位方式包括 Id、Name、Xpath、CSS Selector、Link Text、Partial Link Text、Tag Name和ClassName。
实际工作中,你是如何开展自动化工作的
面试题目
- 实际工作中,你是如何开展自动化工作的?
公司
- 某金融公司
招聘类型
- 社招
答案
考察点
面试官想了解:
- 是否有负责过自动化工作的开展
- 是否对项目的整体流程能够把控
回答
自动化测试工作开展流程:
-
第一、需求分析。根据产品的业务特性整理出一个可以做自动化的功能模块
-
第二、制定测试计划:根据业务特性、业务复杂性、任务优先级、以及人员现状来制定自动化测试计划;
-
第三、设计自动化用例:从功能用例中挑选合适的用例来转成自动化用例;
-
第四、框架选型。选择合适的编程语言、自动化工具、完成环境的搭建
-
第五、编写/调试脚本:自动化测试的脚本开发与调试
-
第六、执行测试:根据项目来制定自动化的执行方案;
-
第七、测试报告:整理测试报告并开展分析工作,接着汇报自动化测试成果
-
第八、后期维护:跟进框架与脚本的后期维护
ui 自动化怎么做,web 和 app 的一样吗
面试题目
- 级别: L1
- 知识模块: App自动化测试
ui自动化怎么做,web和app的一样吗?基础架构
公司
- 优酷外包
招聘类型
社招
题目解析
面试官在这里是为了考察应聘者对以下一个方面的理解和掌握:
- 理解UI 自动化测试的基本概念
- 区分 web 和 app 自动化测试的异同点
- 基础架构的理解和设计能力
- 实践经验和问题解决能力
以下是详细解析内容:
一. UI 自动化怎么做
UI自动化测试是一种通过编写脚本模拟用户在应用程序界面上的操作,以验证应用程序是否按预期工作的测试方法。具体步骤如下:
- 选择合适的工具和框架:
- 对于Web应用:常用工具包括Selenium、Cypress、Playwright、TestCafe等。
- 对于移动App:常用工具包括Appium、Espresso(用于Android)、XCUITest(用于iOS)等。
- 编写测试脚本
- 使用所选工具编写自动化测试脚本,这些脚本模拟用户操作,如点击按钮、输入文本、验证页面元素等。
- 采用Page Object Model(POM)设计模式,将页面元素与测试脚本分离,提高脚本的可维护性。
- 测试数据管理:
- 使用外部数据源(如CSV、JSON、数据库)管理测试数据,以便测试脚本可以重复使用不同的数据集。
- 测试环境设置:
- 配置测试环境,包括浏览器、操作系统、移动设备模拟器或真实设备等。
- 结果报告和分析:
- 使用工具生成测试报告,如Allure Report等,方便分析测试结果。
2. Web 和 App 的 UI 自动化测试一样吗
- 测试工具:
- Web 主要使用 Selenium 等浏览器自动化工具
- App 主要使用 Appium 等移动自动化工具。
- 环境配置:
- Web 应用:需要设置不同的浏览器和版本,可能还需要考虑跨浏览器测试。
- App :需要设置模拟器、真是设备、不同的操作系统版本等。
- 元素定位:
- Web 应用:主要使用 HTML DOM 元素进行定位
- App:需要处理原生和混合应用的元素定位,使用 UI Automator、XCUITest 等技术。
Web 和 App 的共同点
- 测试框架:两者都依赖于特定的测试框架来编写和执行测试脚本。
- 自动化测试的目的:两者的目标都是自动化常规测试,提高测试效率和覆盖率。
- 元素定位策略:虽然具体方法和工具不同,但基本理念相同,通过唯一标识符找到 UI 元素。
- 测试报告和 CI/CD 集成:两者都需要生成测试报告并集成到 CI/CD 流水线中。 -->
3. 基础架构
- 测试框架:选择一个测试框架来组织和运行测试,例如 Pytest、JUnit、TestNG等。
- Page Object Model(POM):将页面元素与测试脚本分离,提高可维护性和可读性。
- 测试数据管理:使用外部数据源管理测试数据,支持数据驱动测试。
- 测试环境管理:配置不同的测试环境,如本地环境、测试服务器、模拟器或云服务。
- CI/CD 集成:将自动化测试集成到持续集成和持续部署(CI/CD)中,确保每次代码提交后自动运行测试。
- 结果报告和分析:使用报告工具生成详细的测试报告。
答案
UI 自动化测试通过编写脚本模拟用户与软件界面的交互,包括元素定位、操作和断言。尽管 Web 和 App 在具体的定位方式和操作上有所不同,但它们的基础架构是相似的。Web 测试通常需要处理浏览器差异和网络连接问题,而 App 测试则需应用移动设备和操作系统的多样性。
自动化,通常是在用的什么样的技术框架?
面试题目
- 级别: L1
- 知识模块: Web自动化测试
自动化,通常是在用的是什么样的技术框架?
公司
- 大众外包
招聘类型
社招
题目解析
面试官想要考察应聘者在技术上的广度和深度,可从以下几个方向回答:
-
理解主流自动化测试框架
-
Selenium:用于 Web 应用的 UI 自动化测试,业界内应用最广泛的开源框架
- Appium:专注于移动端的自动化测试工具
- Cypress:适合快速可靠的端到端测试
- Robot Framework:关键字驱动的自动化测试框架
-
Playwright:支持多浏览器、并行测试的新兴框架,提供现代化API
-
理解如何选择合适框架
-
面试者应能分析出在过往项目或需求场景下如何选择合适的自动化测试框架,结合项目特性和测试目的,来选择合适的工具。
-
理解与集成的技术栈
-
考察面试者是否了解测试的全流程,是否能从测试报告(如Allure)、版本控制(如 Git)、环境管理(测试、预发布和正式环境)、测试数据(文件、参数化)等方面考虑自动化测试的执行,以实现持续集成和持续部署(CI/CD)流程中的自动化测试。
-
对新技术的关注和学习
-
考察面试者是都对新兴技术或框架(如 Playwright,cypress)有所了解,展示出持续学习和更新技术知识的态度。
-
实践经验
-
分享在实际项目中使用自动化测试框架的经验,如遇到的难解决的问题是如何处理的,是否有过自动化测试推进成功的经验。
面试官主要希望评估面试者在技术领域的视野广度,以及他们是否具备根据实际需求选择合适技术框架的能力。同时,面试官也希望了解面试者是否持续关注并探索新兴技术。
答案
UI 自动化现阶段在业界较为主流的工具有 Selenium 、Appium、Cypress 这些。除了自动化测试框架之外,还会结合一些辅助测试的工具,例如 Pytest 单元测试框架可以很好的管理用例,Allure 能够快速生成数据详细并且页面结构清晰的测试报告,为了能更快的发现并及时调整问题,也可加上 CI/CD 的流程,结合例如jenkins的调度平台,使得自动化测试能够更快的推进并且更好的辅助测试工作。