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

Selenium新窗口管理问题:Origin平台登录代码无法操作新窗口

解决Selenium操作Origin登录新窗口的问题

我明白你遇到的困扰了——点击登录按钮弹出新窗口后,WebDriver还停留在原来的主窗口,自然没法操作新窗口里的元素。这是Selenium处理多窗口场景时的典型问题,咱们只需要手动切换到新窗口的句柄就行,给你一步步拆解解决方案:

核心问题原因

当点击Origin的登录按钮后,浏览器会生成一个新的窗口句柄(window handle),而Selenium默认只会聚焦在最初打开的那个窗口句柄上。想要操作新窗口,必须先切换到对应的句柄。

优化后的代码方案

另外提一句,你原来用的find_element_by_xpath方法已经被Selenium弃用了,建议改用find_element(By.XPATH, ...)的写法,同时把固定的time.sleep换成显式等待(更稳定,不会因为加载慢导致元素找不到)。下面是修改后的完整代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = Options()
options.binary_location = "C:/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe"
driver = webdriver.Chrome(options=options)
driver.get("https://www.origin.com/irl/en-us/store")

# 等待菜单按钮加载并点击
menu_button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//*[@id='shell']/section/div/nav/div/div[1]/div[2]"))
)
menu_button.click()

# 等待登录按钮加载并点击
sign_in_button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//div[@class='origin-cta-primary origin-telemetry-cta-primary']"))
)
sign_in_button.click()

# 等待新窗口出现,获取所有窗口句柄
WebDriverWait(driver, 10).until(lambda d: len(d.window_handles) > 1)
window_handles = driver.window_handles

# 切换到新窗口(新窗口的句柄是列表最后一个元素)
driver.switch_to.window(window_handles[-1])

# 在新窗口中操作账号密码
email_input = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.XPATH, "//input[@name='email']"))
)
email_input.send_keys("Deneme")

password_input = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.XPATH, "//input[@name='password']"))
)
password_input.send_keys("Deneme123")

login_btn = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//a[@id='logInBtn']"))
)
login_btn.click()

# 如果之后需要切回原窗口,可以用下面的代码
# driver.switch_to.window(window_handles[0])

关键修改点说明

  • 用WebDriverWait显式等待替代固定time.sleep:确保元素加载完成后再操作,避免因网络或页面加载慢导致的报错
  • 添加窗口句柄切换逻辑:等待新窗口出现后,获取所有句柄并切换到最新的那个
  • 替换弃用的元素定位方法:使用find_element(By.XPATH, ...)符合Selenium最新规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:42:53