软件测试大赛web测试-python【备赛1】
环境配置
步骤1:创建项目(关键步骤)
选择 虚拟环境 (venv)
基础解释器选择:
D:/Anaconda3/python.exe✅ 勾选"从基础解释器继承软件包"
位置:项目目录下的
.venv文件夹
步骤2:安装测试包(使用国内镜像)
在 PyCharm Terminal 中执行:
pip install selenium pytest requests beautifulsoup4 webdriver-manager pytest-html -i https://pypi.tuna.tsinghua.edu.cn/simple/步骤3:验证安装
pip list | findstr -i "selenium\|pytest\|requests"
python -c "import selenium, pytest, requests; print('✅ 所有包安装成功!')"
pip install selenium
pip install selenium pytest requests beautifulsoup4 webdriver-manager -i https://pypi.tuna.tsinghua.edu.cn/simple/
/python/lib/site-packages
pip install pytest -i https://pypi.tuna.tsinghua.edu.cn/simple/
在设置-集成工具-默认测试运行程序选择pytestchrome driver
C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe确保已安装 pytest:
pip install pytest selenium代码基于pytest框架编写,命令行执行
pytest test.py --tb=short -v比赛注意事项(必须严格遵守)
1. 函数命名规范
一个需求对应一个函数,函数名必须为
test_CtripFlight_Rxxx。不可多写函数(如
test_CtripFlight_R001_001),也不可少写。需求编号必须是
R001、R002、R003,数字 0 不能写成字母 O。
2. 测试用例 Excel 文档
用例编号:
CtripFlight_Rxxx_xxx(如CtripFlight_R001_001)模块名称:
单程机票查询需求编号:
R001、R002、R003(区分大小写和数字)截图文件名:与用例编号完全一致,如
CtripFlight_R001_001.png复制粘贴到 Excel 的 Sheet1(从 A2 单元格开始)
选中 “输入数据”列(G列)
按
Ctrl + H→ 查找\n→ 在替换框中直接按Ctrl + J代表换行符保存为
测试用例模版.xlsx
3. 脚本结构要求
代码必须写在
// test-code-start和// test-code-end之间。不要修改红框外的任何代码。
提交前将驱动路径换回官方路径:
文件编码必须为 UTF-8。
4. 截图与压缩包
所有截图必须放在
screenshots文件夹中。提交时打包为
.zip格式,不要用 .rar。每条用例只保留一张截图,删除调试时生成的多余时间戳截图。
知识点:
1. 有效等价类 + 边界值分析:
等效的有效日期[2025-11-01, 2025-11-15],边界值选最小值2025-11- 01、最大值2025-11-15、中间值2025-11-08
2. 无效等价类 + 边界值分析
等价的无效日期,边界值选择紧邻有效区间的无效值,早一天2025-10-31,晚一天2025-11-16
往返有效: 有效等价类 出发日=2025-11-01 返程日:2025-11-01(同天) 2025-11-15(最后一天) 2025-11-08(中间) 往返无效: 无效等价类 出发日=2025-11-02 返程日=2025-11-01(早于出发) 返程日=2025-11-17(超预售期)
3. 元素,标签名,关键属性,定位方式(By.ID,XPath,LINK_TEXT)
在 Console 中输入:document.getElementBy("")
LINKTEXT 定位
driver.find_element(By.LINK_TEXT, "单程")
标签名是
<a>,通常有href属性(跳转链接)文字完全匹配(忽略前后空格)
Console:
document.querySelector('a:contains("单程")')(需 jQuery)
Xpath
不要直接复制浏览器“Copy XPath”生成的绝对路径,而应根据 DOM 树结构(语义 + 属性)
在 Chrome DevTools 中右键 → Copy → Copy XPath,得到的通常是绝对 XPath,例如: //*[@id="leftSideNavLayer"]/div/div/div[2]/div/div[1]/div/div[2]/button 根据 DOM 树结构手动编写相对 XPath
步骤 1:用 DevTools 查看元素的真实结构
“机票”按钮的 HTML:
<button aria-label="机票 按回车键打开菜单" class="lsn_top_nav_qdgwe ...">
<span class="...">机票</span>
</button>步骤 2:提取稳定、语义化的特征
文本内容:
<span>机票</span>→ 最稳定!用户看到的就是这个标签类型:
<button>→ 表明可点击属性:
aria-label="机票..."→ 辅助定位(但文本可能变)
步骤 3:编写相对 XPath(推荐以下任一)
推荐 1:通过内部文本定位(最通用)
//button[.//span[text()='机票']]
含义:找一个
<button>,其内部任意<span>的文本是 “机票”优点:不依赖 class/id,抗结构变化,语义清晰
推荐 2:通过 aria-label 定位(次选)
//button[@aria-label='机票 按回车键打开菜单']
优点:属性通常较稳定
缺点:如果提示文字微调(如多一个句号),会失效
推荐 3:模糊文本匹配(容错更强)
//button[contains(., '机票')]
含义:按钮内部任意位置包含“机票”文字
适合文本前后有空格、换行的情况
如何验证你写的 XPath 是否正确?
在 Chrome DevTools 的 Console 中执行:
$x("//button[.//span[text()='机票']]")
如果返回
[button](非空数组),说明 XPath 正确点击返回的元素,页面会高亮对应按钮
💡 小技巧:
$x("")是 Chrome 对 XPath 的支持,$$()是对 CSS Selector 的支持
总结
元素有固定 id(如search_btn) | By.ID(最优先) |
| 元素有明确可见文本(如“机票”、“搜索”) | //标签名[text()='xxx']或//标签名[contains(., 'xxx')] |
| 元素无 id、无文本,但有稳定 class | By.CSS_SELECTOR或//标签名[contains(@class, 'xxx')] |
| 需要定位子元素中的文本(如你的“机票”按钮) | //button[.//span[text()='机票']] |
优先选择:语义 + 稳定属性,而非路径长度
只验证“能否找到元素”,不验证“操作是否符合业务逻辑”
