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

Selenium无法向Google Finance组合框元素输入内容的问题排查

问题分析与修正方案

你的代码存在以下几个关键问题:

  • 硬编码sleep不可靠:固定时长的sleep()无法适配页面加载波动,元素未就绪时操作必然失败。
  • 定位器不稳定:依赖动态生成的class属性(Ax4B8 ZAGvjd)定位元素,这类属性会随页面更新变化,极易导致定位失效。
  • 未等待元素可交互:点击"Investment"后直接操作元素,未确保输入框已完全渲染并处于可输入状态。
  • 错误的元素定位:当前XPath可能选中的是输入框的容器而非实际输入控件,导致send_keys()无效果。
  • 异常捕获隐藏问题:except: pass会屏蔽所有错误信息,完全无法排查具体故障点。

修正后的代码实现:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
import argparse
from time import sleep

class GoogleFinanceAutomation:
    def __init__(self) -> None:
        self.driver = webdriver.Chrome()  # 若使用undetected-chromedriver,替换为uc.Chrome()即可
        self.driver.delete_all_cookies()
        self.wait = WebDriverWait(self.driver, 20)  # 统一设置显式等待超时时间

    def login(self, email, password):
        self.driver.get("https://accounts.google.com")
        # 输入邮箱
        email_input = self.wait.until(EC.visibility_of_element_located((By.NAME, 'identifier')))
        email_input.send_keys(email + Keys.ENTER)
        # 输入密码
        password_input = self.wait.until(EC.visibility_of_element_located((By.NAME, 'Passwd')))
        password_input.send_keys(password + Keys.ENTER)
        # 等待登录完成(可根据实际情况调整等待条件)
        self.wait.until(EC.url_contains("myaccount.google.com"))

    def navigate_to_portfolio(self, portfolio_url):
        self.driver.get(portfolio_url)
        # 点击"Investment"按钮,等待按钮可点击
        investment_btn = self.wait.until(EC.element_to_be_clickable((By.XPATH, '//span[text()="Investment"]')))
        investment_btn.click()
        # 调用添加股票方法
        self.add_investment("BP", 1, "2024-02-01", 100)
        # 可根据需要调整等待时间,方便查看结果
        sleep(10)
        self.driver.quit()

    def add_investment(self, symbol_name, qty, date, price):
        try:
            # 等待股票搜索输入框可交互,使用placeholder定位更稳定
            symbol_input = self.wait.until(EC.element_to_be_clickable((By.XPATH, '//input[@placeholder="Search for stocks, ETFs, mutual funds, etc."]')))
            symbol_input.click()
            # 输入股票代码并回车
            symbol_input.send_keys(symbol_name + Keys.ENTER)
            
            # 输入数量(根据页面实际元素调整定位器)
            qty_input = self.wait.until(EC.visibility_of_element_located((By.XPATH, '//input[@aria-label="Quantity"]')))
            qty_input.send_keys(str(qty))
            
            # 输入日期(注意格式需匹配页面要求)
            date_input = self.wait.until(EC.visibility_of_element_located((By.XPATH, '//input[@aria-label="Date"]')))
            date_input.send_keys(date)
            
            # 输入价格
            price_input = self.wait.until(EC.visibility_of_element_located((By.XPATH, '//input[@aria-label="Price per share"]')))
            price_input.send_keys(str(price))
            
            # 点击保存按钮(需根据实际元素调整)
            save_btn = self.wait.until(EC.element_to_be_clickable((By.XPATH, '//span[text()="Save"]')))
            save_btn.click()
            
        except Exception as e:
            # 打印错误信息便于调试
            print(f"操作出错: {str(e)}")
            # 可选:截图保存错误状态
            self.driver.save_screenshot("error_screenshot.png")

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-u", "--username", type=str, help="Google登录邮箱", required=True)
    parser.add_argument("-p", "--password", type=str, help="Google登录密码", required=True)
    parser.add_argument("-url", "--portfolio_url", type=str, help="投资组合页面链接", required=True)
    args = parser.parse_args()
    
    automation = GoogleFinanceAutomation()
    automation.login(args.username, args.password)
    automation.navigate_to_portfolio(args.portfolio_url)

关键修改说明:

  1. 统一使用显式等待:用WebDriverWait替代sleep(),确保元素就绪后再执行操作,大幅提升稳定性。
  2. 稳定的元素定位:改用placeholder、aria-label等静态属性定位元素,彻底避免依赖动态class。
  3. 完善异常处理:捕获具体异常并打印错误信息,方便调试,还可添加截图功能记录错误状态。
  4. 补充完整操作流程:添加了数量、日期、价格的输入示例,需根据Google Finance页面实际元素微调定位器。
  5. 登录状态验证:等待URL包含myaccount.google.com确保登录完成,避免后续操作提前执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:14:52