CodeGym /课程 /Python SELF ZH / 通过 HTML 属性查找元素:id, class

通过 HTML 属性查找元素:id, class

Python SELF ZH
第 35 级, 课程 3
可用

1. 查找元素的基础

查找元素的方法

在深入代码之前,重要的是先了解如何使用 Selenium 在网页上查找元素。 Selenium 提供了几种方便的方法来查找元素:

  • find_element_by_id():通过元素的唯一标识符 (id) 查找元素。
  • find_element_by_name():通过元素的 name 属性查找元素。
  • find_element_by_class_name():查找具有指定 class 的元素。
  • find_element_by_tag_name():使用标签名查找元素,例如 div、p、a。

重要提示:这是 Selenium 3 的写法。Selenium 4 已经移除了这些方法,使用 By 的现代写法见下一节。

让我们从一个简单的例子开始——通过 id 查找一个元素。假设我们丢失了一颗写着“魔法按钮”的按钮,我们需要找到它:

Python

from selenium import webdriver

# 设置驱动程序并打开浏览器
driver = webdriver.Chrome()
driver.get('https://example.com')

# 根据 id 查找元素
magic_button = driver.find_element_by_id('magic_button_id')

# 操作找到的元素(例如,提取文本)
print(magic_button.text)

# 结束会话
driver.quit()

操作找到的元素

找到元素后,接下来就是决定如何操作它。发挥想象力,运用 Selenium 提供的方法,比如用 text 获取元素的文本内容,或者用 get_attribute('attribute_name') 获取元素的某个属性值。

假设我们的元素是一个链接,我们想知道它指向哪里。我们可以这样做:

Python

# 查找带链接的元素
link_element = driver.find_element_by_class_name('link_class')

# 从 href 属性中提取 URL
link_url = link_element.get_attribute('href')
print(f'这个链接指向:{link_url}')

2. Selenium 4:使用 By 的现代查找方式

本节之后讲解的内容都是经典的 Selenium 3 写法。在 Selenium 4 中,find_element_by_* 方法先是被标记为废弃,从 Selenium 4.3.0 版本开始被彻底移除。如果在较新版本的库上运行这样的代码,你会得到 AttributeError。

一整套独立的方法只剩下一个通用的 find_element():第一个参数传入 By 类中的查找策略,第二个参数传入具体的值。By 类需要单独导入:

Python

from selenium.webdriver.common.by import By

对照表

Selenium 3 Selenium 4 作用
find_element_by_id('magic_button_id') find_element(By.ID, 'magic_button_id') 通过元素的唯一标识符 (id) 查找元素。
find_element_by_name('name') find_element(By.NAME, 'name') 通过元素的 name 属性查找元素。
find_element_by_class_name('class') find_element(By.CLASS_NAME, 'class') 查找具有指定 class 的元素。
find_element_by_tag_name('tag') find_element(By.TAG_NAME, 'tag') 使用标签名查找元素,例如 div、p、a。

查找所有匹配元素的方式也是同样的变化:find_elements_by_*() 这一系列被单个 find_elements() 取代,接受同样的 By 策略。除了上面列出的四种,By 类还提供 By.XPATH、By.CSS_SELECTOR、By.LINK_TEXT 和 By.PARTIAL_LINK_TEXT——我们会在后面的课程中讲到。

同一个例子,改用 Selenium 4

Python

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

# 设置驱动程序并打开浏览器
driver = webdriver.Chrome()
driver.get('https://example.com')

# 根据 id 查找元素
magic_button = driver.find_element(By.ID, 'magic_button_id')

# 操作找到的元素(例如,提取文本)
print(magic_button.text)

# 结束会话
driver.quit()

可以看到,只有查找那一行发生了变化,其余部分完全一样:方法返回的仍是同一个元素对象,text、get_attribute()、click() 和 send_keys() 都照常可用。

本节之后,每个方法仍以经典的 find_element_by_* 形式讲解——你在旧代码和部分练习题中遇到的正是这种写法。要把其中任何一个迁移到 Selenium 4,只需按上面的对照表做一次机械替换。

3. 方法 find_element_by_id()

方法 find_element_by_id() 是在网页上搜索元素最快且最可靠的方法之一。 它使用元素的唯一属性 id 进行查找。在 HTML 中,id 是一个唯一标识符,因此可以确保方法返回唯一需要的元素。

使用示例:

Python

element = driver.find_element_by_id("submit-button")

