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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:03:10