Python Selenium脚本首次find_element()调用失败求助
问题
自2023年10月8日起,Python Selenium脚本全部故障,首次执行find_element()时就无法定位用户名输入框。已尝试XPATH、ID等多种元素定位方式,Chrome版本为119.0.6045.9,ChromeDriver已更新至最新版本,但仍抛出如下错误:
File C:\ProgramData\anaconda3\Lib\site-packages\spyder_kernels\py3compat.py:356 in compat_exec exec(code, globals, locals) File c:\pythonautomation\chrobinsonnavisphere\navisphere_main.py:114 main() File c:\pythonautomation\chrobinsonnavisphere\navisphere_main.py:110 in main run_selenium() File c:\pythonautomation\chrobinsonnavisphere\navisphere_main.py:105 in run_selenium login_navisphere() File c:\pythonautomation\chrobinsonnavisphere\navisphere_main.py:69 in login_navisphere username_elem = browser.find_element(By.XPATH,'/html/body/form\[4\]/div/div\[2\]/div\[1\]/div/span\[2\]/input') #'//\*\[@id="OnlineLogin1_txUserName"\]') File C:\ProgramData\anaconda3\Lib\site-packages\selenium\webdriver\remote\webdriver.py:738 in find_element return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})\["value"\] File C:\ProgramData\anaconda3\Lib\site-packages\selenium\webdriver\remote\webdriver.py:344 in execute self.error_handler.check_response(response) File C:\ProgramData\anaconda3\Lib\site-packages\selenium\webdriver\remote\errorhandler.py:229 in check_response raise exception_class(message, screen, stacktrace) WebDriverException: unknown error: result.webdriverValue.value list is missing or empty in Runtime.callFunctionOn response (Session info: chrome=119.0.6045.9)
此前脚本已稳定运行一年,相关代码片段如下:
import keyring import time import datetime from datetime import date, timedelta from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains import os import shutil from bs4 import BeautifulSoup import re import pandas as pd from Navisphere_email_script import sendCsvFile today = date.today() year = today.year month = today.month day = today.day # maybe use the file server instead downloadPath = "C:\\PythonAutomation\\CHRobinsonNavisphere\\excel_files\\{}\\{}\\{}\\".format(year,month,day) if not os.path.exists(downloadPath): os.makedirs(downloadPath) #login using keyring servicename = 'chrobinson' username = 'genericusername' password = keyring.get_password(servicename, username) options = Options() # Fetch the centralized ChromeDriver path from the environment variable centralized_chromedriver_path = 'C:\\PythonAutomation\\chromedriver.exe' service = Service(executable_path=centralized_chromedriver_path) options.binary_location= 'C:\\Program Files\\Google\\Chrome Beta\\Application\\chrome.exe' #options.add_argument('--headless') options.add_argument('==no-sandbox') options.add_argument('--disable-dev-shm-usage') prefs = {"download.default_directory" : downloadPath} options.add_experimental_option("prefs", prefs) browser = webdriver.Chrome(service=service, options=options) def login_navisphere(): browser.get('https://navisphere.chrobinson.com/login.aspx') time.sleep(30) ### TTHIS IS THE ORIGINAL ONE, WITH AN ATTEMPT TO USE THE MORE EXPLICIT XPATH username_elem = browser.find_element(By.XPATH,'/html/body/form/div[4]/div/div[2]/div[1]/div/span[2]/input') #'//*[@id="OnlineLogin1_txUserName"]') #### HERE IS A SEPERATE ATTEMPT TO TRY TO CALL IT BY ID #username_elem = browser.find_element(By.ID, "OnlineLogin1_txUserName") username_elem.send_keys(username) password_elem = browser.find_element(by=By.XPATH, value='//*[@id="OnlineLogin1_txtPassword"]') password_elem.send_keys(password) login_elem = browser.find_element(by=By.XPATH, value='//*[@id="loginOKtaBtn"]') login_elem.click() time.sleep(15) return
解决方案
1. 修正Chrome启动参数错误
代码中options.add_argument('==no-sandbox')参数格式错误,应为--no-sandbox,多余的等号可能导致Chrome启动异常,影响元素定位逻辑。
2. 替换硬编码等待为显式等待
time.sleep(30)这类固定等待不可靠,改用Selenium显式等待确保元素加载完成后再操作:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def login_navisphere(): browser.get('https://navisphere.chrobinson.com/login.aspx') # 显式等待用户名输入框出现,最长等待20秒 username_elem = WebDriverWait(browser, 20).until( EC.presence_of_element_located((By.ID, "OnlineLogin1_txUserName")) ) username_elem.send_keys(username) password_elem = WebDriverWait(browser, 20).until( EC.presence_of_element_located((By.ID, "OnlineLogin1_txtPassword")) ) password_elem.send_keys(password) login_elem = WebDriverWait(browser, 20).until( EC.element_to_be_clickable((By.ID, "loginOKtaBtn")) ) login_elem.click() return
3. 检查Chrome Beta与ChromeDriver兼容性
你使用的是Chrome Beta版本,即便更新了ChromeDriver,Beta版仍可能存在兼容性问题。建议切换到Chrome正式版,并确保ChromeDriver版本与正式版完全匹配。
4. 验证元素定位器有效性
手动打开登录页面,用Chrome开发者工具(F12)确认元素IDOnlineLogin1_txUserName是否存在;若页面嵌套iframe,需先切换到对应iframe再定位:
# 示例:切换到指定iframe(替换为实际iframe的定位器) # WebDriverWait(browser, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID, "iframe_id")))
5. 更新Selenium版本
当前Selenium版本可能与Chrome 119不兼容,执行以下命令更新到最新版:
pip install --upgrade selenium
内容的提问来源于stack exchange,提问作者Kristofer
相关产品推荐
相关产品推荐

