杰瑞科技汇

Python selenium定位有哪些常用方法?

为什么需要定位元素?

想象一下,你在浏览器中手动操作网页时,是如何点击一个按钮、输入一段文字或获取某个链接的?你的眼睛会先找到那个按钮(元素),然后将鼠标移动过去,最后点击。

Python selenium定位有哪些常用方法?-图1
(图片来源网络,侵删)

Selenium 模拟这个过程时,也需要先“找到”这个元素,然后才能对它进行操作(如 click(), send_keys() 等)。定位元素,就是告诉 Selenium 你要操作的具体是页面上的哪一个控件。


八大定位方法

Selenium 提供了 8 种核心的定位方法,它们都位于 By 类中,在编写代码时,我们通常会从 selenium.webdriver.common.by import By 导入 By

下面我们用一个简单的 HTML 示例来演示这 8 种方法,假设我们有以下登录表单:

<!DOCTYPE html>
<html>
<head>登录示例</title>
</head>
<body>
    <h1>用户登录</h1>
    <form id="login-form" action="/login" method="post">
        <div class="form-group">
            <label for="username">用户名:</label>
            <input type="text" id="username" name="username" class="form-control" placeholder="请输入用户名">
        </div>
        <div class="form-group">
            <label for="password">密码:</label>
            <input type="password" id="password" name="password" class="form-control" placeholder="请输入密码">
        </div>
        <button type="submit" name="login-btn" class="btn btn-primary">登录</button>
        <a href="https://www.example.com" target="_blank">访问示例网站</a>
    </form>
</body>
</html>

我们针对这个页面,逐一介绍 8 种定位方法。

Python selenium定位有哪些常用方法?-图2
(图片来源网络,侵删)

ID 定位

  • 描述:通过元素的 id 属性来定位。id 在页面中通常是唯一的,这是最常用、最稳定、最优先推荐的定位方式。

  • 语法find_element(By.ID, "value")

  • 示例:定位用户名输入框。

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    driver = webdriver.Chrome()
    driver.get("file:///path/to/your/page.html") # 替换为你的HTML文件路径
    # 定位 id 为 "username" 的元素
    username_input = driver.find_element(By.ID, "username")
    username_input.send_keys("my_user")

NAME 定位

  • 描述:通过元素的 name 属性来定位。name 属性可能不唯一,如果页面中有多个同名元素,find_element 会返回第一个匹配的元素,如果需要定位所有,可以使用 find_elements (注意是复数)。
  • 语法find_element(By.NAME, "value")
  • 示例:定位用户名输入框。
    # 定位 name 为 "username" 的元素
    username_input = driver.find_element(By.NAME, "username")
    username_input.send_keys("my_user")

CLASS_NAME 定位

  • 描述:通过元素的 class 属性来定位,一个元素的 class 属性可能包含多个空格分隔的类名。find_element 会匹配其中任意一个类名,但推荐使用完整的、精确的类名组合,以避免误定位。
  • 语法find_element(By.CLASS_NAME, "value")
  • 示例:定位用户名输入框(它的 class 是 "form-control")。
    # 定位 class 为 "form-control" 的元素
    username_input = driver.find_element(By.CLASS_NAME, "form-control")
    username_input.send_keys("my_user")

TAG_NAME 定位

  • 描述:通过元素的 HTML 标签名(如 input, button, a, div)来定位,由于很多页面会有相同的标签名,这种方法很少单独使用,通常用于定位一些通用元素或结合其他方法使用。

  • 语法find_element(By.TAG_NAME, "value")

  • 示例:定位所有的 <a> 链接标签。

    # 定位第一个 <a> 标签
    link = driver.find_element(By.TAG_NAME, "a")
    print(link.text) # 输出: 访问示例网站
    # 定位所有的 <a> 标签
    all_links = driver.find_elements(By.TAG_NAME, "a")
    print(f"页面共有 {len(all_links)} 个链接")

LINK_TEXT 定位

  • 描述:专门用于定位超链接(<a> 标签),通过链接的完整、精确的文本来定位。
  • 语法find_element(By.LINK_TEXT, "value")
  • 示例:定位“访问示例网站”这个链接。
    # 定位链接文本完全为 "访问示例网站" 的元素
    link = driver.find_element(By.LINK_TEXT, "访问示例网站")
    link.click()

PARTIAL_LINK_TEXT 定位

  • 描述:与 LINK_TEXT 类似,但用于定位链接文本的一部分,当链接文本很长或动态变化时很有用,但可能会导致定位到多个不想要的链接,使用时需谨慎。
  • 语法find_element(By.PARTIAL_LINK_TEXT, "value")
  • 示例:定位包含“示例”的链接。
    # 定位链接文本中包含 "示例" 的元素
    link = driver.find_element(By.PARTIAL_LINK_TEXT, "示例")
    link.click()

