一、Selenium 简介
Selenium 是一个用于自动化测试的工具,能够模拟用户在浏览器中的各种操作。它不仅广泛应用于测试领域,还常被用于爬虫开发,尤其是在处理动态加载的网页时非常有效。
二、环境安装
(一)安装 Selenium
在 Python 中,可以通过 pip 安装 Selenium:
bash复制
pip install selenium
(二)安装浏览器驱动
Selenium 需要与浏览器驱动配合使用。以 Edge 浏览器为例:
-
查看浏览器版本。
-
下载对应版本的驱动程序。
-
解压并获取
msedgedriver.exe
文件的路径。
三、Selenium 的基本操作
(一)初始化 WebDriver
Python复制
from selenium import webdriver
from selenium.webdriver.edge.service import Service
service = Service(executable_path='path/to/msedgedriver.exe')
driver = webdriver.Edge(service=service)
(二)打开网页
Python复制
driver.get("https://www.example.com")
driver.maximize_window() # 最大化窗口
(三)页面操作
1. 查找元素
Python复制
element = driver.find_element(by="xpath", value="//input[@name='username']")
2. 模拟输入与点击
Python复制
element.send_keys("your_username")
button = driver.find_element(by="xpath", value="//button[@type='submit']")
button.click()
3. 切换窗口
Python复制
driver.switch_to.new_window('tab') # 打开新标签页
driver.switch_to.window(driver.window_handles[-1]) # 切换到新窗口
(四)等待机制
1. 显式等待
Python复制
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
locator = (By.XPATH, "//button[@type='submit']")
button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable(locator))
button.click()
2. 隐式等待
Python复制
driver.implicitly_wait(10) # 设置隐式等待时间
(五)关闭页面
Python复制
driver.quit() # 关闭浏览器
四、高级操作
(一)动作链
动作链用于模拟复杂的鼠标操作,例如悬停、拖拽等:
Python复制
from selenium.webdriver.common.action_chains import ActionChains
element = driver.find_element(by="xpath", value="//div[@class='menu']")
ActionChains(driver).move_to_element(element).perform() # 悬停操作
(二)处理表单
当页面中包含 iframe
时,需要切换到对应的表单:
Python复制
driver.switch_to.frame("frame_id") # 切换到表单
driver.switch_to.default_content() # 切换回主文档
(三)反检测技术
为了避免被网站识别为自动化工具,可以使用以下方法:
Python复制
from selenium.webdriver.edge.options import Options
opt = Options()
opt.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Edge(service=service, options=opt)
五、实战案例:12306 火车票查询
以下是一个使用 Selenium 模拟 12306 火车票查询的完整代码示例:
Python复制
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select
from selenium.webdriver.edge.service import Service
url = "https://www.12306.cn/index/index.html"
service = Service(executable_path='path/to/msedgedriver.exe')
opt = Options()
opt.add_argument("--disable-blink-features=AutomationControlled")
opt.add_experimental_option("detach", True)
driver = webdriver.Edge(service=service, options=opt)
driver.implicitly_wait(5)
driver.maximize_window()
driver.get(url)
# 悬停到车票按钮
ticket_element = driver.find_element(by=By.XPATH, value='//*[@id="J-chepiao"]/a')
ActionChains(driver).move_to_element(ticket_element).perform()
# 点击单程票
one_way_element = driver.find_element(by=By.XPATH, value='//*[@id="megamenu-3"]/div[1]/ul/li[1]/a')
ActionChains(driver).click(one_way_element).perform()
# 输入出发地
from_station = driver.find_element(by=By.XPATH, value='//*[@id="fromStationText"]')
ActionChains(driver).click(from_station).pause(1).send_keys('重庆').pause(1).send_keys(Keys.ARROW_DOWN).pause(1).send_keys(Keys.ENTER).perform()
# 输入目的地
to_station = driver.find_element(by=By.XPATH, value='//*[@id="toStationText"]')
ActionChains(driver).click(to_station).pause(1).send_keys('长沙').pause(1).send_keys(Keys.ENTER).perform()
# 输入出发日期
date = driver.find_element(by=By.XPATH, value='//*[@id="place_area"]/ul/li[4]/span')
ActionChains(driver).click(date).pause(1).send_keys(Keys.CLEAR).pause(1).send_keys("2024-12-06").pause(1).send_keys(Keys.ARROW_DOWN).pause(1).send_keys(Keys.ENTER).perform()
# 选择学生票
driver.find_element(by=By.XPATH, value='//*[@id="sf2_label"]').click()
# 勾选高铁选项
driver.find_element(by=By.XPATH, value='//*[@id="_ul_station_train_code"]/li[1]/label').click()
# 选择发车时间
start_time_element = driver.find_element(by=By.XPATH, value='//*[@id="cc_start_time"]')
Select(start_time_element).select_by_visible_text('12:00--18:00')
# 查询车票
driver.find_element(by=By.XPATH, value='//*[@id="query_ticket"]').click()
time.sleep(3)
六、总结
Selenium 是一个功能强大的自动化测试工具,同时也广泛应用于爬虫开发。通过本文的介绍,读者可以快速掌握 Selenium 的基本操作、高级功能以及实战应用。希望本文能帮助你在自动化测试和爬虫开发中取得更大的进步。
如果你对 Selenium 有更深入的兴趣,可以参考官方文档或社区讨论,获取更多实战案例和优化技巧。
希望这篇博客对你有所帮助!如果有任何问题或需要进一步补充,请随时告诉我。