精易论坛

标题: 精易WEB浏览器运行JS代码问题。 [打印本页]

作者: Jason220    时间: 2025-6-16 19:48
标题: 精易WEB浏览器运行JS代码问题。
我用浏览器的控制台运行JS,比如:document.querySelector('#txtName').value='123',能看到相应项目被修改了。但是使用精易WEB浏览器运行这段代码就不行?
.版本 2
.支持库 wke
.支持库 spec

.子程序 _按钮_JS执行_被单击
.局部变量 es, 整数型
.局部变量 vl, 长整数型

es = JS.取JS执行状态 (精易Web浏览器1.取WebView ())
vl = JS.运行JS_值对象 (精易Web浏览器1.取WebView (), “document.querySelector('#txtName').value='123'”)
调试输出 (JS.取执行结果到文本 (es, vl))


我不知道是不是框架的问题?(在该界面下有很多个input,但是通过cha询元素都不能cha询到。不知道问题出在哪里?)
我在另一个页面运行相似的代码就可以运行。





作者: 熬夜    时间: 2025-6-16 20:00
es =JS.取JS执行状态 (精易Web浏览器1.取WebView ())
表达式 = “document.querySelector('#txtName').value='123'”
值对象 = js.计算表达式_值对象 (es, 表达式)
调试输出 (js.取执行结果到文本 (es, 值对象))
作者: Jason220    时间: 2025-6-17 21:12
熬夜 发表于 2025-6-16 20:00
es =JS.取JS执行状态 (精易Web浏览器1.取WebView ())
表达式 = “document.querySelector('#txtName').va ...

我在前面加了return 也不行。感觉他不能cha询到这个('#txtName')input
作者: appleqc    时间: 2025-6-18 00:09
### 精易WEB浏览器JS执行问题分析

你遇到的问题是精易WEB浏览器(wke引擎)与浏览器控制台执行JS的差异,这是一个常见的自动化操作难题。我来分析可能的原因和解决方案:


### 问题原因分析

1. **iframe/框架嵌套问题**:
   - 如果目标元素位于iframe中,需要先切换到对应的iframe上下文
   - 浏览器控制台默认在顶层窗口,而精易Web浏览器需要显式指定iframe

2. **页面加载状态问题**:
   - 代码执行时页面可能尚未完全加载
   - 精易Web浏览器的加载状态判断与标准浏览器不同

3. **JS执行上下文问题**:
   - wke引擎的JS执行环境可能与标准浏览器存在差异
   - 部分DOM API可能不被完全支持或实现方式不同

4. **选择器匹配问题**:
   - 元素ID可能不唯一或动态生成
   - 页面可能使用Shadow DOM等特殊结构


### 解决方案

#### 1. 确保页面完全加载

```易语言
.版本 2
.支持库 wke
.支持库 spec

.子程序 _按钮_JS执行_被单击
.局部变量 等待时间, 整数型
.局部变量 es, 整数型
.局部变量 vl, 长整数型

    // 等待页面加载完成
    等待时间 = 0
    循环判断 (等待时间 < 10000)  // 最多等待10秒
        如果 (精易Web浏览器1.取加载状态 () = #WKE_LOAD_STATE_COMPLETED)
            跳出循环
        结束
        延时 (100)
        等待时间 = 等待时间 + 100
    结束
   
    // 执行JS
    es = JS.取JS执行状态 (精易Web浏览器1.取WebView ())
    vl = JS.运行JS_值对象 (精易Web浏览器1.取WebView (), "document.querySelector('#txtName').value='123'")
    调试输出 (JS.取执行结果到文本 (es, vl))
.子程序尾
```

#### 2. 处理iframe嵌套

```易语言
.版本 2
.支持库 wke
.支持库 spec

.子程序 执行JS_带iframe支持, 逻辑型
.参数 js代码, 文本型
.参数 iframeSelector, 文本型, 可空
.局部变量 es, 整数型
.局部变量 vl, 长整数型
.局部变量 iframeCount, 整数型
.局部变量 i, 整数型
.局部变量 iframe, 整数型
.局部变量 执行结果, 文本型

    es = JS.取JS执行状态 (精易Web浏览器1.取WebView ())
   
    如果 (iframeSelector = "")
        // 直接在主文档执行
        vl = JS.运行JS_值对象 (精易Web浏览器1.取WebView (), js代码)
    否则
        // 先查找iframe
        iframeCount = 精易Web浏览器1.取框架数量 ()
        
        循环 (i = 0; i < iframeCount; i + 1)
            iframe = 精易Web浏览器1.取框架 (i)
            
            // 检查iframe是否匹配选择器
            vl = JS.运行JS_值对象 (iframe, "document.querySelector('" + iframeSelector + "') !== null")
            执行结果 = JS.取执行结果到文本 (es, vl)
            
            如果 (执行结果 = "true")
                // 在匹配的iframe中执行JS
                vl = JS.运行JS_值对象 (iframe, js代码)
                返回 (真)
            结束
        结束
        
        调试输出 ("未找到匹配的iframe")
        返回 (假)
    结束
   
    调试输出 (JS.取执行结果到文本 (es, vl))
    返回 (真)
.子程序尾

.子程序 _按钮_JS执行_被单击
    执行JS_带iframe支持 ("document.querySelector('#txtName').value='123'", "")
.子程序尾
```

