You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何完全解构JS嵌套对象,解决Selenium返回属性访问报undefined问题

问题根因
  • driver.findElements() 方法本身返回Promise,未等待Promise执行完成就直接访问返回值属性,拿到的是pending状态的Promise而非实际的WebElement数组
  • WebElement下的driver_.session_本身是包裹了Session对象的Promise,直接访问pending状态Promise的caps_属性必然返回undefined。控制台打印时会自动展示Promise resolve后的最终值,和代码执行时的实时访问逻辑不一致,因此会出现控制台能看到属性、代码访问返回undefined的情况。
正确获取方案

使用async/await逐层处理所有Promise即可,修正后的代码如下:

let {Builder, By} = require('selenium-webdriver');

(async function test(){
    const driver = await new Builder().forBrowser('firefox').build();
    try {
        await driver.get('https://www.betika.com/');
        // 等待获取实际的WebElement数组
        const elementList = await driver.findElements(By.css('.match'));
        for (const element of elementList) {
            // 等待session_的Promise执行完成,拿到实际的Session对象
            const session = await element.driver_.session_;
            // 此时可正常访问深层属性
            console.log(session.caps_);
            console.log(session.id_);
        }
    } catch (err) {
        console.error('执行出错', err);
    } finally {
        await driver.quit();
    }
})();
额外注意事项

不建议直接访问Selenium内部下划线开头的私有属性(比如driver_、session_、caps_),这类属性属于Selenium内部实现,版本迭代时可能会被修改或删除,官方提供了公开API获取会话信息,直接调用await driver.getSession()即可拿到Session对象,不需要从WebElement里逐层取私有属性,代码稳定性更高:

// 官方公开API获取会话信息示例
const session = await driver.getSession();
console.log(session.getId());
console.log(session.getCapabilities());

内容的提问来源于stack exchange,提问作者Emmanuel Owino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:15:00