Selenium元素定位

一、基本元素定位法(ID定位法)

使用ID进行定位

python 复制代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time

# 隐藏正在受到自动测试软件的控制这句话
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])

service = Service("../../chromedriver.exe")
driver = webdriver.Chrome(service=service, options=chrome_options)
driver.get("https://www.baidu.com")
time.sleep(3)
# 使用id进行定位
input_element = driver.find_element(by=By.ID, value="kw")
# 往输入框中输入内容
input_element.send_keys("我爱中国")
search_button = driver.find_element(By.ID, "su")
# 点击搜索按钮
search_button.click()
time.sleep(5)
driver.quit()

注意:这样写一定有错误,百度有反爬拦截,所有你要加点反反爬

二、其它基本元素定义法

1、class定位法

通过class属性定位,多个元素可能共享相同class

示例:find_element(By.CLASS_NAME, "text")

通过超链接完整文本定位,需要完全匹配链接文件,区分大小写

示例:find_element(By.LINK.TEXT, "家用电器")

通过超链接部分文本定位,文本需具有唯一性,否则可能匹配多个元素

示例:find_element(By.PARTIAL_LINK_TEXT, "一体")

4、name定位

实现方法:find_element(by=By.NAME, value="wd")

python 复制代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

service = Service("../../chromedriver.exe")
driver = webdriver.Chrome(service=service)
# 把浏览器最大化
driver.maximize_window()
driver.get("https://www.jd.com")
# jd_search_input = driver.find_element(By.CLASS_NAME, "text")
# jd_search_input.send_keys("电脑")
# jd_search_button = driver.find_element(By.CLASS_NAME, "button")
# jd_search_button.click()
driver.find_element(By.LINK_TEXT, "家用电器").click
# driver.find_element(By.LINK_TEXT, "平板电视").click
# 当页面以一个新的页面打开时,将会出现多个句柄(就是浏览器的页面)
# 这个时候我们需要做的事情是切换操作句柄

# 句柄切换
# 拿到所有句柄
handlers = driver.window_handles
print(driver.title)
for h in handlers:
    if h != driver.current_window_handle:
        # 切换到这个句柄上
        driver.switch_to.window(h)
    print("当前句柄是:" + driver.title)

driver.find_element(By.PARTIAL_LINK_TEXT, "一体").click()
5、注意

三、CSS选择器定位法

css学习的参考手册:https://www.runoob.com/cssref/css-selectors.html

注意:自动生成路径可能过长需要人工优化

python 复制代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

service = Service("../../chromedriver.exe")
driver = webdriver.Chrome(service=service)
# 把浏览器最大化
driver.maximize_window()
driver.get("https://www.jd.com")
driver.find_element(By.CSS_SELECTOR, "#key").send_keys("键盘")
driver.find_element(By.CSS_SELECTOR, "#search > div.search-m > div.form.include_jingyan.hotWords > button").click()

鼠标悬停

python 复制代码
jiadian_element = driver.find_element(By.CSS_SELECTOR, "#J_cate > ul > li:nth-child(1) > a:nth-child(2)")
# 鼠标悬停
from selenium.webdriver.common.action_chains import ActionChains
import time
ActionChains(driver).move_to_element(jiadian_element).perform()
time.sleep(2)
# 定位全面屏电视
tv = driver.find_element(By.CSS_SELECTOR,"#search-condition > div._all-filter-row-wrapper_re2q8_1 > div._first-line_re2q8_7 > div._all-filter-row_re2q8_1 > div > div._filter-type-inner_7xxfi_25 > div._filter-type-values_7xxfi_41 > div > div > div:nth-child(1)")
tv.click()

|-----------|---------------------------------|----------------------------|------|
| 知识点 | 核心内容 | 考试重点/易混淆点 | 难度系数 |
| CSS选择器定位法 | 使用CSS选择器定位网页元素(如京东网站的家用电器分类) | ID选择器(如#J_cate)与层级组合写法 | ⭐⭐ |
| 鼠标悬停操作 | 通过ActionChains实现悬停交互(如家用电器分类展开) | perform()执行与sleep()等待的配合使用 | ⭐⭐⭐ |
| 元素属性定位 | 利用title等属性定位元素(如小米商品图的title属性) | 中括号语法([title="小米"]) | ⭐⭐ |
| 动态元素处理 | 处理广告弹窗等动态元素(关闭顶部推广) | 元素可能因页面加载速度导致定位失败 | ⭐⭐⭐⭐ |
| 选择器优化策略 | 优先使用唯一属性(ID/title)简化选择器 | 空格与>符号的层级区别 | ⭐⭐ |
| 代码调试技巧 | 通过开发者工具复制CSS选择器路径 | 自动生成路径可能过长需人工优化 | ⭐⭐ |

四、xpath定义法

xpath教程网址:https://www.w3school.com.cn/xpath/xpath_nodes.asp

python 复制代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
# 隐藏正在受到自动测试软件的控制这句话
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
service = Service("../../chromedriver.exe")
driver = webdriver.Chrome(service=service, options=chrome_options)

driver.get("http://www.jd.com")
driver.find_element(By.XPATH, "//*[@id='key']").send_keys("鼠标")
driver.find_element(By.XPATH, "//*[@id='search']/div/div[2]/button").click()
1、XPath节点理论
  • 节点类型:
    • 7种节点:元素、属性、文本、命名空间、处理指令、注释、文档节点(根节点)
    • 元素节点:对应HTML标签(如div、button等)
    • 属性节点:标签内的属性(如id="key")
    • 文档节点:整个HTML文档的根节点
  • 节点关系:
    • 父节点(Parent):直接上级节点
    • 子节点(Children):直接下级节点
    • 先辈节点(Ancestor):所有上级节点
    • 后代节点(Descendant):所有下级节点
    • 同胞节点(Sibling):同级节点
2、 XPath语法详解
1)路径表达式
  • 基本语法:
    • nodename:选取此节点的所有子节点
    • /:从根节点选取(绝对路径)
    • //:从当前节点选择文档中的节点(相对路径)
    • .:选取当前节点
    • ..:选取当前节点的父节点
    • @:选取属性
  • 实例说明:
    • /html:从根节点开始的HTML元素
    • //div:选择文档中所有div元素
    • //*[@id="key"]:选择id属性为"key"的任何元素
2)谓语应用
  • 谓语功能:用于查找特定节点或包含指定值的节点,嵌入在方括号中

  • 常用谓语:

    • 1\]:选取第一个匹配元素

    • position()\<3\]:选取前两个匹配元素

    • price\>35.00\]:选取price值大于35的元素

  • *:匹配任何元素节点

  • @*:匹配任何属性节点

  • node():匹配任何类型的节点

  • 示例://*[@*]选取所有带属性的元素

3、实战案例
  • 操作流程:
    • 定位搜索框://*[@id="key"]
    • 输入关键词:.send_keys("鼠标")
    • 定位搜索按钮://*[@id="search"]/div/div[2]/button
    • 执行点击:.click()
  • 特殊字符处理:
    • 属性值中的引号需要转义:\"
    • 示例:value="//*[@id=\"key\"]"
4、 定位策略建议
  • 灵活选择:根据元素特点选择最方便的定位方式
  • 多种方式验证:同一个元素可以尝试不同的XPath表达式
  • 优先选择:
    • 有唯一ID时使用//*[@id='xxx']
    • 层级明确时使用路径表达式
    • 需要属性筛选时使用谓语

五、注意

有些页面要刷新才可以

python 复制代码
driver.execute_script("window.scrollBy(0, 600)")

页面关闭

  • close():仅关闭当前标签页
  • quit():关闭整个浏览器进程

句柄切换

  • 通过driver.window_handles获取所有窗口句柄
  • 使用driver.switch_to.window(h)切换到指定句柄
  • 用driver.current_window_handle记录当前句柄
python 复制代码
# 拿到所有句柄
handlers = driver.window_handles
print(driver.title)
for h in handlers:
    if h != driver.current_window_handle:
        # 切换到这个句柄上
        driver.switch_to.window(h)
    print("当前句柄是:" + driver.title)

还有一种方法(封装函数)

python 复制代码
def  to_new_handler(driver, *have_handlers):
    # 拿到所有句柄
    handlers = driver.window_handles
    for h in handlers:
        if h != driver.current_window_handle:
            # 切换到这个句柄上
            driver.switch_to.window(h)
    return driver
            
相关推荐
与虾牵手2 小时前
Redis 缓存穿透,我在线上被教做人的全过程(附 3 种方案 + 代码)
python
安逸sgr2 小时前
【端侧 AI 实战】BitNet 详解:1-bit LLM 推理优化从原理到部署!
人工智能·python·scrapy·fastapi·ai编程·claude
我爱学习好爱好爱2 小时前
ELK日志分析平台(三):Logstash 7.17.10 独立节点部署与基础测试(基于Rocky Linux 9.6)
linux·python·elk
yangminlei2 小时前
openclaw对接飞书
开发语言·python·飞书
minglie12 小时前
Amaranth HDL
python·fpga开发
weixin199701080163 小时前
搜好货商品详情页前端性能优化实战
java·前端·python
王夏奇3 小时前
python-pytest学习
python·学习·pytest
BUG?不,是彩蛋!3 小时前
从 Q-Learning 到 LLM:我把 AI 的“大脑”换成了 GPT,发生了什么?
人工智能·python·gpt