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

Selenium登录路由器跳转后无法定位元素报NoSuchElementException

问题描述

需要开发一款简易自动化程序,运行时自动启动Chrome浏览器访问路由器设置页面,可根据指令调整互联网带宽速率。开发环境为Python 3.9,使用Selenium库实现,初始编写代码如下:

import time

from selenium import *
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains

usr = "admin"
psr = "Administrator"

url = "http://192.168.1.1/html/content1.asp"
url2 = "http://192.168.1.1/html/content1.asp"


s = Service("D:\chromedriver.exe")
driver = webdriver.Chrome(service=s)


driver.get(url)
driver.find_element(by=By.NAME, value="Username").send_keys(usr)
# driver.find_element_by_name("Username").send_keys(usr)
driver.find_element(by=By.NAME, value="Password").send_keys(psr)
# driver.find_element_by_name("Password").send_keys(psr)
driver.find_element(by=By.ID, value="btnLogin").click()
# driver.find_element_by_id("btnLogin").click()
driver.find_element(by=By.CSS_SELECTOR, value="#link_Admin_1").click()

代码可顺利完成路由器登录操作,自动跳转到登录后页面,但执行到最后一行点击#link_Admin_1元素的代码时持续抛出异常:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"#link_Admin_1"}

已知信息:

  • 路由器管理页初始访问地址为192.168.1.1,登录成功后跳转地址为192.168.1.1/html/content1.asp
  • 已尝试ID、CSS_SELECTOR、CLASS_NAME等多种元素定位方式,均无法找到目标元素
  • 登录后页面的静态源码中未展示任何frame内容,仅能通过Chrome浏览器的检查功能查看到对应frame及其内部元素
  • 相关运行截图:
故障原因

Selenium默认只能定位当前顶层HTML文档内的元素,无法直接读取嵌套在iframe内的页面元素。该问题属于路由器后台页面通过JS动态渲染iframe加载功能菜单,静态源码里不会直接展示iframe标签,只有页面渲染完成后才能在开发者工具中看到iframe结构,未切换到iframe上下文时自然无法定位到内部的#link_Admin_1元素。

修复方案
  1. 登录操作完成后添加等待逻辑,给路由器页面留出足够的渲染加载时间,避免页面未加载完成就执行元素查找
  2. 定位到承载功能菜单的iframe元素,将Selenium的操作上下文切换到该iframe内部
  3. 上下文切换完成后,再定位目标元素执行点击操作
  4. 如果后续需要操作iframe外的主页面元素,调用driver.switch_to.default_content()即可切回顶层文档

如果iframe没有固定的ID、name属性,可以直接通过标签名获取页面所有iframe,按索引切换即可,家用路由器后台的iframe数量通常不超过2个,排查成本很低。

修复后的参考代码如下:

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

usr = "admin"
psr = "Administrator"
url = "http://192.168.1.1/html/content1.asp"

s = Service("D:\chromedriver.exe")
driver = webdriver.Chrome(service=s)
wait = WebDriverWait(driver, 10) # 设置最长10秒显式等待

driver.get(url)
# 执行登录
driver.find_element(by=By.NAME, value="Username").send_keys(usr)
driver.find_element(by=By.NAME, value="Password").send_keys(psr)
driver.find_element(by=By.ID, value="btnLogin").click()

# 等待iframe加载完成,切换到iframe
wait.until(EC.frame_to_be_available_and_switch_to_it((By.TAG_NAME, "iframe")))
# 如果上面这行切换后还是找不到元素,把上面的切换代码替换成下面两行,挨个试iframe索引
# iframes = driver.find_elements(By.TAG_NAME, "iframe")
# driver.switch_to.frame(iframes[1]) # 索引从0开始试,0不对就换1

# 定位目标元素点击
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#link_Admin_1"))).click()

# 后续操作完如果要切回主页面,执行下面这行
# driver.switch_to.default_content()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:54:15