#### 3. 使用更健壮的选择器

```易语言
.版本 2
.支持库 wke
.支持库 spec

.子程序 执行JS_健壮选择器, 逻辑型
.参数 js代码, 文本型
.局部变量 es, 整数型
.局部变量 vl, 长整数型
.局部变量 尝试次数, 整数型
.局部变量 执行结果, 文本型

    es = JS.取JS执行状态 (精易Web浏览器1.取WebView ())
    尝试次数 = 0
   
    // 尝试多次,确保元素存在
    循环判断 (尝试次数 < 5)
        // 先检查元素是否存在
        vl = JS.运行JS_值对象 (精易Web浏览器1.取WebView (), "document.querySelector('#txtName') !== null")
        执行结果 = JS.取执行结果到文本 (es, vl)
        
        如果 (执行结果 = "true")
            // 元素存在,执行JS
            vl = JS.运行JS_值对象 (精易Web浏览器1.取WebView (), js代码)
            调试输出 (JS.取执行结果到文本 (es, vl))
            返回 (真)
        结束
        
        延时 (500)
        尝试次数 = 尝试次数 + 1
    结束
   
    调试输出 ("元素未找到或加载超时")
    返回 (假)
.子程序尾

.子程序 _按钮_JS执行_被单击
    执行JS_健壮选择器 ("document.querySelector('#txtName').value='123'")
.子程序尾
```

#### 4. 替代方案:使用模拟输入

```易语言
.版本 2
.支持库 wke
.支持库 spec

.子程序 模拟输入文本, 逻辑型
.参数 元素选择器, 文本型
.参数 输入文本, 文本型
.局部变量 es, 整数型
.局部变量 vl, 长整数型
.局部变量 元素, 整数型

    es = JS.取JS执行状态 (精易Web浏览器1.取WebView ())
   
    // 查找元素
    vl = JS.运行JS_值对象 (精易Web浏览器1.取WebView (), "document.querySelector('" + 元素选择器 + "')")
    元素 = JS.取执行结果到整数 (es, vl)
   
    如果 (元素 = 0)
        调试输出 ("元素未找到")
        返回 (假)
    结束
   
    // 聚焦元素
    JS.运行JS_值对象 (精易Web浏览器1.取WebView (), "document.querySelector('" + 元素选择器 + "').focus()")
    延时 (100)
   
    // 模拟按键输入
    发送按键 (取键代码 (输入文本))
   
    返回 (真)
.子程序尾

.子程序 _按钮_模拟输入_被单击
    模拟输入文本 ("#txtName", "123")
.子程序尾
```


### 调试建议

1. 在精易Web浏览器中执行简单的JS测试:
   ```javascript
   document.title = "测试成功";
   alert("Hello from wke");
   ```

2. 使用`console.log`在页面中输出调试信息:
   ```javascript
   var element = document.querySelector('#txtName');
   console.log('元素是否存在:', element !== null);
   if (element) {
     console.log('元素类型:', element.tagName);
     element.value = '123';
   }
   ```

3. 在精易Web浏览器中启用开发者工具:
   ```易语言
   精易Web浏览器1.启用调试模式 (真)
   ```

4. 使用更具体的选择器,例如:
   ```javascript
   document.querySelector('input[name="txtName"]').value = '123';
   ```


### 总结

通过以上方法,你应该能够解决精易Web浏览器中JS执行失败的问题。关键是要考虑iframe嵌套、页面加载状态、元素存在性检查等因素。如果仍然有问题,可能需要进一步分析目标页面的具体结构和特性。
作者: Jason220    时间: 2025-6-22 19:30
appleqc 发表于 2025-6-18 00:09
### 精易WEB浏览器JS执行问题分析

你遇到的问题是精易WEB浏览器(wke引擎)与浏览器控制台执行JS的差异,这 ...

谢谢你  写了这么多。
我发现原因了,是frameset框架问题,查看源代码-根本不能发现源代码。提示浏览器不能加载该框架。我找到了内层框架的网址,登陆后,再登陆内层框架的网址发现可以运行,并可以填表,暂时可以解决。
作者: yuxuanju    时间: 2025-6-30 21:34
太复杂了,学不会啊。




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4