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

Selenium切换标签页报错:NoneType无find_element属性及交互异常

问题描述

我需要实现以下逻辑:当Excel中Mat列的数据以"S"开头(如S9335)时,将其替换为900开头(即9009335),在目标网站查询并提取NIT结果;若不以"S"开头则直接查询。编写Python代码后遇到两个错误,请求解决。

原始代码

options = Options()
options.add_argument("start-maximized")
webdriver_service = Service('C:\webdrivers\chromedriver.exe')
driver = webdriver.Chrome(service=webdriver_service, options=options)
websites = ['https://www.rues.org.co/RM','https://www.rues.org.co/ESAL']

Mat_column= 'Mat'
value='01'
excel_file_path=r'C:\Users\Hi\Documents\Project\output\164115.xlsx'

driver.get(websites[0])


df=pd.read_excel(excel_file_path, dtype=str)

NIT=[]

for i in df.index: 

    entry=df.loc[i]
   
    if entry[Mat_column].startswith('S'):

        new_entry=entry[Mat_column].replace('S','900')
        
        driver.execute_script("window.open('');")
        driver.switch_to.window(driver.window_handles[1])
        d1=driver.get(websites[1])

        cam = Select(d1.find_element(By.XPATH, '//*[@id="codCamara"]'))
        cam.select_by_value(value)

        driver.find_element(By.LINK_TEXT, 'Matrícula / Inscripción').click()

        time.sleep(3)
         
        mat = driver.find_element(By.XPATH,'//*[@id="txtSearchMat"]')
        consult = driver.find_element(By.XPATH,'//*[@id="btnConsultaMat"]')

        mat.send_keys(new_entry)
        consult.click()
        mat.send_keys(Keys.CONTROL + "a")

        try:
            nit = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="rmTable2"]/tbody/tr/td[3]'))).text
            NIT.append(nit)
        except:
            NIT.append("0")

    else:
        driver.execute_script("window.open('');")
        driver.switch_to.window(driver.window_handles[1])

        cam = Select(d1.find_element(By.XPATH, '//*[@id="codCamara"]'))
        cam.select_by_value(value)

        driver.find_element(By.LINK_TEXT, 'Matrícula / Inscripción').click()

        mat = driver.find_element(By.XPATH,'//*[@id="txtSearchMat"]')
        consult = driver.find_element(By.XPATH,'//*[@id="btnConsultaMat"]') 

        mat.send_keys(entry[Mat_column])
        consult.click()
        mat.send_keys(Keys.CONTROL + "a")

        try:
            nit = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="rmTable2"]/tbody/tr/td[3]'))).text
            NIT.append(nit)
        except:
            NIT.append("0")

DATANIT=pd.DataFrame(
    {   
        'NIT' : NIT,
    }
)

print(DATANIT)

遇到的错误

第一个错误

运行代码时触发:

cam = Select(d1.find_element(By.XPATH, '//*[@id="codCamara"]'))
                    ^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'find_element'

第二个错误

将代码中的d1替换为driver后,出现新错误:

