Selenium 第二次找不到元素

selenium can't find the element for the second time

提问人:Eugène-René 提问时间:8/13/2023 更新时间:8/14/2023 访问量:41

问:

当使用 selenium 在 for 循环中发送 n 封电子邮件时,它第一次和第二次都非常出色,它成功地单击了按钮,写下了邮件和主题,但错过了“收件人”部分。

'def send_mail(): driver.get('https://outlook.live.com/mail/0/')

for i in range(10):
    new_mail_button = WebDriverWait(driver, 100).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='New mail']")))
    new_mail_button.click()
    
    to = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.XPATH, "//div[@class='UKx9j']//div[@aria-label='To']")))
    to.send_keys('[email protected]')

    subject = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.XPATH, "//input[@aria-label='Add a subject']")))
    subject.send_keys('demo')

    mail = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.XPATH, "(//div[@class='elementToProof'])[1]")))
    mail.send_keys('This is a demo mail sent by a machine.')

    time.sleep(1)
    ActionChains(driver) \
        .key_down(Keys.CONTROL) \
        .key_down(Keys.ENTER) \
        .perform()

    time. Sleep(2)`

我尝试在驱动程序中刷新页面,并通过键盘模块手动按 f5 刷新页面,结果相同。

python selenium-webdriver 自动化

评论


答:

0赞 Yaroslavm 8/14/2023 #1

我建议不要通过前端发送电子邮件,而是使用邮件 http 客户端库之一。

但无论如何,你的测试都会失败,因为每次发送新电子邮件时,文本框选择器都会动态更改。因此,当您尝试发送第二封邮件时,这是不正确的。(//div[@class='elementToProof'])[1]

    subject.send_keys('demo')

    mail = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "[id*=editorParent] [role=textbox]")))
    mail.send_keys('This is a demo mail sent by a machine.')

    driver.find_element(By.CSS_SELECTOR, '[Aria-label=Send]').click()
    wait.until(EC.invisibility_of_element(mail))
    #end of loop

在您的代码中,我更改了:

  • 将选择器更改为通用[id*=editorParent] [role=textbox]
  • 将逻辑从通过热键发送更改为通过按钮发送
  • 除了隐式等待外,添加了等待邮件文本框不可见的条件

评论

0赞 Eugène-René 8/14/2023
我已经解决了这个问题,但感谢您抽出时间。这是一个“热身”项目,目的是让自己熟悉这个模块,但如果我可以问,你认为向 Facebook 的朋友发送自动消息的最佳方式是什么?在像Facebook这样的封闭生态系统中,我认为避免反垃圾邮件措施的唯一方法是硒。
0赞 Yaroslavm 8/14/2023
@Eugène-René 最好的做法是使用 Facebook Messenger API,这是 Facebook 提供的此类方法。就像一个例外,也许 Selenium 也会处理这项任务,但 Facebook 可以有 Cloudflare 机器人检测/或类似的东西,可以阻止你通过自动化工具访问。即使在浏览器中执行本机 js 代码也可以比使用 Selenium 更有效。另外,我猜,您的Facebook帐户可能会在短时间间隔内发送大量消息后被禁止。