Node.js中使用Selenium登录后无法跳转成绩页面的解决方法
解决Selenium登录大学官网后无法定位元素及进入成绩页的问题
我想要爬取大学官网的成绩信息,使用Selenium工具尝试登录该官网,但登录成功后无法进入“成绩页面”,同时出现元素定位失败的错误。以下是我的代码:
var webdriver = require('selenium-webdriver'); var chrome = require('selenium-webdriver/chrome'); var driver = new webdriver.Builder().forBrowser('chrome').build(); var hisnet = "https://hisnet.handong.edu/login/login.php"; driver.get(hisnet); var By = webdriver.By; driver.findElement(By.name('id')).sendKeys('something'); driver.sleep(4000); driver.findElement(By.name('password')).sendKeys('something'); driver.sleep(4000); driver.findElement(By.xpath('//input[@ src="/2012_images/intro/btn_login.gif"]')).click(); // below code is not working as my think. driver.sleep(10000); driver.get("https://hisnet.handong.edu/haksa/record/HREC110M.php");
同时出现如下错误信息:
(node:16184) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): NoSuchElementError: no such element: Unable to locate element: {"method":"css selector","selector":"*[name=\"id\"]"} (Session info: chrome=65.0.3325.162) (Driver info: chromedriver=2.36.540470 (e522d04694c7ebea4ba8821272dbef4f9b818c91),platform=Windows NT 10.0.16299 x86_64) (node:16184) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. (node:16184) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): NoSuchElementError: no such element: Unable to locate element: {"method":"xpath","selector":"//input[@ src=\"/2012_images/intro/btn_login.gif\"]"} (Session info: chrome=65.0.3325.162) (Driver info: chromedriver=2.36.540470 (e522d04694c7ebea4ba8821272dbef4f9b818c91),platform=Windows NT 10.0.16299 x86_64) (node:16184) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): NoSuchElementError: no such element: Unable to locate element: {"method":"css selector","selector":"*[name=\"password\"]"} (Session info: chrome=65.0.3325.162) (Driver info: chromedriver=2.36.540470 (e522d04694c7ebea4ba8821272dbef4f9b818c91),platform=Windows NT 10.0.16299 x86_64)
问题分析与解决方案
1. 核心问题拆解
你遇到的NoSuchElementError和页面跳转失败,主要有两个原因:
- 固定的
driver.sleep()不可靠:页面加载速度受网络影响,要么加载没完成就去查找元素,要么浪费多余时间; - 元素定位器存在小错误:登录按钮的XPath里
@ src多了个空格,这会导致定位失败; - 异步操作未处理:Selenium的所有操作都是Promise,未处理异常就会抛出警告。
2. 替换固定等待为显式等待
显式等待是Selenium的最佳实践——它会等待元素可交互后再执行操作,比固定等待灵活得多。同时修正定位器的空格问题,重构代码如下:
var webdriver = require('selenium-webdriver'); var chrome = require('selenium-webdriver/chrome'); const { until } = webdriver; async function loginAndAccessGrades() { let driver; try { driver = new webdriver.Builder().forBrowser('chrome').build(); await driver.get("https://hisnet.handong.edu/login/login.php"); const By = webdriver.By; // 等待用户名输入框加载完成并输入内容 const usernameInput = await driver.wait(until.elementLocated(By.name('id')), 10000); await usernameInput.sendKeys('something'); // 等待密码输入框加载完成并输入内容 const passwordInput = await driver.wait(until.elementLocated(By.name('password')), 10000); await passwordInput.sendKeys('something'); // 修正XPath的空格问题,等待登录按钮可点击后点击 const loginBtn = await driver.wait(until.elementLocated(By.xpath('//input[@src="/2012_images/intro/btn_login.gif"]')), 10000); await loginBtn.click(); // 等待登录成功(检测URL变化),再跳转成绩页面 await driver.wait(until.urlContains('hisnet.handong.edu'), 15000); await driver.get("https://hisnet.handong.edu/haksa/record/HREC110M.php"); // 这里可以继续添加成绩页的爬取逻辑 } catch (error) { console.error("操作出错:", error); } finally { if (driver) { await driver.quit(); // 确保浏览器关闭 } } } loginAndAccessGrades();
3. 额外检查点
- 会话验证:如果跳转成绩页后仍无法访问,可能是官网有会话验证机制(比如需要从首页入口进入,而非直接URL跳转),可以尝试登录后先点击成绩页面的导航按钮,而非直接
driver.get(); - ChromeDriver版本:你的Chrome版本65搭配ChromeDriver2.36是匹配的,但后续浏览器更新时,要保证Driver版本与浏览器版本对应;
- iframe检查:如果登录页的输入框嵌套在
iframe里,需要先切换到iframe再查找元素:await driver.switchTo().frame('iframe-id')。
内容的提问来源于stack exchange,提问作者molamola




