1. 操作脚本及其顺序
当我们开始规划自动化脚本时,重要的是要明白,需要从简单到复杂,像讲故事一样。想象一下,你的脚本是个英雄,正在网站页面上旅行。每一步都经过精心设计,确保不会走偏。
创建分步骤的自动化脚本
首先需要制定计划。你想实现什么?加载页面、填写表单、点击按钮?就像人们常说的:“不计划就是在计划失败”。我们当然不想失败,所以让我们把预期的步骤列出来。
Python
from selenium import webdriver
from selenium.webdriver.common.by import By
# 创建驱动实例。使用适合您浏览器的驱动。
driver = webdriver.Chrome()
# 打开页面
driver.get('https://example.com/login')
# 填写用户名
driver.find_element(By.NAME, 'username').send_keys('my_username')
# 填写密码
driver.find_element(By.NAME, 'password').send_keys('my_secure_password')
# 点击登录按钮
driver.find_element(By.ID, 'login-button').click()
这样我们就为我们的舞步定好了节奏。脚本会按顺序执行每一步,这样脚本就能够顺利地操作网站。
记录执行步骤
就像一个值得尊敬的英雄,我们的脚本也需要留下痕迹,让我们知道它去了哪里、做了什么。日志记录就是脚本的日记。它能够帮助跟踪步骤的执行情况,如果有什么地方出了问题,可以发现问题所在。
Python
import logging
# 设置日志记录
logging.basicConfig(level=logging.INFO)
# 记录操作示例
logging.info("打开登录页面")
driver.get('https://example.com/login')
日志记录不仅有助于调试,还能让你心里有底,知道脚本正确执行了每一步。如果突然出了问题,你可以回去看日志,找到出问题的地方。
2. 代码的组织与修改
当脚本变得复杂时,保持代码整洁就非常重要了。想象一下,有一个庆典,来宾和食物一大堆,如果一切都没有摆放整齐,那就会一团乱。在代码里也是一样,乱糟糟不利于维护。
代码结构的设置
为了减少修改代码的成本,代码需要组织有序。就像整理袜子一样,一切都需要分类清楚。可以使用函数将重复的操作提取到单独的模块中。
Python
def login_to_site(driver, username, password):
logging.info("输入用户名")
driver.find_element(By.NAME, 'username').send_keys(username)
logging.info("输入密码")
driver.find_element(By.NAME, 'password').send_keys(password)
logging.info("点击登录按钮")
driver.find_element(By.ID, 'login-button').click()
# 使用函数登录
login_to_site(driver, 'my_username', 'my_secure_password')
使用函数能够让代码更整洁,也更容易做更改。例如,如果登录按钮的ID发生了变化,只需要在函数中修改,而不需要在整个代码中找。
3. 示例:自动化网站购买流程
假设我们需要设置购买流程的自动化,步骤如下:
- 打开网站并登录账户。
- 进入商品目录并将商品加入购物车。
- 进入购物车并完成购买。
Python
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
# 初始化带有设置的驱动
def initialize_driver():
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 隐式等待
return driver
# 登录账户的函数
def login(driver, username, password):
driver.get("https://example.com")
driver.find_element_by_id("username").send_keys(username)
driver.find_element_by_id("password").send_keys(password)
driver.find_element_by_id("login_button").click()
# 进入商品目录并添加商品到购物车的函数
def add_product_to_cart(driver):
driver.get("https://example.com/catalog")
product = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "product_item"))
)
product.click()
add_to_cart_button = driver.find_element_by_id("add_to_cart")
add_to_cart_button.click()
# 进入购物车并完成购买的函数
def checkout(driver):
driver.get("https://example.com/cart")
checkout_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "checkout"))
)
checkout_button.click()
# 关闭驱动的函数
def close_driver(driver):
driver.quit()
# 执行操作序列的主脚本
def main():
# 设置数据
username = "myusername"
password = "mypassword"
# 初始化驱动
driver = initialize_driver()
try:
# 登录网站
login(driver, username, password)
# 进入目录并添加商品到购物车
add_product_to_cart(driver)
# 进入购物车并完成购买
checkout(driver)
finally:
# 关闭驱动
close_driver(driver)
# 运行主脚本
main()
函数解释
-
initialize_driver()— 初始化WebDriver的函数。 它为所有元素设置了隐式等待并返回驱动对象。 -
login()— 登录网站的函数。它接收username和password参数,用于填写登录表单并点击按钮。 -
add_product_to_cart()— 用于进入目录、选择商品并将其添加到购物车的函数。 -
checkout()— 用于进入购物车并完成购买的函数。 -
close_driver()— 用于关闭驱动的函数。 -
main()— 管理操作顺序的主函数。在这里调用了所有步骤,还传递了登录数据。
这种方法的优点
-
可读性— 每个步骤都打包成独立的函数,方便理解代码。 -
可重用性— 单独的函数可以在主脚本之外独立使用,例如执行网站上的单个操作。 -
测试简单性— 可以分别测试每个步骤,确保所有功能正常。 -
灵活性— 如果需要可以添加其他函数或更改main()内的调用顺序。
GO TO FULL VERSION