杰瑞科技汇

Selenium API怎么用?Python怎么用Selenium?

Selenium 是一个强大的自动化测试工具,通过它,你可以用 Python 代码来控制浏览器,模拟用户的点击、输入、导航等操作,从而实现网页的自动化测试、数据爬取等任务。

Selenium API怎么用?Python怎么用Selenium?-图1
(图片来源网络,侵删)

环境准备

在使用 Selenium API 之前,你需要先完成环境配置。

a) 安装 Selenium 库

打开你的终端或命令行工具,运行以下命令:

pip install selenium

b) 下载浏览器驱动

Selenium 本身不控制浏览器,它需要通过一个叫 WebDriver 的中间件来与浏览器通信,你需要为你的浏览器下载对应的驱动程序。

下载后,将驱动程序的可执行文件(如 chromedriver.exegeckodriver)放在一个固定的路径下,并将其添加到系统的环境变量 PATH 中。 这样 Selenium 就能自动找到它。

Selenium API怎么用?Python怎么用Selenium?-图2
(图片来源网络,侵删)

Selenium API 核心结构

Selenium 的 API 主要围绕以下几个核心对象展开:

对象 描述 常用方法
WebDriver 所有操作的基础,代表一个浏览器实例。 get(), find_element(), find_elements(), quit()
WebElement 代表 HTML 页面中的一个元素,可以对其进行交互。 click(), send_keys(), text, get_attribute()
Alert 处理浏览器弹出的警告框、确认框、提示框。 accept(), dismiss(), send_keys()
WebDriverWait & expected_conditions 实现智能等待,等待某个条件满足后再继续执行。 until()

核心功能详解与代码示例

下面我们通过最常用的 Chrome 浏览器,来演示 Selenium API 的核心功能。

a) 初始化浏览器驱动

你需要导入 webdriver 并创建一个 WebDriver 实例。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 指定 ChromeDriver 的路径(如果你的驱动不在 PATH 中)
# service = Service(executable_path='/path/to/your/chromedriver')
# driver = webdriver.Chrome(service=service)
# 如果驱动已在 PATH 中,可以直接这样初始化
driver = webdriver.Chrome()
try:
    # --- 1. 基本浏览器操作 ---
    # 打开一个网页
    driver.get("https://www.baidu.com")
    # 获取页面标题
    print("页面标题是:", driver.title)
    # 获取当前页面的 URL
    print("当前URL是:", driver.current_url)
    # 最大化窗口
    driver.maximize_window()
    # --- 2. 定位元素 ---
    # 元素定位是所有操作的基础,Selenium 提供了 8 种定位方式,最常用的是前两种:
    # By.ID, By.NAME, By.CLASS_NAME, By.TAG_NAME, By.LINK_TEXT, By.PARTIAL_LINK_TEXT, By.CSS_SELECTOR, By.XPATH
    # 方式一:通过 ID 定位(最推荐,因为 ID 通常唯一)
    search_box = driver.find_element(By.ID, "kw")
    # 方式二:通过 CSS Selector 定位(非常灵活和强大)
    # search_box = driver.find_element(By.CSS_SELECTOR, "#kw")
    # 方式三:通过 XPath 定位(可以处理复杂的文档结构)
    # search_box = driver.find_element(By.XPATH, '//*[@id="kw"]')
    # --- 3. 与元素交互 ---
    # 在搜索框中输入内容
    search_box.send_keys("Selenium Python API")
    # 模拟按下回车键
    search_box.send_keys(Keys.ENTER)
    # 等待 3 秒,观察结果
    driver.implicitly_wait(3) # 隐式等待,全局有效
    # --- 4. 获取元素信息 ---
    # 假设我们想获取第一个搜索结果的标题
    # 注意:页面刷新后,之前的元素引用可能已经失效,需要重新定位
    first_result = driver.find_element(By.CSS_SELECTOR, "div#content_left > div:nth-child(1) > h3 > a")
    print("第一个搜索结果的标题是:", first_result.text)
    print("链接的 href 属性是:", first_result.get_attribute('href'))
    # --- 5. 处理下拉框、多选框、单选框 ---
    # (示例省略,通常需要先定位到 select 元素,然后使用 Select 类)
    # from selenium.webdriver.support.ui import Select
    # select = Select(driver.find_element(By.ID, 'some-select'))
    # select.select_by_visible_text('选项一')
    # select.select_by_value('value1')
    # select.select_by_index(0)
    # --- 6. 处理弹窗 ---
    # driver.execute_script("alert('这是一个测试弹窗!');")
    # alert = driver.switch_to.alert
    # print("弹窗文本:", alert.text)
    # alert.accept()  # 点击“确定”
    # # alert.dismiss() # 点击“取消”
    # --- 7. 切换窗口/标签页 ---
    # 打开一个新标签页
    driver.execute_script("window.open('https://www.python.org');")
    # 获取所有窗口句柄
    windows = driver.window_handles
    print("所有窗口句柄:", windows)
    # 切换到新打开的窗口
    driver.switch_to.window(windows[-1])
    print("切换后窗口标题:", driver.title)
    # 关闭当前窗口,并切回原来的窗口
    driver.close()
    driver.switch_to.window(windows[0])
    # --- 8. 智能等待 ---
    # 隐式等待: 在查找元素时,如果元素没有立即找到,会等待最多指定的时间
    # driver.implicitly_wait(10) # 通常在初始化后设置一次即可
    # 显式等待: 更精确地等待某个条件成立,超时则抛出异常
    try:
        # 等待一个元素变为可点击状态
        wait = WebDriverWait(driver, 10) # 最多等待10秒
        submit_button = wait.until(
            EC.element_to_be_clickable((By.ID, "su"))
        )
        print("成功找到并等待了'百度一下'按钮可点击")
    except Exception as e:
        print(f"等待超时: {e}")
