1. 技术基础
填写并提交表单
处理表单通常用于自动化用户注册、填写问卷、收集数据等等。当你需要填写几百个表单时,手动操作就像试图通过吸管吃西瓜。而使用我们使用 Selenium 的超级技能,这些操作只需要几秒钟。
首先,让我们学习如何填写文本字段和提交表单。以一个典型的网站登录表单为例,我们来学习主要步骤:
from selenium import webdriver
# 设置驱动程序 (例如,ChromeDriver)
driver = webdriver.Chrome()
try:
# 打开网页
driver.get("https://example.com/login")
# 找到用户名输入字段并输入文本
username_input = driver.find_element_by_name("username")
username_input.send_keys("我的登录")
# 找到密码输入字段并输入文本
password_input = driver.find_element_by_name("password")
password_input.send_keys("我的密码")
# 找到提交按钮并点击
submit_button = driver.find_element_by_name("submit")
submit_button.click()
finally:
# 关闭驱动程序
driver.quit()
验证和处理错误
没有什么比程序员更讨厌的就是错误在不该出现的时候弹出。因此,提前处理它们。使用 try/except 捕获错误,并记录日志以便弄清问题所在。
try:
username_input = driver.find_element_by_name("username")
username_input.send_keys("我的登录")
except Exception as e:
print(f"填写用户名时出错: {e}")
logging.error("填写用户名时出错", exc_info=True)
2. 复选框 (Checkboxes)
现在我们已经学会点击按钮了,接下来试试从列表中选择多个选项。要选中或取消选中复选框,也可以使用方法 click()。如果需要检查复选框是否被选中,可以使用属性 is_selected()。
checkbox = driver.find_element_by_id("checkbox_id")
if not checkbox.is_selected():
checkbox.click()
3. 单选按钮 (Radio Buttons)
单选按钮允许从多个选项中选择一个。处理方式和复选框类似:用 click() 方法选择选项,用 is_selected() 检查状态。
radio_button = driver.find_element_by_id("radio_button_id")
if not radio_button.is_selected():
radio_button.click()
4. 下拉列表 (Dropdowns)
下拉列表包含多个选项可选。在 Selenium 中有一个 Select 类,提供了操作这些列表的方法。
from selenium.webdriver.support.ui import Select
dropdown = Select(driver.find_element_by_id("dropdown_id"))
dropdown.select_by_visible_text("Option 1")
同样可以使用 select_by_index() 或 select_by_value() 来选择选项。
5. 文本区域 (Text Areas)
文本区域类似于文本字段,但通常用于输入大段文本。操作方式与文本字段相同。
text_area = driver.find_element_by_id("textarea_id")
text_area.send_keys("这是一个示例文本,用于文本区域。")
6. 日期选择器 (Date Picker)
日期字段允许用户选择日期。如果它是支持日期格式的普通文本字段,可以使用 send_keys() 输入特定格式的值。
date_field = driver.find_element_by_id("date_field_id")
date_field.send_keys("2023-12-25") # 日期格式可能因网站而异
但有些日期字段要求执行其他操作,例如打开弹出的日历并选择日期。
7. 文件上传字段 (File Upload)
这些字段允许上传文件到服务器。可以使用 send_keys() 方法输入本地计算机上的文件路径与之交互。
file_input = driver.find_element_by_id("file_upload_id")
file_input.send_keys("/path/to/file.txt")
8. 隐藏字段 (Hidden Fields)
隐藏字段不会显示在页面上,但可能用于存储提交表单所需的信息。只有在你有访问权限时才能与之交互(例如检查或更改其值)。
hidden_field = driver.find_element_by_id("hidden_field_id")
value = hidden_field.get_attribute("value")
print("Hidden field value:", value)
9. 验证操作是否成功
获取操作完成的信息是你的成功指针。提交表单后,你肯定想确认申请已经被成功接收,对吧?以下是实现方法:
# 验证是否成功登录到网站
if "欢迎" in driver.page_source:
print("登录成功!")
else:
print("登录时出现错误。")
10. 问题与解决方案
问题
- 运行不稳定: 网页经常更新。页面结构的更改可能导致脚本失败,因此定期检查代码的时效性是必要的。
- 网络速度依赖性: 页面和元素的加载时间可能会有所不同。使用显式等待(explicit waits)处理延迟。
解决方案
- 日志记录: 记录所有操作日志以更好地定位问题。使用
logging库会大大简化日志记录。 - 代码模块化: 将复杂操作划分为函数和模块,以便更容易修改和测试。
GO TO FULL VERSION