python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python Selenium教程

从零开始学习Python Selenium浏览器元素定位与实战技巧

作者:高并发吃面

这篇文章主要为大家详细介绍了一份Selenium全教程,涵盖从基础到进阶的核心知识点,基于Selenium 4版本(当前主流版本),适合新手入门及进阶学习,快跟随小编一起学习起来吧

一、Selenium简介

1. 什么是Selenium

Selenium是一个用于Web应用程序自动化测试的工具集,支持多浏览器(Chrome、Firefox、Edge等)、多语言(Python、Java、C#等),核心功能是模拟人类操作浏览器(点击、输入、跳转等)。

2. Selenium的组成

3. 应用场景

二、环境搭建

1. 安装Python

Selenium需依赖Python环境,安装时勾选“Add Python to PATH”。

2. 安装Selenium

打开命令行,执行:

pip install selenium  # 安装最新版Selenium 4

3. 浏览器驱动配置

WebDriver需要通过“浏览器驱动”与浏览器通信,不同浏览器需对应驱动:

浏览器驱动名称
ChromeChromeDriver
FirefoxGeckoDriver
EdgeEdgeDriver

配置步骤

4. 验证环境

运行以下代码,若能打开Chrome并访问百度,则配置成功:

三、基础操作

1. 启动浏览器与访问网页

from selenium import webdriver

# 启动浏览器(Chrome/Firefox/Edge)
driver = webdriver.Chrome()  # Chrome
# driver = webdriver.Firefox()  # Firefox
# driver = webdriver.Edge()  # Edge

# 访问网页
driver.get("https://www.baidu.com")

# 获取当前页面标题和URL
print("标题:", driver.title)  # 输出:百度一下,你就知道
print("URL:", driver.current_url)  # 输出:https://www.baidu.com/

# 关闭浏览器(quit()关闭所有窗口,close()关闭当前窗口)
driver.quit()

2. 元素定位(核心!)

Selenium提供8种元素定位方式,需结合网页HTML结构使用。推荐使用By类(Selenium 4推荐写法)。

步骤

定位方式说明示例代码
ID通过元素id属性定位(唯一)driver.find_element(By.ID, "kw")
Name通过元素name属性定位driver.find_element(By.NAME, "wd")
Class Name通过元素class属性定位driver.find_element(By.CLASS_NAME, "s_ipt")
Tag Name通过标签名定位(如<input>driver.find_element(By.TAG_NAME, "input")
Link Text通过链接文本定位(精确匹配)driver.find_element(By.LINK_TEXT, "新闻")
Partial Link Text通过链接文本模糊匹配driver.find_element(By.PARTIAL_LINK_TEXT, "新")
XPath基于XML路径定位(万能)driver.find_element(By.XPATH, '//input[@id="kw"]')
CSS Selector基于CSS选择器定位driver.find_element(By.CSS_SELECTOR, "#kw")

示例:定位百度搜索框并输入内容

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

# 定位搜索框(id为"kw")
search_box = driver.find_element(By.ID, "kw")
# 输入文本
search_box.send_keys("Selenium教程")
# 定位搜索按钮(id为"su")并点击
search_btn = driver.find_element(By.ID, "su")
search_btn.click()

time.sleep(3)
driver.quit()

XPath进阶:XPath是最灵活的定位方式,支持复杂场景:

3. 操作元素

方法说明
send_keys("文本")输入文本
click()点击元素
clear()清空输入框内容
get_attribute("属性名")获取元素属性(如value、href)
text获取元素文本内容
is_displayed()判断元素是否可见

示例

# 获取搜索框的value属性(输入的内容)
print(search_box.get_attribute("value"))  # 输出:Selenium教程

# 获取百度logo的文本(实际为空,logo通常无文本)
logo = driver.find_element(By.CLASS_NAME, "index-logo-src")
print(logo.text)  # 输出:空字符串

# 判断搜索按钮是否可见
print(search_btn.is_displayed())  # 输出:True

四、等待机制

网页加载存在延迟(如JS渲染、网络延迟),直接操作元素可能导致“元素未找到”错误,需设置等待。

1. 隐式等待

全局等待,设置一次后对所有元素生效,等待元素加载完成(最多等待指定时间)。

driver.implicitly_wait(10)  # 等待10秒(单位:秒)

2. 显式等待

针对特定元素的等待,更灵活,需结合WebDriverWaitexpected_conditions(预期条件)。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 等待搜索结果加载(最多10秒,每0.5秒检查一次)
# 条件:id为"content_left"的元素可见
result = WebDriverWait(driver, 10, 0.5).until(
    EC.visibility_of_element_located((By.ID, "content_left"))
)
print("搜索结果已加载")

常用预期条件

3. 强制等待

直接暂停程序,不推荐(硬编码等待时间,效率低):

import time
time.sleep(3)  # 强制等待3秒

五、浏览器操作

1. 窗口操作

# 设置窗口大小(最大化/指定尺寸)
driver.maximize_window()  # 最大化
driver.set_window_size(1200, 800)  # 宽1200,高800

# 获取窗口句柄(唯一标识)
current_window = driver.current_window_handle  # 当前窗口
all_windows = driver.window_handles  # 所有窗口

# 切换窗口(如点击链接打开新窗口后切换)
driver.find_element(By.LINK_TEXT, "新闻").click()  # 打开新窗口
for window in all_windows:
    if window != current_window:
        driver.switch_to.window(window)  # 切换到新窗口

2. 导航操作

driver.get("https://www.baidu.com")
driver.get("https://www.bing.com")  # 访问必应
driver.back()  # 后退到百度
driver.forward()  # 前进到必应
driver.refresh()  # 刷新页面

3. 处理iframe

iframe是嵌套在网页中的子页面(如登录框、广告),需先切换到iframe才能操作内部元素。

# 切换到iframe(通过id、name、索引或WebElement)
driver.switch_to.frame("iframe_id")  # 通过id
# driver.switch_to.frame(0)  # 通过索引(第1个iframe)

# 操作iframe内的元素(如输入用户名)
driver.find_element(By.ID, "username").send_keys("test")

# 切回主文档(必须!否则无法操作主页面元素)
driver.switch_to.default_content()

六、弹窗处理

网页弹窗(Alert、Confirm、Prompt)需通过switch_to.alert处理:

弹窗类型说明操作方法
Alert只有“确定”按钮alert.accept()(确认)
Confirm有“确定”和“取消”按钮alert.accept()(确认)/ alert.dismiss()(取消)
Prompt可输入文本的弹窗alert.send_keys("文本") + alert.accept()

示例

# 触发弹窗(假设点击按钮后弹出Confirm)
driver.find_element(By.ID, "show_confirm").click()

# 切换到弹窗
alert = driver.switch_to.alert
print("弹窗文本:", alert.text)  # 获取弹窗文本

# 取消弹窗
alert.dismiss()

七、文件操作

1. 文件上传

通过定位<input type="file">元素,使用send_keys传入文件路径(无需点击上传按钮):

# 定位上传按钮(必须是input标签)
upload_btn = driver.find_element(By.ID, "upload")
# 传入文件绝对路径
upload_btn.send_keys("C:/test.txt")

2. 文件下载

需配置浏览器默认下载路径(以Chrome为例):

from selenium.webdriver.chrome.options import Options

# 配置Chrome下载路径
chrome_options = Options()
prefs = {
    "download.default_directory": "C:/downloads",  # 下载路径
    "download.prompt_for_download": False  # 不弹出下载提示
}
chrome_options.add_experimental_option("prefs", prefs)

# 启动配置后的Chrome
driver = webdriver.Chrome(options=chrome_options)
# 点击下载链接
driver.find_element(By.LINK_TEXT, "下载文件").click()

八、键盘与鼠标操作

需使用ActionChains类模拟键盘和鼠标动作。

1. 键盘操作

from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys

# 定位搜索框
search_box = driver.find_element(By.ID, "kw")
search_box.send_keys("Selenium")

# 全选(Ctrl+A)→ 复制(Ctrl+C)→ 清空 → 粘贴(Ctrl+V)
ActionChains(driver).key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform()
ActionChains(driver).key_down(Keys.CONTROL).send_keys("c").key_up(Keys.CONTROL).perform()
search_box.clear()
ActionChains(driver).key_down(Keys.CONTROL).send_keys("v").key_up(Keys.CONTROL).perform()

2. 鼠标操作

# 定位元素
element = driver.find_element(By.ID, "xxx")

# 右键点击
ActionChains(driver).context_click(element).perform()

# 双击
ActionChains(driver).double_click(element).perform()

# 拖拽(从元素A拖到元素B)
source = driver.find_element(By.ID, "source")
target = driver.find_element(By.ID, "target")
ActionChains(driver).drag_and_drop(source, target).perform()

九、测试框架集成

Selenium常与Python测试框架(如unittestpytest)结合,实现用例管理和报告生成。

1. 与unittest结合

import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By

class TestBaidu(unittest.TestCase):
    def setUp(self):
        # 前置操作:启动浏览器
        self.driver = webdriver.Chrome()
        self.driver.get("https://www.baidu.com")

    def test_search(self):
        # 测试用例:搜索
        self.driver.find_element(By.ID, "kw").send_keys("unittest")
        self.driver.find_element(By.ID, "su").click()
        # 断言:页面标题包含"unittest"
        self.assertIn("unittest", self.driver.title)

    def tearDown(self):
        # 后置操作:关闭浏览器
        self.driver.quit()

if __name__ == "__main__":
    unittest.main()

2. 生成测试报告

使用HTMLTestRunner生成HTML报告:

pip install html-testRunner
import HtmlTestRunner

# 运行用例并生成报告
if __name__ == "__main__":
    unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(
        output="report",  # 报告目录
        report_name="百度搜索测试报告"
    ))

十、高级技巧与最佳实践

封装公共方法:将常用操作(如打开网页、定位元素)封装为工具类,减少重复代码。

class BrowserUtils:
    def __init__(self, driver):
        self.driver = driver
    
    def open_url(self, url):
        self.driver.get(url)
    
    def find_element(self, by, value):
        return self.driver.find_element(by, value)

处理动态元素:动态ID(如包含时间戳)可通过XPath模糊匹配://div[contains(@id, "dynamic_")]

避免硬编码:将URL、账号密码等配置存入config.ini,通过configparser读取。

Selenium Grid:分布式执行用例,需启动Hub和Node:

# 启动Hub(端口4444)
java -jar selenium-server-4.xx.xx.jar hub
# 启动Node(连接Hub)
java -jar selenium-server-4.xx.xx.jar node --hub http://localhost:4444/grid/register

十一、常见问题与解决方案

问题可能原因解决方案
元素定位不到元素在iframe内;未加载完成;动态ID切换iframe;增加等待;使用模糊定位
浏览器自动关闭代码执行完毕;驱动与浏览器版本不匹配检查代码是否有quit();更新驱动版本
弹窗切换失败弹窗未加载;非Alert类型弹窗增加等待;通过元素定位处理非Alert弹窗

通过以上内容,可系统掌握Selenium的核心用法。实际使用中需结合具体场景灵活调整,多练习元素定位和等待机制是关键!

到此这篇关于从零开始学习Python Selenium浏览器元素定位与实战技巧的文章就介绍到这了,更多相关Python Selenium教程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文