finally:
    # --- 9. 关闭浏览器 ---
    # 无论代码是否出错,最后都会执行此操作,确保浏览器被关闭
    driver.quit()

关键概念详解

a) 定位策略

  • ID (By.ID):首选,如果元素有唯一的 id 属性,这是最快最可靠的方式。
  • CSS Selector (By.CSS_SELECTOR):强烈推荐,功能强大,语法简洁,性能通常优于 XPath,可以通过元素的 ID、类名、属性、层级关系等来定位。
    • #id:通过 ID
    • .class:通过类名
    • [attribute='value']:通过属性
    • parent > child:直接子元素
    • div#content_left p:ID 为 content_leftdiv 下的所有 p
  • XPath (By.XPATH):功能最强大,可以处理任何复杂的文档结构,但语法相对复杂,性能可能稍差。
    • //div:查找所有的 div 元素
    • //*[@id='kw']:查找任意标签中 idkw 的元素
    • //div[@class='result']//a:查找类名为 resultdiv 下的所有 a

b) 等待机制

这是自动化脚本稳定性的关键。

  • 隐式等待 (implicitly_wait)

    • 作用:设置一个全局的等待时间,当使用 find_elementfind_elements 定位元素时,如果元素没有立即找到,它会轮询(每隔一段时间重试)查找,直到找到元素或超过设定的等待时间。
    • 特点:只需设置一次,作用于整个 WebDriver 实例的生命周期,但如果等待时间过长,可能会不必要地拖慢整个脚本的执行速度。
  • 显式等待 (WebDriverWait)

    • 作用:针对某个特定的条件进行等待,直到条件成立或超时。
    • 特点:更精确、更智能,你只需要等待你真正需要的那一个元素准备好,而不是盲目等待整个页面加载。
    • 常用条件 (expected_conditions)
      • EC.presence_of_element_located:元素存在于 DOM 中,但不一定可见。
      • EC.visibility_of_element_located:元素不仅存在于 DOM 中,而且可见(即 displayvisibility 属性不为隐藏)。
      • EC.element_to_be_clickable:元素可见且可被点击。
      • EC.title_contains包含特定文本。

最佳实践:优先使用 显式等待,在需要全局等待元素出现时,可以结合使用 隐式等待(设置一个较短的隐式等待时间,如 3-5 秒,作为后备)。

高级功能

  • 执行 JavaScript: driver.execute_script("js_code") 可以执行任意 JavaScript 代码,非常强大,可以用来滚动页面、高亮元素、修改页面内容等。
  • 截图: driver.save_screenshot('screenshot.png'),在调试或出错时非常有用。
  • 无头模式: 在不打开浏览器界面的情况下运行脚本,适合在服务器上运行。
    from selenium.webdriver.chrome.options import Options
    chrome_options = Options()
    chrome_options.add_argument("--headless") # 启用无头模式
    driver = webdriver.Chrome(options=chrome_options)

Selenium API 的核心思想是:先定位元素,再对元素进行操作,最后获取结果,掌握好元素定位和等待机制,就能解决 90% 以上的自动化问题,随着你实践的深入,你会越来越熟悉这些 API,并能写出更健壮、更高效的自动化脚本。

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