如何在Selenium JS中获取子节点数量?优化网页爬取代码
解决Selenium JS中动态获取子节点数量的问题
我懂你现在的困扰——硬编码循环范围太死板,一旦教师数量变动代码直接失效。其实在Selenium JavaScript里,你完全可以通过动态获取节点数量来解决这个问题,完美适配新增的教师条目,下面给你具体的实现思路和代码:
核心思路:先获取所有元素再遍历
不用再纠结循环的起始和结束值,我们可以先定位到目标<tbody>,然后直接获取它下面所有的<tr>元素,通过元素数组的长度来动态确定遍历范围,这样不管新增多少教师都能自动适配。
代码实现(两种写法可选)
写法1:Promise链式调用
// 初始化教师姓名列表 let listOfFaculties = []; // 先定位到目标tbody元素(请根据实际页面结构调整定位器,比如xpath或css选择器) driver.findElement(By.css("tbody")) .then(tbodyElement => { // 获取当前tbody下所有的tr子元素 return tbodyElement.findElements(By.css("tr")); }) .then(trElements => { // 遍历所有tr元素,提取姓名 return Promise.all(trElements.map(trElement => { // 这里需要根据页面实际结构,定位到tr里存储教师姓名的元素(比如第一个td) return trElement.findElement(By.css("td:first-child")) .then(nameEl => nameEl.getText()) .then(name => { listOfFaculties.push(name); return name; }); })); }) .then(() => { console.log("教师姓名列表:", listOfFaculties); console.log("教师总人数:", listOfFaculties.length); }) .catch(err => { console.error("获取教师信息出错:", err); });
写法2:async/await(更简洁易读)
async function fetchFacultyNames() { let listOfFaculties = []; try { // 定位目标tbody const tbodyEl = await driver.findElement(By.css("tbody")); // 获取tbody下所有tr元素 const trElements = await tbodyEl.findElements(By.css("tr")); // 遍历每个tr提取姓名 for (const tr of trElements) { const nameEl = await tr.findElement(By.css("td:first-child")); const name = await nameEl.getText(); listOfFaculties.push(name); } console.log("教师姓名列表:", listOfFaculties); console.log("教师总人数:", listOfFaculties.length); return listOfFaculties; } catch (err) { console.error("获取教师信息失败:", err); throw err; } } // 调用函数 fetchFacultyNames();
注意事项
- 请根据你爬取页面的实际HTML结构,调整
By.css("tbody")、By.css("td:first-child")这类定位器,确保能精准找到目标元素。 - Selenium JS的操作大多是异步的,所以一定要用Promise或async/await处理,避免出现未获取到元素就执行后续代码的问题。
内容的提问来源于stack exchange,提问作者morty
相关产品推荐
相关产品推荐

