Back to catalog

ones-task-form-automation

自动填写 ONES 项目管理系统的 Create Task 表单。包含表单定位、字段识别、React 兼容的填写方法和下拉菜单操作。当需要在 ONES 系统中批量创建或自动填写任务时使用。

  • Category: discovered
  • Tags: github, community
  • Version: 1.0.0
  • Author: walid
  • Downloads: 0
  • GitHub stars: 1
  • Updated: 2025-11-21

Download the latest version (v1.0.0) from this page.

SKILL.md

---
name: ones-task-form-automation
description: 自动填写 ONES 项目管理系统的 Create Task 表单。包含表单定位、字段识别、React 兼容的填写方法和下拉菜单操作。当需要在 ONES 系统中批量创建或自动填写任务时使用。
---

# ONES Create Task 表单自动化

通过 Chrome CDP 和 JavaScript 自动填写 ONES 项目管理系统的创建任务表单。

## 快速参考

### 表单定位

```javascript
// 定位 Create Task 弹窗(第一个模态框)
const modal = document.querySelectorAll('.ones-modal')[0];
```

### 核心填写方法

```javascript
// 1. 获取原生 setter(绕过 React 拦截)
const inputSetter = Object.getOwnPropertyDescriptor(
  window.HTMLInputElement.prototype, 'value'
).set;

// 2. 设置值
element.focus();
inputSetter.call(element, newValue);

// 3. 触发事件(让框架感知变化)
element.dispatchEvent(new Event('input', { bubbles: true }));
element.dispatchEvent(new Event('change', { bubbles: true }));
element.blur();
```

### 主要字段快速索引

| 字段 | 选择器 | 类型 | 必填 |
|-----|--------|------|-----|
| 标题 | `#summary` | input | ✓ |
| 描述 | `textarea` (第1个) | textarea | - |
| 验收标准 | `.ones-form-item:nth-child(5) textarea` | textarea | - |
| 负责人 | `.ones-form-item:nth-child(8) .ones-select` | select | - |

## Instructions

### 1. 填写文本字段

使用 `fillTextField` 工具函数:

```javascript
function fillTextField(element, value) {
  const tagName = element.tagName.toLowerCase();

  // 获取对应的原生 setter
  const nativeSetter = Object.getOwnPropertyDescriptor(
    tagName === 'input' ? window.HTMLInputElement.prototype : window.HTMLTextAreaElement.prototype,
    'value'
  ).set;

  // 设置值并触发事件
  element.focus();
  nativeSetter.call(element, value);
  element.dispatchEvent(new Event('input', { bubbles: true }));
  element.dispatchEvent(new Event('change', { bubbles: true }));
  element.blur();
}

// 使用
const modal = document.querySelectorAll('.ones-modal')[0];
const titleInput = modal.querySelector('#summary');
fillTextField(titleInput, '新任务标题');
```

### 2. 通过标签查找字段

```javascript
function getFieldByLabel(labelText) {
  const formItems = document.querySelectorAll('.ones-form-item');
  for (const item of formItems) {
    const label = item.querySelector('label');
    if (label && label.textContent.includes(labelText)) {
      return item.querySelector('input, textarea, .ones-select');
    }
  }
  return null;
}

// 使用
const titleField = getFieldByLabel('Title');
fillTextField(titleField, '任务标题');
```

### 3. 完整表单填写工作流

- [ ] 定位 Create Task 弹窗
- [ ] 填写标题字段(必填)
- [ ] 填写描述(可选)
- [ ] 填写验收标准(可选)
- [ ] 选择负责人(可选)
- [ ] 验证填写结果

## 通过 AuViMa 执行

```bash
# 基础示例
uv run auvima exec-js "(function() {
  const modal = document.querySelectorAll('.ones-modal')[0];
  const titleInput = modal.querySelector('#summary');

  const setter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set;
  setter.call(titleInput, '自动填写的任务');
  titleInput.dispatchEvent(new Event('input', { bubbles: true }));

  return '标题已填写:' + titleInput.value;
})()" --return-value
```

## 技术要点

### 为什么使用原生 setter?

现代框架(React/Vue)会拦截属性赋值。直接 `element.value = xxx` 不会触发框架的数据绑定。

**解决方案**:通过 `Object.getOwnPropertyDescriptor` 获取原生 setter,直接调用底层方法。

### 必须触发的事件

- `input` - 输入过程中触发
- `change` - 值改变后触发

两者都需要设置 `{ bubbles: true }` 让事件冒泡到父组件。

### 下拉菜单的异步特性

ONES 下拉菜单是动态渲染的:

1. 点击 `.ones-select` 打开菜单
2. 异步加载选项到 `.ones-select-dropdown`
3. 点击目标选项

需要使用 `setTimeout` 或等待逻辑。

## 常见问题

### 填写后值消失?

**原因**:没有触发事件,框架未感知变化。

**解决**:确保使用了 原生 setter + 事件触发 的完整流程。

### 下拉菜单点不开?

**检查**:
- 元素是否可见:`element.offsetParent !== null`
- 尝试滚动到元素:`element.scrollIntoView()`

## 详细文档

- 完整字段列表和定位方法:[REFERENCE.md](REFERENCE.md)
- 更多使用示例:[EXAMPLES.md](EXAMPLES.md)