浏览器元素定位工具-项目源码免费领取
插件页面
使用效果
1. 整体架构(类比测试框架)
- manifest.json:类似
pytest.ini
,声明插件权限、入口文件、快捷键等配置。 - background.js:类似测试框架的
Runner
,管理全局状态和消息转发。 - content.js:核心测试逻辑,类似
Page Object
的定位器生成器。 - popup.js/html:类似测试报告的
GUI
界面,展示历史记录和操作面板。
2. 核心模块:content.js(定位器生成引擎)
关键类 ElementLocatorHelper
(类比 LocatorFactory
)
class ElementLocatorHelper {constructor() {this.isActive = false; // 类似测试的录制状态this.currentElement = null; // 当前悬停元素this.selectedElement = null; // 已选中元素}
}
定位器生成流程(9级策略)
- 唯一性验证:类似
WebDriver
的find_elements
检查匹配数量。 - 优先级:
ID > Name > data-testid > 稳定Class > ... > JS坐标
。
3. 定位器策略详解(类比测试选择器)
策略层级 | 类型 | 示例(Playwright) | 稳定性 | 类比测试场景 |
---|---|---|---|---|
1 | ID | page.locator("#login-btn") | ⭐⭐⭐ | 最理想的定位方式 |
3 | 测试属性 | page.locator("[data-testid='submit']") | ⭐⭐⭐ | 专为测试设计的属性 |
5 | 属性组合 | page.locator("input[type='text'][placeholder='用户名']") | ⭐⭐ | 表单输入框专用 |
9 | JS坐标 | page.evaluate("document.elementFromPoint(x,y)") | ⭐ | 复杂动态元素的最后手段 |
4. 关键算法解析(以ID定位为例)
// 类似:在Selenium中优先用ID定位
if (element.id) {const selector = `#${element.id}`;if (document.querySelectorAll(selector).length === 1) { // 唯一性检查return {type: 'ID',playwright: `page.locator("${selector}")`,stability: 'high'};}
}
- 唯一性验证:通过
querySelectorAll
检查是否只匹配一个元素。 - 稳定性分级:ID/Name为
high
,XPath为low
。
5. UI交互流程(类比测试录制)
-
悬停高亮:
element.classList.add('locator-hover'); // 添加绿色边框
- 类似 Selenium IDE 的元素高亮。
-
点击选中:
const locators = generateLocators(element); // 生成9级定位器 showBestLocator(locators); // 显示最优解
- 类似录制测试脚本时选择最佳定位方式。
-
复制定位器:
navigator.clipboard.writeText("page.locator('#id')");
- 直接生成可粘贴到测试代码中的定位器。
6. 弹窗逻辑(popup.js)
class LocatorPopup {async exportAllCode() {// 类似导出Page Object代码const code = this.selectedElements.map(el => `# ${el.tagName}\n${el.locators.bestStrategy.playwright}`).join('\n');await navigator.clipboard.writeText(code);}
}
- 历史记录:类似测试框架的
lastFailed
功能,保存最近50个元素。 - 批量导出:一键生成完整页面的定位器代码。
7. 样式系统(locator.css)
.locator-hover {outline: 2px solid #4CAF50; /* 绿色悬停边框 */background: rgba(76,175,80,0.1);
}
.locator-selected {outline: 3px solid #FF5722; /* 橙色选中边框 */
}
- 类似开发者工具的元素检查效果,但针对测试场景优化。
8. 调试技巧(针对测试工程师)
-
查看定位器生成过程:
在 Chrome 控制台输入window.locatorHelper.generateLocators($0)
,$0
表示当前选中的元素。 -
验证选择器唯一性:
// 在控制台测试某个选择器 document.querySelectorAll("#login-btn").length === 1
-
模拟插件消息:
// 测试background.js的消息处理 chrome.runtime.sendMessage({type: 'elementSelected', data: {...}})
9. **与测试框架的集成示例
Playwright 测试脚本示例:
# 使用插件生成的定位器
def test_login(page):page.goto("https://example.com")login_btn = page.locator("#login-btn") # 插件生成的ID定位器login_btn.click()# 插件生成的备选定位器username = page.locator("[name='username']") username.fill("testuser")
10. 常见问题排查(QA视角)
现象 | 可能原因 | 解决方案 |
---|---|---|
定位器匹配多个元素 | 页面存在重复ID/Class | 改用更高优先级的策略 |
动态Class不稳定 | 类名包含随机哈希值 | 使用属性组合或父元素限定 |
iframe内元素无法定位 | 未切换到iframe上下文 | 手动添加iframe切换代码 |
- 项目地址
https://github.com/kangpc/browser-extension