我可以在元组中存储方法调用而不在运行时调用方法吗?
发布时间:2022-07-04 03:52:58 250
相关标签: # node.js
这个练习称为命令行电子邮件程序,它来自Automate the Boring Stuff with Python CH 12 2nd ed。
编写一个程序,在命令行上获取电子邮件地址和文本字符串,然后使用 selenium 登录到您的电子邮件帐户并将字符串的电子邮件发送到提供的地址。(您可能希望为此程序设置一个单独的电子邮件帐户。)
在完成这个练习时,我了解到用于查找 html 元素的 selenium 方法调用有时会起作用,但有时它们会抛出noSuchElementException. 为了解决这个问题,我创建了三个元组来存储 selenium 方法调用。使用该selenium_exception_loop()函数(见下文),我将遍历元组并一次调用一个方法。如果方法抛出noSuchElementFound异常,循环将等待两秒钟然后重试。
当然,问题在于 selenium 方法调用是在运行时执行的。有没有办法将 selenium 方法调用存储在集合中,而无需在运行时实际执行调用?还是我需要在这里采取完全不同的方法?
#!python3
# 04_command_line_emailer.py -- send emails from the command line
# usage: input four command line arguments:
# sys.argv[1] = email to log into
# sys.argv[2] = password
# sys.argv[3] = email body
# sys.argv[4] = recipient email address
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
import sys
import re
import time
class commandLineEmailer:
def __init__(self):
self.browser = webdriver.Firefox()
self.gmail_method_calls = ()
self.outlook_method_calls = ()
self.yahoo_method_calls = (
lambda: self.browser.find_element(By.CLASS_NAME, 'signin').click(),
lambda: self.browser.find_element(By.NAME, 'username').send_keys(self.return_email_info()[0]),
lambda: self.browser.find_element(By.NAME, 'signin').click(),
lambda: self.browser.find_element(By.NAME, 'password').send_keys(sys.argv[2]),
lambda: self.browser.find_element(By.NAME, 'verifyPassword').click(),
lambda: self.browser.find_element(By.CSS_SELECTOR, 'Compose').click()
)
def return_email_info(self) -> tuple:
'''
Input sys.argv[1] into regex. sys.argv[1] contains the sending email
address. return the username and the email client name.
:return: tuple, username at index 0, email client name at index 1
'''
return re.compile("(.*)(\@)(.*)(\.)").match(sys.argv[1]).group(1), \
re.compile("(.*)(\@)(.*)(\.)").match(sys.argv[1]).group(3)
# open browser session and navigate to email client
def go_to_email_client(self) -> None:
EMAIL_CLIENTS = {
'outlook': 'https://www.outlook.com/',
'gmail': 'https://www.gmail.com/',
'yahoo': 'https://yahoomail.com/'
}
self.browser.get(EMAIL_CLIENTS[self.return_email_info()[1]])
def selenium_exception_loop(self, selenium_method_collection) -> None:
'''
:param selenium_method_collection: input collection containing selenium
method calls to search for html elements. Wait two seconds between each
method call. Except the NoSuchElementException error.
:return: None
'''
for selenium_method_call in selenium_method_collection:
while True:
try:
time.sleep(2) # wait two seconds
selenium_method_call()
break
except NoSuchElementException:
continue
def sign_in_and_send(self) -> None:
'''
Retrieve the email client to log into. Call the selenium_exception_loop()
function and pass it the email client tuple containing the selenium
method calls
:return None:
'''
if self.return_email_info()[1] == 'gmail':
pass
elif self.return_email_info()[1] == 'outlook':
pass
elif self.return_email_info()[1] == 'yahoo':
self.selenium_exception_loop(self.yahoo_method_calls)
def main() -> None:
command_line_emailer = commandLineEmailer()
command_line_emailer.go_to_email_client()
command_line_emailer.sign_in_and_send()
if __name__ == "__main__":
main()
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报