selenium常见方法(clear(),send_keys(),click(),submit())实例

本文通过实例演示了Selenium中常见的方法,如clear(), send_keys(), click(), submit()的使用,详细介绍了如何利用这些方法实现网页登录自动化。从初始化WebDriver到定位元素,再到模拟用户操作,一步步展示了Selenium的强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

selenium常见方法(clear(),send_keys(),click(),submit())实例

from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get(“https://passport.youkuaiyun.com/account/login?ref=toolbar“)
driver.find_element_by_css_selector(“input#username”).clear() #清空输入框内的提示信息,例如用户名,密码等提示信息,如果直接输入内容,可能会与输入框的默认提示信息拼接,从而造成输入信息的错误,这是clear()将会变得非常有用
driver.find_element_by_css_selector(“input#username”).send_keys(“1285154416@qq.com”) #用于在一个输入框内输入XX内容
driver.find_element_by_css_selector(“input#password”).clear()
driver.find_element_by_css_selector(“input#password”).send_keys(“123456”)
driver.find_element_by_css_selector(“input.logging”).submit()#用于对信息进行提交,也可以使用click()进行代替,submit()要求提交对象是一个表单,click()更强调事件的独立性
time.sleep(10)
driver.quit()

import time import os from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler import openpyxl from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class ExcelFileHandler(FileSystemEventHandler): def __init__(self, upload_function): self.upload_function = upload_function def on_modified(self, event): if event.src_path.endswith('.xlsx') and os.path.getsize(event.src_path) > 0: print(f"检测到文件 {event.src_path} 被修改") # 暂时不调用上传函数 # self.upload_function(event.src_path) def read_excel(file_path): try: workbook = openpyxl.load_workbook(file_path) sheet = workbook.active data = [] for row in sheet.iter_rows(min_row=2, values_only=True): if row[0] is not None: data.append((row[0], row[1])) workbook.close() return data except Exception as e: print(f"读取Excel文件时出错: {e}") return None def upload_data(file_path): try: driver = webdriver.Chrome() driver.get("https://target-website.com/upload") wait = WebDriverWait(driver, 10) username_input = wait.until(EC.presence_of_element_located((By.ID, "username"))) password_input = driver.find_element(By.ID, "password") username_input.send_keys("your_username") password_input.send_keys("your_password") login_button = driver.find_element(By.ID, "login-button") login_button.click() upload_page = wait.until(EC.presence_of_element_located((By.ID, "upload-form"))) data = read_excel(file_path) if data is None: return for item in data: field1 = driver.find_element(By.ID, "field1") field2 = driver.find_element(By.ID, "field2") submit_button = driver.find_element(By.ID, "submit-button") field1.clear() field2.clear() field1.send_keys(item[0]) field2.send_keys(item[1]) submit_button.click() time.sleep(2) print("数据上传完成") driver.quit() except Exception as e: print(f"上传数据时出错: {e}") driver.quit() def setup_file_monitor(folder_path, upload_function): event_handler = ExcelFileHandler(upload_function) observer = Observer() observer.schedule(event_handler, path=folder_path, recursive=False) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() if __name__ == "__main__": folder_path = r"D:\\\\work_project\\\\import_data" setup_file_monitor(folder_path, upload_data) 请你这个代码上按照你的方式来修改
最新发布
07-09
<think>我们有一个明确的任务:使用watchdog监视Excel文件(.xlsx)的更新,并在文件修改后通过Selenium自动上传到网页。 改进步骤: 1. 安装必要的库:watchdog, selenium, openpyxl(如果需要读取Excel内容,但这里主要是上传文件,所以可能不需要读取内容,但根据需求可能不同) 2. 设计一个FileSystemEventHandler的子类,重写on_modified方法,当检测到目标Excel文件被修改时,触发上传操作。 3. 在事件处理中,注意避免重复触发(因为某些编辑器保存文件时可能会触发多次事件)。 4. 设置Selenium进行文件上传:需要定位网页上的文件上传元素,然后使用send_keys方法传入文件路径。 注意:由于Selenium操作浏览器,我们需要在事件处理中启动浏览器操作,但要注意避免阻塞观察者线程。我们可以使用多线程或异步处理上传。 但是,需要注意的是,事件处理函数on_modified是在观察者线程中调用的,如果我们在其中直接使用Selenium(可能会比较慢),可能会错过后续事件或导致性能问题。 因此,我们可以考虑将上传操作放在单独的线程中执行。 另外,由于文件修改事件可能会连续触发(例如,保存大文件时可能会分多次写入),我们可以设置一个防抖(debounce)机制,即等待一段时间(比如2秒)没有新事件后再执行上传。 改进方案: 1. 在事件处理器中,当检测到目标文件修改时,启动一个计时器(例如2秒)。如果在2秒内没有再次修改该文件,则执行上传操作。 2. 使用线程安全的方式管理计时器(例如,每个文件一个计时器,或者使用线程定时器)。 由于我们只关心特定的Excel文件,可以过滤事件,只处理目标文件。 假设我们要监视的Excel文件路径为:'./data/report.xlsx' 代码结构: - 自定义事件处理器(MyEventHandler): 重写on_modified方法,当事件的目标文件是我们监控的Excel文件时,启动/重置一个计时器(防抖)。 - 计时器到时间后,在另一个线程中执行上传任务。 上传任务函数(upload_file): 使用Selenium打开浏览器,定位到文件上传元素,然后发送文件路径,提交表单。 注意:Selenium操作需要浏览器驱动(如ChromeDriver),并确保浏览器兼容性。 由于我们可能同时监控多个文件,但本例中只监控一个,我们可以简单处理。 防抖机制实现: 我们可以使用一个全局变量(或实例变量)来存储计时器,每次事件发生时取消之前的计时器并重新开始。 代码示例:</think>### 改进方案:使用 Watchdog + Selenium 实现 Excel 自动上传 #### 1. **完整解决方案** ```python import time from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class ExcelUploadHandler(FileSystemEventHandler): def __init__(self, excel_path, upload_url): self.excel_path = excel_path self.upload_url = upload_url self.last_modified = 0 # 防抖机制 def on_modified(self, event): # 检查是否为目标文件且修改时间合理 if (event.src_path == self.excel_path and time.time() - self.last_modified > 3): # 3秒防抖 print(f"📊 Excel文件更新: {event.src_path}") self.last_modified = time.time() self.upload_to_web() def upload_to_web(self): """使用Selenium自动上传文件""" driver = webdriver.Chrome() try: driver.get(self.upload_url) # 定位上传元素并发送文件路径 upload_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "file-upload")) ) upload_element.send_keys(self.excel_path) # 提交表单 submit_btn = driver.find_element(By.ID, "submit-btn") submit_btn.click() print("✅ 文件上传成功") except Exception as e: print(f"❌ 上传失败: {str(e)}") finally: driver.quit() # 配置参数 EXCEL_PATH = '/path/to/your/data.xlsx' # 监控的Excel路径 UPLOAD_URL = 'https://your-website.com/upload' # 目标网页URL # 启动监控 observer = Observer() event_handler = ExcelUploadHandler(EXCEL_PATH, UPLOAD_URL) observer.schedule(event_handler, path=os.path.dirname(EXCEL_PATH)) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() ``` #### 2. **关键改进点说明** 1. **双重防抖机制**: ```python if time.time() - self.last_modified > 3: # 防止多次触发 ``` - 解决编辑器多次保存导致的重复触发问题[^1] 2. **Selenium 智能等待**: ```python WebDriverWait(driver, 10).until(EC.presence_of_element_located(...)) ``` - 确保网页元素加载完成再操作 3. **异常处理**: ```python try: # 上传操作 except Exception as e: print(f"❌ 上传失败: {str(e)}") finally: driver.quit() # 确保浏览器关闭 ``` 4. **精确路径监控**: ```python observer.schedule(event_handler, path=os.path.dirname(EXCEL_PATH)) ``` - 只监控目标文件所在目录,减少系统开销 #### 3. **网页元素定位指南** 根据目标网页结构调整定位方式: ```python # 不同定位方式示例 driver.find_element(By.XPATH, "//input[@type='file']") # XPath driver.find_element(By.CSS_SELECTOR, ".upload-field") # CSS选择器 driver.find_element(By.NAME, "excelFile") # Name属性 ``` #### 4. **部署优化建议** 1. **无头模式运行**(后台执行): ```python options = webdriver.ChromeOptions() options.add_argument("--headless") # 无界面模式 driver = webdriver.Chrome(options=options) ``` 2. **跨平台路径处理**: ```python EXCEL_PATH = os.path.abspath("data/report.xlsx") # 绝对路径 ``` 3. **日志记录**: ```python import logging logging.basicConfig(filename='upload.log', level=logging.INFO) ``` > **实际应用场景**:财务系统每日报表自动上传、实验数据实时同步、库存管理系统数据更新等[^2]。 --- ### 相关问题 1. 如何防止 Watchdog 在 Excel 临时文件更新时误触发? 2. Selenium 上传文件时如何处理网页认证(登录)? 3. 当监控目录包含多个 Excel 文件时如何区分处理? 4. 如何实现文件上传失败后的自动重试机制? 5. Watchdog 在 Linux 服务器无 GUI 环境下如何运行 Selenium? [^1]: Watchdog库为Python开发者提供了一个强大而简洁的工具,用于监控文件系统的变化 [^^2]: 文件系统监控是许多应用程序的关键部分,用于实时检测文件和目录的更改
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值