CSS_SELECTOR 定位

  • 描述:通过 CSS 选择器来定位元素,这是最强大、最灵活的定位方式之一,几乎可以定位到页面上的任何元素,熟练掌握 CSS 选择器能极大提高你的定位效率。

  • 语法find_element(By.CSS_SELECTOR, "value")

  • 示例

    • 通过 ID: #username
    • 通过 Class: .form-control
    • 通过标签: input
    • 组合定位: div.form-group input (定位 class 为 'form-group' 的 div 内部的 input 标签)
    • 属性定位: input[type='text'] (定位 type 属性为 'text' 的 input 标签)
      # 使用 CSS Selector 定位用户名输入框 (多种方式)
      # 方式1: 通过 ID
      username_input = driver.find_element(By.CSS_SELECTOR, "#username")

    方式2: 通过 Class

    username_input = driver.find_element(By.CSS_SELECTOR, ".form-control")

    方式3: 通过属性

    username_input = driver.find_element(By.CSS_SELECTOR, "input[name='username']")

    username_input.send_keys("my_user")

XPATH 定位

  • 描述:通过 XPath 表达式来定位元素,XPath 是一种在 XML 文档中查找信息的语言,HTML 也可以看作是 XML 的一种,XPath 同样非常强大,可以处理复杂的定位逻辑,比如层级关系、条件判断等。

  • 语法find_element(By.XPATH, "value")

  • 示例

    • 绝对路径 (不推荐,脆弱): /html/body/form/div/input
    • 相对路径 (推荐): //input[@id='username']
    • 使用索引: (//input)[1] (定位第一个 input 标签)
    • 包含文本: //a[contains(text(), '示例')]
      # 使用 XPath 定位用户名输入框
      # 方式1: 通过属性
      username_input = driver.find_element(By.XPATH, "//input[@id='username']")

    方式2: 通过 name 属性

    username_input = driver.find_element(By.XPATH, "//input[@name='username']")

    username_input.send_keys("my_user")


定位单个元素 vs. 定位多个元素

方法 单个元素 (返回第一个) 多个元素 (返回列表)
find_element driver.find_element(By.ID, "username") -
find_elements - driver.find_elements(By.TAG_NAME, "a")

注意find_elements (复数) 即使没有找到元素,也不会抛出异常,而是返回一个空列表 [],这在处理不确定数量的元素时非常有用。


定位策略与最佳实践

  1. 优先级顺序

    • ID > Name > Class Name > Link Text / Partial Link Text
    • 如果以上都不可用,再使用 CSS SelectorXPath
  2. CSS Selector vs. XPath

    • CSS Selector:语法更简洁、性能通常略好于 XPath,是现代前端开发的主流选择,推荐优先使用。
    • XPath:功能更强大,可以向后查找(),可以进行复杂的逻辑判断(and, or),当 CSS Selector 无法满足复杂定位需求时,再使用 XPath。
  3. 避免脆弱的定位方式

    • 绝对路径 (如 /html/body/div[1]/form/input):页面结构一旦稍有变动,定位就会失败,非常脆弱。
    • 仅靠文本可能动态变化,不够稳定。
  4. 使用明确的属性:尽量使用 id, name, 或其他能唯一标识元素的属性。class 是动态生成的,不要依赖它。

  5. 提高代码可读性:使用有意义的变量名。

    # 不好的写法
    elem = driver.find_element(By.CSS_SELECTOR, "#login-form > div.form-group > input.form-control")
    elem.send_keys("test")
    # 好的写法
    login_form = driver.find_element(By.ID, "login-form")
    username_input = login_form.find_element(By.CSS_SELECTOR, "input[name='username']")
    username_input.send_keys("test")

    这里我们先用 ID 定位到整个表单,然后在表单这个“小范围”内再定位输入框,这样更稳定,也更容易理解。


处理定位异常

当你尝试定位一个不存在的元素时,Selenium 会抛出 NoSuchElementException 异常,一个好的程序应该能够优雅地处理这种异常。

from selenium.common.exceptions import NoSuchElementException
try:
    # 尝试定位一个不存在的元素
    non_existent_element = driver.find_element(By.ID, "i-do-not-exist")
    non_existent_element.click()
except NoSuchElementException:
    print("定位元素失败,该元素不存在或页面未加载完成!")
finally:
    driver.quit() # 无论成功与否,最后都关闭浏览器
定位方式 优点 缺点 适用场景
ID 最稳定、优先级最高 要求元素有 id 属性且唯一 任何有 id 的元素
Name 简单 可能不唯一 表单元素(input, select等)
Class Name 简单 可能有多个,动态生成时不可靠 样式相关的元素
Tag Name 简单 通用性太强,不唯一 定位一类通用元素(如<a>
Link Text 专门用于链接 必须精确匹配文本 超链接
Partial Link Text 灵活,可匹配部分文本 可能匹配到多个链接 长链接或动态链接
CSS Selector 强大、灵活、性能好 学习成本略高 复杂定位的首选
XPath 非常强大,功能最全 语法复杂,性能略逊 CSS Selector 无法解决的复杂定位

掌握这 8 种定位方法,并根据实际情况选择最合适的策略,是使用 Selenium 进行自动化测试和爬虫开发的必备技能。

分享:
扫描分享到社交APP
上一篇
下一篇