千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

当前位置:首页  >  应聘面试  >  软件测试面试题  > 3道经典自动化测试面试题,附答案详解_千锋教育

3道经典自动化测试面试题,附答案详解_千锋教育

来源:千锋教育
发布人:cli
时间: 2026-07-03 18:44:35 1783075475

一、Selenium元素定位失败:如何优雅处理动态ID

真实场景

某电商后台管理页面,表格中每行数据都有一个“编辑”按钮。按钮的ID格式为 edit_12345,其中数字部分由后端动态生成,每次刷新页面都会变化。测试用例需要点击第一行的“编辑”按钮。

问题拆解

  • ►动态ID无法直接使用 By.id 定位
  • ►需要找到稳定的属性组合:class、文本、层级关系
  • ►考虑等待机制,避免元素未加载就操作

逐步解决

步骤1:分析页面结构

假设HTML片段如下:

html
<table>
  <tr id="row_1">
    <td>商品A</td>
    <td><button class="btn-edit" data-id="12345">编辑</button></td>
  </tr>
  <tr id="row_2">
    <td>商品B</td>
    <td><button class="btn-edit" data-id="67890">编辑</button></td>
  </tr>
</table>

步骤2:编写定位策略

使用XPath结合稳定属性:

python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("http://example.com/admin/products")

# 等待表格加载完成
wait = WebDriverWait(driver, 10)
table = wait.until(EC.presence_of_element_located((By.TAG_NAME, "table")))

# 定位第一行的编辑按钮:利用class和层级关系
edit_button = driver.find_element(By.XPATH, "//tr[1]//button[contains(@class, 'btn-edit')]")
edit_button.click()

步骤3:处理动态等待

如果按钮是异步加载的,需要显式等待:

python
wait.until(EC.element_to_be_clickable((By.XPATH, "//tr[1]//button[contains(@class, 'btn-edit')]"))).click()

效果验证

  • ►运行脚本,确认能稳定点击第一行“编辑”按钮,不依赖ID
  • ►刷新页面后再次执行,依然成功

方法论提炼

  • ►优先使用 id、name 等稳定属性
  • ►动态属性时,利用 contains、starts-with 等XPath函数匹配部分属性值
  • ►结合显式等待(WebDriverWait)解决加载时序问题
  • ►避免使用绝对路径(如 /html/body/table/tr[1]/td[2]/button),维护成本高

---

二、接口自动化:如何对登录接口进行参数化测试

真实场景

测试一个用户登录API:POST /api/login,请求体为JSON格式,包含 username 和 password。需要验证:

  • ►正确账号密码返回200和token
  • ►错误密码返回401和错误提示
  • ►空用户名返回400

问题拆解

  • ►需要将测试数据与代码分离
  • ►使用参数化框架(如pytest的 @pytest.mark.parametrize)
  • ►断言应包括状态码和响应体关键字段

逐步解决

步骤1:准备测试数据

使用pytest的parametrize装饰器:

python
import requests
import pytest

# 测试数据: (用例描述, 用户名, 密码, 期望状态码, 期望结果)
test_data = [
    ("正确登录", "admin", "correct_pass", 200, "token"),
    ("错误密码", "admin", "wrong_pass", 401, "error"),
    ("空用户名", "", "any_pass", 400, "error"),
]

步骤2:编写测试函数

python
@pytest.mark.parametrize("case_name, username, password, expected_status, expected_key", test_data)
def test_login(case_name, username, password, expected_status, expected_key):
    url = "http://localhost:5000/api/login"
    payload = {"username": username, "password": password}
    
    response = requests.post(url, json=payload)
    
    # 断言状态码
    assert response.status_code == expected_status, f"{case_name}: 状态码不匹配"
    
    # 断言响应体包含关键字段
    response_json = response.json()
    assert expected_key in response_json, f"{case_name}: 缺少字段 {expected_key}"
    
    # 如果是成功用例,验证token非空
    if expected_status == 200:
        assert response_json["token"] != "", "token不应为空"

步骤3:运行测试

bash
pytest test_login.py -v

输出示例:

text
test_login[正确登录] PASSED
test_login[错误密码] PASSED
test_login[空用户名] PASSED

效果验证

  • ►3个用例全部通过,覆盖正常、异常、边界场景
  • ►新增测试用例只需在 test_data 列表中添加一行

方法论提炼

  • ►接口测试使用 requests 库,版本不低于2.31.0(2023年发布)
  • ►参数化测试减少代码重复,提高覆盖率
  • ►断言要精确:状态码 + 响应体关键字段 + 业务逻辑(如token格式)
  • ►测试数据可从文件(JSON/CSV)读取,便于维护

---

三、App自动化:如何处理Android Toast提示

真实场景

测试一个Android支付App,当用户输入错误密码点击“确认支付”时,屏幕底部会短暂出现Toast提示“支付密码错误”。自动化脚本需要捕获该提示并验证内容。

问题拆解

  • ►Toast是瞬态元素,常规 find_element 无法定位
  • ►需要借助UIAutomator2的 toast 监听机制
  • ►设置超时等待,防止Toast消失后断言失败

逐步解决

步骤1:安装依赖

使用 uiautomator2 和 weditor(版本:uiautomator2 >= 3.0.0):

bash
pip install uiautomator2

步骤2:编写测试脚本

python
import uiautomator2 as u2
import time

# 连接设备(通过USB或WiFi)
device = u2.connect_usb()  # 或 u2.connect("192.168.1.100")

def test_toast_validation():
    # 启动App
    device.app_start("com.example.payment")
    
    # 进入支付页面(假设已登录)
    device(text="确认支付").click()
    
    # 监听Toast
    toast_text = device.toast.get_message(timeout=5.0, default="")
    
    # 断言
    assert "支付密码错误" in toast_text, f"期望包含'支付密码错误',实际为: {toast_text}"
    
    print("Toast验证通过")

步骤3:处理未出现Toast的情况

python
# 如果Toast可能不出现,使用try-except
try:
    toast = device.toast.get_message(timeout=3.0)
    assert "支付密码错误" in toast
except:
    print("未检测到Toast,可能支付成功")

效果验证

  • ►执行脚本,当输入错误密码时,成功捕获“支付密码错误”Toast
  • ►连续执行3次,均稳定捕获

方法论提炼

  • ►Android Toast使用 uiautomator2 的 toast.get_message() 方法
  • ►设置合理的timeout(3~5秒),Toast通常持续2~3秒
  • ►结合Appium也可实现,但uiautomator2更轻量
  • ►注意:Toast监听需在触发操作(如点击)之前开启

---

总结

自动化测试面试考察的核心不是背诵代码,而是面对具体问题时的拆解能力和解决方案质量。这三道题覆盖了Web UI、接口、App三大领域,面试中遇到类似场景时,建议按以下思路回答:

1. 描述场景:说明你遇到了什么问题(如动态ID、参数化、瞬态元素)

2. 分析原因:为什么常规方法不行(ID变化、数据重复、元素消失)

3. 给出方案:用什么技术(XPath、pytest、uiautomator2)和具体代码

4. 验证效果:如何确认方案可行(运行通过、覆盖率)

5. 提炼方法:总结出可复用的测试策略

按照这个框架组织答案,面试官会认为你具备解决实际问题的能力。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT