python-3.x - 编辑 Python Gui
问题描述
我有一段代码可以帮助我向客户发送电子邮件。这段代码非常基础,是用 Python3 编写的,并利用 Selenium + Chromedriver 代表我发送电子邮件。(我不是程序员,乱码请耐心等待)
问题是当我需要访问大量的电子邮件地址时。每次我需要通过 Sublime 文本手动编辑代码中的 subject/bcc/cc 字段以确保到达正确的客户时,这需要一两分钟。
当我使用 CRM 并希望将其密件抄送到每封电子邮件中以跟踪公司中发生的事情时,每个客户都单独发送电子邮件也很重要。这意味着不能将所有客户抄送到一封特定的电子邮件中。
因此,如果我需要发送 500 封电子邮件,使用正确的电子邮件地址编辑代码 500 次需要相当长的时间。
有什么方法可以简化这种代码编辑吗?例如:打开一个窗口,询问我要发送到哪些电子邮件地址 > 插入电子邮件地址 > 相应地编辑 program.py 代码 > 运行代码 > 向所有指定的客户发送电子邮件
我没有尝试太多,因为老实说,我什至不知道从哪里开始寻找解决方案,我也不知道这样的事情是否可行。
import selenium
from selenium import webdriver
from time import sleep
import time
driver = webdriver.Chrome()
driver.get('WEBSITE URL')
time.sleep(5)
emailelement = driver.find_element_by_id("identifierId")
time.sleep(3)
emailelement.send_keys('XXXXXXXX')
time.sleep(1)
Logginelement = driver.find_element_by_xpath("//span[@class='RveJvd snByac']")
Logginelement.click()
time.sleep(3)
passelement = driver.find_element_by_name('password')
passelement.send_keys('XXXXXXXX')
time.sleep(1)
Logginelement = driver.find_element_by_xpath("//span[@class='RveJvd snByac']")
Logginelement.click()
time.sleep(3)
Compose = driver.find_element_by_xpath("//div[@class='T-I J-J5-Ji T-I-KE L3']")
Compose.click()
time.sleep(1)
BCC = driver.find_element_by_xpath("//span[@class='aB gQ pB']")
BCC.click()
time.sleep(0.5)
bcc = driver.find_element_by_xpath("//textarea[@name='bcc']")
bcc.send_keys('EMAIL ADDRESS')
time.sleep(0.5)
Receipient = driver.find_element_by_xpath("//textarea[@name='to']")
Receipient.send_keys('EMAIL ADDRESS')
time.sleep(0.5)
Subject = driver.find_element_by_xpath("//input[@name='subjectbox']")
Subject.send_keys('SUBJECT')
time.sleep(0.5)
Message = driver.find_element_by_xpath("//div[@class='Am Al editable LW-avf tS-tW']")
Message.send_keys('MESSAGE')
time.sleep(0.5)
#Attach not utilized, just for experimentation.
#Attach = driver.find_element_by_xpath("//div[@class='a1 aaA aMZ']")
#Attach.click()
#time.sleep(15)
Send = driver.find_element_by_xpath("//div[@class='T-I J-J5-Ji aoO v7 T-I-atl L3']")
Send.click()
time.sleep(3)
我的问题与代码无关。我想知道是否可以使用 Gui 编辑代码中的某些行。例如:“bcc.send_keys('EMAIL ADDRESS')” 使用带有 Tkinter 之类的外部窗口编辑 EMAIL ADDRESS?
请任何建议或指向正确的库/文档的指针将不胜感激!:)
解决方案
所以你要求的是一个for
循环。这用于多次执行任务,通常与列表之类的东西一起使用。
我注意到的其他三件事:
您正在使用很多
sleep()
电话并查看您的代码,我认为这不是必需的。你永远不会调用你分配的变量,所以为了减少你的代码,我摆脱了所有的变量调用。
我认为您误解了导入的工作方式对导入睡眠和时间的作用。无需做任何事情
import time
,您的电话就可以正常工作。如果您只想使用该方法,只需调用您的代码即可。在这种情况下,您将不需要前缀。time.sleep()
from time import sleep
sleep()
time
from time import sleep
sleep()
time.
我已经编辑了您的代码以包含一个 for 循环和一个示例列表,您可以将自己的电子邮件放入其中。以及密件抄送电子邮件的变量。
看看这个例子,让我知道你的想法:
import selenium
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('WEBSITE URL')
# use a list object to store all your emails.
emails = ['someone@someplace.com', 'someone_else@someplace.com']
bcc_email = 'email_to_bcc@someplace.com'
# use a for loop to send all your emails.
for email in emails:
driver.find_element_by_id("identifierId").send_keys('XXXXXXXX')
driver.find_element_by_xpath("//span[@class='RveJvd snByac']").click()
driver.find_element_by_name('password').send_keys('XXXXXXXX')
driver.find_element_by_xpath("//span[@class='RveJvd snByac']").click()
driver.find_element_by_xpath("//div[@class='T-I J-J5-Ji T-I-KE L3']").click()
driver.find_element_by_xpath("//span[@class='aB gQ pB']").click()
# notice the variable in the email section
driver.find_element_by_xpath("//textarea[@name='bcc']").send_keys(bcc_email)
driver.find_element_by_xpath("//textarea[@name='to']").send_keys(email)
driver.find_element_by_xpath("//input[@name='subjectbox']").send_keys('SUBJECT')
driver.find_element_by_xpath("//div[@class='Am Al editable LW-avf tS-tW']").send_keys('MESSAGE')
driver.find_element_by_xpath("//div[@class='T-I J-J5-Ji aoO v7 T-I-atl L3']").click()
对于允许您使用您想要提供的任何电子邮件发送的简单 GUI 选项,请查看以下示例:
请注意,此示例没有任何错误检查,因此您可能需要先添加某种电子邮件验证。
import tkinter as tk
import selenium
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('WEBSITE URL')
bcc_email = 'email_to_bcc@someplace.com'
root = tk.Tk()
email = tk.Entry(root)
lbl1 = tk.Label(root, text='Enter single email here: ')
lbl1.grid(row=0, column=0)
email.grid(row=0, column=1)
def process_emails():
# use a for loop to send all your emails.
driver.find_element_by_id("identifierId").send_keys('XXXXXXXX')
driver.find_element_by_xpath("//span[@class='RveJvd snByac']").click()
driver.find_element_by_name('password').send_keys('XXXXXXXX')
driver.find_element_by_xpath("//span[@class='RveJvd snByac']").click()
driver.find_element_by_xpath("//div[@class='T-I J-J5-Ji T-I-KE L3']").click()
driver.find_element_by_xpath("//span[@class='aB gQ pB']").click()
# notice the variable in the email section
driver.find_element_by_xpath("//textarea[@name='bcc']").send_keys(bcc_email)
driver.find_element_by_xpath("//textarea[@name='to']").send_keys(email.get())
driver.find_element_by_xpath("//input[@name='subjectbox']").send_keys('SUBJECT')
driver.find_element_by_xpath("//div[@class='Am Al editable LW-avf tS-tW']").send_keys('MESSAGE')
driver.find_element_by_xpath("//div[@class='T-I J-J5-Ji aoO v7 T-I-atl L3']").click()
tk.Button(root, text='Process single email!', command=process_emails).grid(row=1, column=0, columnspan=2)
root.mainloop()
推荐阅读
- c++ - 为什么我们需要传递 const 共享指针作为引用?
- daml - DAML LookupByKey 和 FetchByKey 需要不同的权限才能运行
- sql - 查询计数 Else 语句值时的 SQL 案例
- java - 如何从第二个控制器类的主控制器类的 textArea 中获取选定的文本?
- python - 可以做些什么来修复 Heroku 的 H10 错误?
- pygame - 您如何解决:“TypeError:参数 1 必须是 pygame.Surface,而不是 SpriteSheet”?
- java - Python 3.7 在 MAC 上连接到 HSQLDB
- css - 如何将 h2 标签放入段落上方的网格中而不占用整个网格?
- python-3.x - Pycharm 路径问题
- azure - 如何在 docker 容器中运行的 Windows 服务中访问本地机器证书?