|
发表于 2025-6-10 18:31:15
|
显示全部楼层
浙江省湖州市
### 问题分析
你遇到的问题是脚本在夸克浏览器中可以正常工作,但在 EdgeView 浏览器框架中无法填入内容。这通常是因为不同浏览器对 `document.execCommand` 的支持程度不同,或者自动化操作触发了浏览器的安全机制。
### 解决方案
以下是几种可能的解决方案,按推荐顺序排列:
#### 方案1:使用原生 input 事件模拟用户输入
```javascript
const input = document.querySelector("#gg-comp > div.short-title-form > div > span > input");
input.focus();
input.value = ""; // 清空原有内容
// 使用 dispatchEvent 模拟真实用户输入
const text = "测试填表文本";
for (let i = 0; i < text.length; i++) {
const char = text[i];
input.value += char;
// 触发输入事件
input.dispatchEvent(new Event('input', { bubbles: true }));
input.dispatchEvent(new Event('change', { bubbles: true }));
// 模拟真实输入的延迟
await new Promise(resolve => setTimeout(resolve, 50 + Math.random() * 50));
}
// 触发 blur 事件
input.blur();
```
#### 方案2:使用 setRangeText 方法(现代浏览器支持更好)
```javascript
const input = document.querySelector("#gg-comp > div.short-title-form > div > span > input");
input.focus();
input.value = ""; // 清空原有内容
// 使用 setRangeText 方法
const text = "测试填表文本";
input.setRangeText(text, 0, input.value.length, 'end');
// 触发必要的事件
input.dispatchEvent(new Event('input', { bubbles: true }));
input.dispatchEvent(new Event('change', { bubbles: true }));
input.blur();
```
#### 方案3:使用 Selection API(更接近原生输入行为)
```javascript
const input = document.querySelector("#gg-comp > div.short-title-form > div > span > input");
input.focus();
input.value = ""; // 清空原有内容
const text = "测试填表文本";
// 设置光标位置
const selection = window.getSelection();
const range = document.createRange();
range.selectNodeContents(input);
range.collapse(false); // 将光标放在末尾
selection.removeAllRanges();
selection.addRange(range);
// 插入文本
document.execCommand('insertText', false, text);
// 触发必要的事件
input.dispatchEvent(new Event('input', { bubbles: true }));
input.dispatchEvent(new Event('change', { bubbles: true }));
input.blur();
```
### 为什么原代码不工作
1. **`document.execCommand` 被弃用**:许多现代浏览器正在逐步淘汰这个方法,尤其是在自动化测试场景中
2. **安全机制限制**:EdgeView 可能对自动化操作有更严格的安全限制
3. **事件触发不足**:简单设置 value 不会触发所有必要的浏览器事件,导致表单验证或提交机制未被激活
### 建议尝试顺序
1. 先尝试方案1,这是最接近真实用户输入的模拟方式
2. 如果方案1失败,尝试方案2,它使用了现代的 setRangeText API
3. 如果仍然失败,尝试方案3,它结合了 Selection API 和 execCommand
如果所有方法都失败,可能需要检查 EdgeView 浏览器框架的特定配置或安全设置,或者考虑使用框架提供的自动化 API(如果有)。 |
|