在这个例子中,Selenium 查找 id="submit-button" 的元素并将其存储到 element 变量中。 这种方法特别适合搜索按钮、表单、输入框等页面中不太可能重复的唯一元素。

适用场景?

每当一个元素有唯一的 id 时,都推荐使用 find_element_by_id() , 因为这种方法提供快速且精确的访问。

4. 方法 find_element_by_name()

方法 find_element_by_name() 通过 name 属性查找元素。 它常用于表单和输入框,特别是当元素可能有相同的 class 或 id ,但拥有不同的 name 时。 与 id 不同,name 属性不一定是唯一的,因此页面上可能有多个具有相同 name 的元素。

使用示例:

Python

element = driver.find_element_by_name("username")

此代码查找 name="username" 的元素。通常这是登录表单中用于输入用户名的字段。

适用场景?

如果页面上的元素没有唯一的 id,但有指定的 name 属性,这种方法非常有用。 它对表单输入特别有效,其中元素通常通过 name 进行标识。

5. 方法 find_element_by_class_name()

方法 find_element_by_class_name() 通过类 (class) 查找元素。 它适合用于 CSS,可以找到具有相同样式的元素。需要注意的是,class 可能被分配给多个元素, 因此如果需要查找唯一的元素,务必明确唯一的 class 或使用其他方法。

使用示例:

Python

element = driver.find_element_by_class_name("main-header")

在这个例子中,Selenium 查找第一个带有 class 为 main-header 的元素。

适用场景?

find_element_by_class_name() 常用于查找标题、按钮和其他样式化的元素。 如果元素没有唯一的 id 或 name,这个方法很有帮助, 特别是在需要通过样式定位元素时。

6. 方法 find_element_by_tag_name()

方法 find_element_by_tag_name() 按标签名字查找元素,例如 div、p、a、input。 它适合获取同一类型的所有元素,特别是当页面结构允许按标签轻松导航时。

使用示例:

Python

element = driver.find_element_by_tag_name("h1")

在这里,Selenium 查找第一个 h1 标签的元素,通常用于页面标题。

适用场景?

find_element_by_tag_name() 方法适合查找标题、图片、段落及其他页面中以某种标签呈现的元素。 不过,因为页面上可能有很多同类型的标签,这种方法不一定能精确定位到具体的元素。

7. 注意事项和错误

在我们继续之前,让我们暂停一下,感叹一下 HTML 的多样性。 有时像按钮或图片这样的元素可能没有唯一的 id 或 class。 这种情况下,更复杂的查找方法,例如 XPath 和 CSS 选择器,将会派上用场,我们将在下一讲中探讨。 但如果现在就遇到这样的问题,不要慌张。这只是 Web 自动化世界的一部分乐趣。

选择器的脆弱性

当使用像 id 和 class 这样的属性时,请记住它们可能会发生变化。 如果选取的元素的 id 突然改变,可能会导致错误。 这是在动态生成页面时特别常见的情况,这种情况下 id 可能是随机生成的。 解决方法?使用更稳定的属性或组合方法。

8. 实践应用

现在我们知道如何通过 id、class 和 name 查找元素了。 这些知识用途广泛,特别是在网页交互自动化方面。 成功找到的元素可以用来填写表单、点击按钮或提取信息——这些操作能显著加快你的工作进程,减少枯燥任务。

想象一下某家公司,员工每天花 10 分钟填写相同的网页表单。 这时 Selenium 就能登场:它可以在几分钟内完成所有这些工作,而你可以悠闲地享用早晨的咖啡。

对于那些感兴趣真实案例的人来说,Selenium 的自动化技术已被广泛应用于测试 Web 应用、监控网站变化, 甚至在你最爱的社交网站上忘记密码时帮助你强力恢复账号(如果算法怀疑你无法辨认熊猫照片中的自己)。

1
任务
Python SELF ZH, 第 35 级, 课程 3
已锁定
通过唯一标识符查找元素
通过唯一标识符查找元素
2
任务
Python SELF ZH, 第 35 级, 课程 3
已锁定
从类中查找和提取URL
从类中查找和提取URL
3
任务
Python SELF ZH, 第 35 级, 课程 3
已锁定
查找和与按钮的交互
查找和与按钮的交互
4
任务
Python SELF ZH, 第 35 级, 课程 3
已锁定
查找表格中的元素并进行操作
查找表格中的元素并进行操作
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION