1. 页面元素查找基础
使用元素查找方法
当你开始在实际项目中用Selenium时,首先要完成的任务之一就是查找页面上的元素。这可以类比成在酒店里找电梯按钮:你得知道按钮在哪儿才能按它,然后去你想去的楼层。
Selenium 提供了多种方法来查找元素。根据你的喜好,你可以用 find_element_by_id
,
find_element_by_name
,
find_element_by_xpath
,
find_element_by_css_selector
,等等。回顾一下你已经知道的内容,然后写个简单的例子:
from selenium import webdriver
# 创建浏览器实例(这里用Chrome)
driver = webdriver.Chrome()
# 打开页面
driver.get('http://example.com')
# 通过ID查找元素
element_by_id = driver.find_element_by_id('main')
# 通过name查找元素
element_by_name = driver.find_element_by_name('username')
# 通过XPath查找元素
element_by_xpath = driver.find_element_by_xpath('//div[@class="content"]')
# 通过CSS选择器查找元素
element_by_css = driver.find_element_by_css_selector('div.content')
find_element和find_elements的区别
当你想捕获多个元素时(比如所有class是btn
的按钮),你会需要用find_elements
方法。find_element
和find_elements
的区别在于,前者返回一个元素,后者返回的是一个元素列表。
# 查找单个元素
single_element = driver.find_element_by_class_name('btn')
# 查找多个元素
multiple_elements = driver.find_elements_by_class_name('btn')
# 遍历找到的元素
for element in multiple_elements:
print(element.text)
如你所见,find_elements
非常适合用来处理页面上可能有多个的元素集合。每种find_element_xxx
方法都有对应的find_elements_xxx
,它返回的是一个元素列表。
2. 与元素的互动操作
与按钮、链接和输入框交互
现在你回顾了如何查找元素,是时候复习一下如何与它们交互了!这就像玩LEGO套件:需要准确地组合这些部件才能实现你的目标。
Selenium提供的方法可以用来与元素交互。我们再来看看,这是如何完成的:
# 点击按钮
button = driver.find_element_by_id('submit')
button.click()
# 在输入框中输入文本
input_field = driver.find_element_by_name('q')
input_field.send_keys('Python selenium tutorial')
# 获取元素文本
header = driver.find_element_by_tag_name('h1')
print(header.text)
处理事件和动态元素的操作
当涉及到动态元素的交互时,比如某些操作后才会出现的按钮,等待和延迟变得十分重要。Selenium 提供了方法来等待这些元素加载。一个常用的工具是将WebDriverWait
和expected_conditions
结合起来使用。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 等待按钮出现10秒
button = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'submit'))
)
button.click()
注意。 为了不每次都写expected_conditions
,我们在import时已经将它重命名为EC
。
使用等待让你的脚本更可靠,不会因为临时的延迟或页面加载较慢而出错。在实际操作中,这样的情况非常常见——几乎每天都会遇到 :)
3. 有什么可能会出错?
什么都可能出错。 当你准备和元素交互时,突然就出现了问题。让我们讨论一些你可能会遇到的典型错误。
首先,NoSuchElementException
——这是一个你可能经常看到的错误信息,尤其是当你试图查找页面上不存在的元素时。它会在你试图查找一个不存在的元素时被抛出。为了防止这种情况,你可以用try-except
方法来捕获异常。
from selenium.common.exceptions import NoSuchElementException
try:
element = driver.find_element_by_id('non_existent_id')
except NoSuchElementException:
print("哎呀,元素好像找不到了!")
可能还会碰到动态元素和加载时间的问题。在这种情况下,请用我们之前讨论过的WebDriverWait
来等待元素加载。
GO TO FULL VERSION