如何完全解构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
相关产品推荐
相关产品推荐

