Selenium:从入门到实战的详细教程

一、Selenium 简介

Selenium 是一个用于自动化测试的工具,能够模拟用户在浏览器中的各种操作。它不仅广泛应用于测试领域,还常被用于爬虫开发,尤其是在处理动态加载的网页时非常有效。

二、环境安装

(一)安装 Selenium

在 Python 中,可以通过 pip 安装 Selenium:

bash复制

pip install selenium

(二)安装浏览器驱动

Selenium 需要与浏览器驱动配合使用。以 Edge 浏览器为例:

  1. 查看浏览器版本。

  2. 下载对应版本的驱动程序。

  3. 解压并获取 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 有更深入的兴趣,可以参考官方文档或社区讨论,获取更多实战案例和优化技巧。


希望这篇博客对你有所帮助!如果有任何问题或需要进一步补充,请随时告诉我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CarlowZJ

我的文章对你有用的话,可以支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值