跳转到主内容
极星编程网:以代码为星,赴技术山海!

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

目录

一、Selenium简介

1. 什么是Selenium

2. Selenium的组成

3. 应用场景

二、环境搭建

1. 安装Python

2. 安装Selenium

3. 浏览器驱动配置

4. 验证环境

三、基础操作

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

2. 元素定位(核心!)

3. 操作元素

四、等待机制

1. 隐式等待

2. 显式等待

3. 强制等待

五、浏览器操作

1. 窗口操作

2. 导航操作

3. 处理iframe

六、弹窗处理

七、文件操作

1. 文件上传

2. 文件下载

八、键盘与鼠标操作

1. 键盘操作

2. 鼠标操作

九、测试框架集成

1. 与unittest结合

2. 生成测试报告

十、高级技巧与最佳实践

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

一、Selenium简介

1. 什么是Selenium

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

2. Selenium的组成

Selenium WebDriver:核心组件,通过代码驱动浏览器,支持跨语言(本文以Python为例)。

Selenium IDE:浏览器插件,用于录制/回放操作(适合快速生成简单脚本)。

Selenium Grid:用于分布式测试,可在多台机器/浏览器上同时执行用例。

3. 应用场景

自动化测试(功能测试、回归测试)。

网页数据爬取(模拟登录、动态内容获取)。

自动化操作(如批量填写表单、定时任务)。

二、环境搭建

1. 安装Python

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

2. 安装Selenium

打开命令行,执行:

pip install selenium # 安装最新版Selenium 4

3. 浏览器驱动配置

WebDriver需要通过“浏览器驱动”与浏览器通信,不同浏览器需对应驱动:浏览器驱动名称Chrome ChromeDriver Firefox GeckoDriver Edge EdgeDriver配置步骤:下载与浏览器版本匹配的驱动(如Chrome 114需对应ChromeDriver 114.x)。

将驱动文件(如chromedriver.exe)放在任意目录,建议放在Python安装目录或添加到系统环境变量PATH。

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推荐写法)。

步骤:打开网页,按F12打开开发者工具,通过“元素选择器”定位元素。

复制元素属性(如ID、XPath等)。

定位方式说明示例代码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通过标签名定位(如)

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是最灵活的定位方式,支持复杂场景:

绝对路径:

/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input(不推荐,易变)。

相对路径:

//input[@name="wd" and @class="s_ipt"](通过多属性定位)。

文本定位:

//a[text()="新闻"](精确匹配文本)。

包含文本:

//a[contains(text(), "新")](模糊匹配)。

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. 显式等待

针对特定元素的等待,更灵活,需结合WebDriverWait和expected_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("搜索结果已加载")常用预期条件:visibility_of_element_located:元素可见。

element_to_be_clickable:元素可点击。

text_to_be_present_in_element:元素包含指定文本。

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. 文件上传

通过定位元素,使用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测试框架(如unittest、pytest)结合,实现用例管理和报告生成。

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-testRunnerimport 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教程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:Python中Selenium最常用的八大元素定位的实战指南Python使用Selenium进行元素定位的步骤和方法Python Selenium中常用的元素定位方法总结Python selenium 八种定位元素的方式Python脚本Selenium及页面Web元素定位详解Python2 Selenium元素定位的实现(8种)

相关文章