提问人:Eugène-René 提问时间:8/13/2023 更新时间:8/14/2023 访问量:41
Selenium 第二次找不到元素
selenium can't find the element for the second time
问:
当使用 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 刷新页面,结果相同。
答:
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帐户可能会在短时间间隔内发送大量消息后被禁止。
评论