You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动