如何用Python+Selenium自动将生成的随机邮箱填入Chrome网页输入框?
解决随机生成邮箱并自动填入Selenium输入框的问题
核心问题修复
你代码里的email = print(randnames+random_4lettercomb+random_server_sel)是错误的——print函数的返回值是None,所以email变量实际是空值,自然没法传给send_keys填入输入框。
正确的做法是先把邮箱字符串赋值给email,再单独打印:
# 先拼接并赋值给email email = randnames + random_4lettercomb + random_server_sel # 再打印(可选) print(email)
其他代码问题修正
除了核心问题,你的代码还有几个小问题需要调整:
order()函数里的「点击提交按钮」代码没有缩进,导致它不会在函数执行时运行- 代码开头先调用了
driver.get()打开网页,后面if __name__ == '__main__'里又调用driver.get(keys['product_url']),会重复加载页面 - 用
time.sleep()等待页面加载不可靠,建议改用Selenium的WebDriverWait显式等待元素加载完成
修正后的完整代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from config import keys import time import random import string import nameslist # 姓名列表来源注释 "NAMES" "From https://www.usna.edu/Users/cs/roche/courses/s15si335/proj1/files.php%3Ff=names.txt.html" e_address_count = 1 email_providers = ["yahoo","gmail","hotmail","outlook"] tlds = [".com",".es"] # 可添加更多域名 # 生成随机邮箱 email = "" for i in range(e_address_count): random_server_sel = "@" + random.choice(email_providers) + random.choice(tlds) randnames = random.choice(nameslist.Names) # 生成2位随机字母组合(原代码注释写的4位但实际生成2位,保留原逻辑) random_letter_comb = ''.join(random.choice(string.ascii_letters) for _ in range(2)) email = randnames + random_letter_comb + random_server_sel print(email) def timeme(method): def wrapper(*args, **kw): startTime = int(round(time.time() * 1000)) result = method(*args, **kw) endTime = int(round(time.time() * 1000)) print(f"执行耗时: {(endTime - startTime)/1000} s") return result return wrapper # 初始化浏览器 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) @timeme def order(): # 显式等待邮箱输入框加载完成,最多等10秒 email_input = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '//*[@id="input_comp-lgb8swdu"]')) ) email_input.send_keys(email) # 填写大号故障编号 num_mayor_input = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '//*[@id="input_comp-lgb8qa87"]')) ) num_mayor_input.send_keys(keys['numeromañor']) # 填写小号故障编号 num_menor_input = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '//*[@id="login-form"]/div[5]/div/div/input')) ) num_menor_input.send_keys(keys['numeromenor']) # 点击提交按钮(注意缩进,放到函数内部) submit_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '/html/body/div[1]/div/div[3]/div/main/div/div/div/div[2]/div/div/div/section[2]/div[2]/div/div[1]/div/div/form/div/div/div[6]/button/span')) ) submit_btn.click() if __name__ == '__main__': # 打开目标页面(只打开一次) driver.get(keys['product_url']) order()
关键修改说明
- 修复了邮箱赋值逻辑,确保email变量存储真实的邮箱字符串而非None
- 把所有元素操作改成显式等待,避免因页面加载慢导致的元素找不到错误
- 调整了提交按钮代码的缩进,确保它属于order函数的一部分
- 移除了重复的页面加载代码,只在main函数里打开一次目标页面
- 优化了计时函数的输出格式,更易读
内容的提问来源于stack exchange,提问作者diaverso 100
相关产品推荐
相关产品推荐