DevTools listening on ws://127.0.0.1:52945/devtools/browser/4f3a5ee5-3ad5-4ab0-9477-65e3a8d2302f
Traceback (most recent call last):
  File "c:\Users\Hi\Documents\Alaska\alaska_validator\validacion_nit_vacios.py", line 67, in <module>
    cam.select_by_value(value)
  File "C:\Users\Hi\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\support\select.py", line 76, in select_by_value
    self._set_selected(opt)
  File "C:\Users\Hi\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\support\select.py", line 211, in _set_selected
    option.click()
  File "C:\Users\Hi\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\remote\webelement.py", line 94, in click  
    self._execute(Command.CLICK_ELEMENT)
  File "C:\Users\Hi\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\remote\webelement.py", line 403, in _execute
    return self._parent.execute(command, params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Hi\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 440, in execute    self.error_handler.check_response(response)
  File "C:\Users\Hi\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 245, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable: Element is not currently visible and may not be manipulated
  (Session info: chrome=113.0.5672.93)
Stacktrace:
Backtrace:
        GetHandleVerifier [0x00808893+48451]
        (No symbol) [0x0079B8A1]
        (No symbol) [0x006A5058]
        (No symbol) [0x006A83F1]
        (No symbol) [0x006A9631]
        (No symbol) [0x006A96D0]
        (No symbol) [0x006D2DE0]
        (No symbol) [0x006C9E74]
        (No symbol) [0x006EA2BC]
        (No symbol) [0x006C9586]
        (No symbol) [0x006EA614]
        (No symbol) [0x006FC482]
        (No symbol) [0x006EA0B6]
        (No symbol) [0x006C7E08]
        (No symbol) [0x006C8F2D]
        GetHandleVerifier [0x00A68E3A+2540266]
        GetHandleVerifier [0x00AA8959+2801161]
        GetHandleVerifier [0x00AA295C+2776588]
        GetHandleVerifier [0x00892280+612144]
        (No symbol) [0x007A4F6C]
        (No symbol) [0x007A11D8]
        (No symbol) [0x007A12BB]
        (No symbol) [0x00794857]
        BaseThreadInitThunk [0x761500C9+25]
        RtlGetAppContainerNamedObjectPath [0x775A7B4E+286]
        RtlGetAppContainerNamedObjectPath [0x775A7B1E+238]

解决方案

1. 修复第一个错误:d1为NoneType

driver.get()方法没有返回值,所以d1 = driver.get(websites[1])会让d1等于None。直接删除d1=,改为:

driver.get(websites[1])

2. 修复第二个错误:元素不可交互

这个错误是因为元素未加载完成、被遮挡或不在可见区域,需做以下优化:

(1)初始化显式等待对象

替换time.sleep()为Selenium显式等待,确保元素加载完成后再操作,先添加初始化代码:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)  # 最多等待10秒

(2)等待元素可交互后再操作

修改下拉框选择的代码,等待元素可点击:

cam_select = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="codCamara"]')))
cam = Select(cam_select)
cam.select_by_value(value)

(3)修复标签页重复创建问题

循环中每次新建标签页会导致window_handles索引失效,查询完成后关闭当前标签页并切回原页面:

# 在每个分支的try/finally块中添加
driver.close()
driver.switch_to.window(driver.window_handles[0])

(4)优化输入框清空逻辑

Keys.CONTROL + "a"仅选中内容,需改为clear()清空输入框:

mat.clear()
mat.send_keys(要输入的内容)

优化后的完整代码

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select, WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
import pandas as pd

options = Options()
options.add_argument("start-maximized")
webdriver_service = Service('C:\webdrivers\chromedriver.exe')
driver = webdriver.Chrome(service=webdriver_service, options=options)
wait = WebDriverWait(driver, 10)

websites = ['https://www.rues.org.co/RM','https://www.rues.org.co/ESAL']
Mat_column= 'Mat'
value='01'
excel_file_path=r'C:\Users\Hi\Documents\Project\output\164115.xlsx'

df=pd.read_excel(excel_file_path, dtype=str)
NIT=[]

for i in df.index: 
    entry=df.loc[i]
    # 统一处理查询内容
    current_entry = entry[Mat_column].replace('S','900') if entry[Mat_column].startswith('S') else entry[Mat_column]
    
    # 新建标签页并切换
    driver.execute_script("window.open('');")
    driver.switch_to.window(driver.window_handles[1])
    driver.get(websites[1])
    
    try:
        # 等待下拉框并选择
        cam_select = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="codCamara"]')))
        cam = Select(cam_select)
        cam.select_by_value(value)
        
        # 点击查询入口
        wait.until(EC.element_to_be_clickable((By.LINK_TEXT, 'Matrícula / Inscripción'))).click()
        
        # 等待输入框并输入内容
        mat = wait.until(EC.visibility_of_element_located((By.XPATH,'//*[@id="txtSearchMat"]')))
        mat.clear()
        mat.send_keys(current_entry)
        
        # 点击查询按钮
        consult = wait.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="btnConsultaMat"]')))
        consult.click()
        
        # 提取NIT结果
        nit = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="rmTable2"]/tbody/tr/td[3]'))).text
        NIT.append(nit)
    except Exception as e:
        print(f"处理条目 {current_entry} 出错: {str(e)}")
        NIT.append("0")
    finally:
        # 关闭当前标签页并切回原页面
        driver.close()
        driver.switch_to.window(driver.window_handles[0])

# 生成结果并输出
DATANIT=pd.DataFrame({'NIT' : NIT})
print(DATANIT)
# 关闭浏览器
driver.quit()

内容的提问来源于stack exchange,提问作者Al.Vioky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:47:01