首页 > 解决方案 > 编辑 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?

请任何建议或指向正确的库/文档的指针将不胜感激!:)

标签: python-3.xselenium

解决方案


所以你要求的是一个for循环。这用于多次执行任务,通常与列表之类的东西一起使用。

我注意到的其他三件事:

  1. 您正在使用很多sleep()电话并查看您的代码,我认为这不是必需的。

  2. 你永远不会调用你分配的变量,所以为了减少你的代码,我摆脱了所有的变量调用。

  3. 我认为您误解了导入的工作方式对导入睡眠和时间的作用。无需做任何事情import time,您的电话就可以正常工作。如果您只想使用该方法,只需调用您的代码即可。在这种情况下,您将不需要前缀。time.sleep()from time import sleepsleep()timefrom time import sleepsleep()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()

推荐阅读