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
相关产品推荐
相关产品推荐

