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

Selenium循环发送Outlook邮件时第二次无法定位收件人元素问题

问题分析与解决方案

核心问题

第二次循环时,虽能定位到「To」栏元素,但该元素未真正获得输入焦点,且之前未释放的Ctrl/Enter按键会干扰后续输入;同时原代码依赖的动态类名(如UKx9j)可能随Outlook页面更新失效。

具体修复方案

1. 确保「To」栏可交互并激活输入

将元素等待条件从presence_of_element_located改为element_to_be_clickable,先点击激活「To」栏再输入收件人,同时移除不稳定的动态类名依赖:

to = WebDriverWait(driver, 100).until(EC.element_to_be_clickable((By.XPATH, "//div[@aria-label='To']")))
to.click()  # 强制激活输入状态
to.send_keys('mail@gmail.com')

2. 修复Ctrl+Enter的按键释放逻辑

之前只按下按键未释放,会导致后续输入异常,需补充key_up操作:

ActionChains(driver) \
    .key_down(Keys.CONTROL) \
    .send_keys(Keys.ENTER) \
    .key_up(Keys.ENTER) \
    .key_up(Keys.CONTROL) \
    .perform()

3. 等待邮件发送完成并回到主界面

每次发送后,等待新建邮件窗口关闭,确保主界面状态稳定再进入下一次循环:

# 等待「To」栏元素消失,确认邮件窗口关闭
WebDriverWait(driver, 100).until(EC.invisibility_of_element_located((By.XPATH, "//div[@aria-label='To']")))
time.sleep(1)  # 额外等待主界面加载完成

修改后的完整代码

def send_mail():
    driver.get('https://outlook.live.com/mail/0/')
    for i in range(10):
        # 等待并点击「New mail」按钮
        new_mail_button = WebDriverWait(driver, 100).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='New mail']")))
        new_mail_button.click()
        
        # 处理「To」栏:激活后输入收件人
        to = WebDriverWait(driver, 100).until(EC.element_to_be_clickable((By.XPATH, "//div[@aria-label='To']")))
        to.click()
        to.send_keys('mail@gmail.com')

        # 填写邮件主题(添加序号区分不同邮件)
        subject = WebDriverWait(driver, 100).until(EC.element_to_be_clickable((By.XPATH, "//input[@aria-label='Add a subject']")))
        subject.send_keys(f'demo - 第{i+1}封')

        # 填写邮件内容
        mail = WebDriverWait(driver, 100).until(EC.element_to_be_clickable((By.XPATH, "(//div[@class='elementToProof'])[1]")))
        mail.send_keys('This is a demo mail sent by a machine.')

        # 发送邮件,确保按键完全释放
        ActionChains(driver) \
            .key_down(Keys.CONTROL) \
            .send_keys(Keys.ENTER) \
            .key_up(Keys.ENTER) \
            .key_up(Keys.CONTROL) \
            .perform()

        # 等待邮件窗口关闭,回到主界面
        WebDriverWait(driver, 100).until(EC.invisibility_of_element_located((By.XPATH, "//div[@aria-label='To']")))
        time.sleep(1)

额外提示

  • 尽量用Selenium显式等待(WebDriverWait)替代time.sleep(),提升脚本稳定性;
  • 如果Outlook页面DOM更新导致定位失效,可尝试用CSS选择器(如[aria-label="To"])替代XPath,兼容性更强。

内容的提问来源于stack exchange,提问作者Eugène-René

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:53:09