首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python Selenium库自动化网页任务

Python Selenium库自动化网页任务

作者头像
用户11081884
发布2026-07-20 18:38:37
发布2026-07-20 18:38:37
1210
举报

Selenium是一个强大的网页自动化测试工具,也被广泛用于网络爬虫开发。本文将详细介绍Python Selenium库的核心使用方法,并提供实用的代码示例。

1. 安装与环境配置

1.1 安装 Selenium

代码语言:javascript
复制
pip install selenium -U

1.2 下载浏览器驱动

浏览器

驱动下载地址

Chrome

https://googlechromelabs.github.io/chrome-for-testing/

Firefox

https://github.com/mozilla/geckodriver/releases

Edge

https://developer.microsoft.com/microsoft-edge/tools/webdriver/

推荐做法:将驱动程序放在系统 PATH 中,或在代码中显式指定路径,避免版本冲突。


2. 基本用法

2.1 启动浏览器

代码语言:javascript
复制
fromseleniumimportwebdriver
fromselenium.webdriver.chrome.serviceimportService
fromselenium.webdriver.chrome.optionsimportOptions

# 推荐:使用 Chrome-for-Testing,避免版本不匹配
service = Service(executable_path='chromedriver.exe')
options = Options()
options.add_argument('--start-maximized')   # 启动即最大化
driver = webdriver.Chrome(service=service, options=options)

2.2 访问网页

代码语言:javascript
复制
driver.get('https://www.example.com')

2.3 浏览器控制常用接口

代码语言:javascript
复制
driver.maximize_window()          # 最大化
driver.set_window_size(1280, 720) # 设置窗口大小
driver.back()                     # 后退
driver.forward()                  # 前进
driver.refresh()                  # 刷新

print(driver.current_url)         # 当前 URL
print(driver.title)               # 页面标题

2.4 释放资源

代码语言:javascript
复制
driver.quit()  # 关闭所有窗口并释放进程

3. 元素定位(使用统一入口 find_element

代码语言:javascript
复制
fromselenium.webdriver.common.byimportBy

driver.find_element(By.ID, 'element_id')
driver.find_element(By.NAME, 'element_name')
driver.find_element(By.CLASS_NAME, 'element_class')
driver.find_element(By.TAG_NAME, 'div')
driver.find_element(By.LINK_TEXT, '完整链接文本')
driver.find_element(By.PARTIAL_LINK_TEXT, '部分链接文本')
driver.find_element(By.CSS_SELECTOR, 'div.content > p')
driver.find_element(By.XPATH, "//div[@id='content']/p")

4. 元素交互

代码语言:javascript
复制
search_box = driver.find_element(By.NAME, 'q')
search_box.send_keys('Python Selenium')  # 输入
search_box.clear()                       # 清空
search_box.submit()                      # 回车提交

btn = driver.find_element(By.ID, 'submit')
btn.click()                              # 点击

text = btn.text                          # 获取文本
href = btn.get_attribute('href')         # 获取属性
is_visible = btn.is_displayed()          # 是否可见
is_enabled = btn.is_enabled()            # 是否可点击
is_selected = btn.is_selected()          # 是否选中(checkbox/radio)

5. 等待机制(避免 time.sleep

类型

使用场景

示例

强制等待

调试阶段

time.sleep(5)

隐式等待

全局设置

driver.implicitly_wait(10)

显式等待

精确等待

见下方

代码语言:javascript
复制
fromselenium.webdriver.support.uiimportWebDriverWait
fromselenium.webdriver.supportimportexpected_conditionsasEC

# 等待元素可见并可点击
element = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.ID, 'login-btn'))
)

# 等待 URL 包含关键字
WebDriverWait(driver, 10).until(
    EC.url_contains('dashboard')
)

6. 高级技巧

6.1 执行 JavaScript

代码语言:javascript
复制
# 滚动到页面底部
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')

# 高亮元素
driver.execute_script("arguments[0].style.border='3px solid red'", element)

6.2 处理 iframe

代码语言:javascript
复制
iframe = driver.find_element(By.TAG_NAME, 'iframe')
driver.switch_to.frame(iframe)      # 进入 iframe
driver.switch_to.default_content()  # 返回主文档
driver.switch_to.parent_frame()     # 返回父 iframe

6.3 处理弹窗(alert / confirm / prompt)

代码语言:javascript
复制
alert = driver.switch_to.alert
print(alert.text)      # 获取文本
alert.accept()         # 确认
alert.dismiss()        # 取消
alert.send_keys('OK')  # prompt 输入

6.4 文件上传

代码语言:javascript
复制
file_input = driver.find_element(By.NAME, 'file')
file_input.send_keys(r'C:\path\to\file.txt')  # 必须是绝对路径

若上传按钮被 <input type="file" hidden> 隐藏,可先执行 JS 取消 hidden 属性。

6.5 下拉选择框

代码语言:javascript
复制
fromselenium.webdriver.support.uiimportSelect

select = Select(driver.find_element(By.ID, 'city'))
select.select_by_visible_text('上海')
select.select_by_value('sh')
select.select_by_index(2)
select.deselect_all()  # 多选时取消全部

6.6 屏幕截图

代码语言:javascript
复制
driver.save_screenshot('screenshot.png')
png_bytes = driver.get_screenshot_as_png()     # 二进制
base64_str = driver.get_screenshot_as_base64() # Base64

6.7 多窗口/标签页切换

场景:点击超链接后打开新标签页,需要切换上下文才能继续操作。

代码语言:javascript
复制
original = driver.current_window_handle
driver.find_element(By.LINK_TEXT, 'Open New Tab').click()

WebDriverWait(driver, 10).until(lambdad: len(d.window_handles) >1)
driver.switch_to.window(driver.window_handles[-1])  # 切到新标签
# 业务操作 ……
driver.close()                       # 关闭新标签
driver.switch_to.window(original)    # 切回原标签

6.8 执行 CDP 命令(仅 Chrome)

利用Chrome DevTools Protocol实现原生API难以覆盖的能力,例如屏蔽图片、拦截请求、修改 UA

代码语言:javascript
复制
# 屏蔽图片,提升加载速度
driver.execute_cdp_cmd('Network.enable', {})
driver.execute_cdp_cmd('Network.setBlockedURLs', {'urls': ['*.jpg', '*.png']})

# 修改 UA
driver.execute_cdp_cmd('Network.setUserAgentOverride', {
    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)'
})

6.9 下载文件(自动保存到指定目录)

代码语言:javascript
复制
frompathlibimportPath

download_dir = Path.cwd() /'downloads'
download_dir.mkdir(exist_ok=True)

prefs = {
    'download.default_directory': str(download_dir.absolute()),
    'download.prompt_for_download': False,
    'safebrowsing.enabled': False
}
options.add_experimental_option('prefs', prefs)

下载完成后,可轮询目录直到文件出现或超时。

6.10 鼠标悬停 & 拖拽

代码语言:javascript
复制
fromselenium.webdriverimportActionChains

menu = driver.find_element(By.ID, 'menu')
ActionChains(driver).move_to_element(menu).perform()  # 悬停

src = driver.find_element(By.ID, 'draggable')
dst = driver.find_element(By.ID, 'droppable')
ActionChains(driver).drag_and_drop(src, dst).perform()

6.11 键盘组合键 & 粘贴板

代码语言:javascript
复制
fromselenium.webdriver.common.keysimportKeys

# Ctrl + A → Ctrl + C
elm = driver.find_element(By.TAG_NAME, 'body')
elm.send_keys(Keys.CONTROL, 'a')
elm.send_keys(Keys.CONTROL, 'c')

# 使用 pyperclip 读写系统剪贴板
importpyperclip
pyperclip.copy('Hello Selenium')
elm.send_keys(Keys.CONTROL, 'v')

6.12 滚动到任意元素可见

代码语言:javascript
复制
elm = driver.find_element(By.ID, 'footer')
driver.execute_script('arguments[0].scrollIntoView({behavior: "smooth"});', elm)

6.13 修改/删除元素属性(隐藏输入框校验)

代码语言:javascript
复制
pwd = driver.find_element(By.ID, 'password')
driver.execute_script('arguments[0].removeAttribute("required")', pwd)

6.14 获取网络请求 & 响应(配合 Chrome DevTools)

代码语言:javascript
复制
driver.execute_cdp_cmd('Network.enable', {})
logs = driver.get_log('performance')  # 需开启 loggingPrefs

解析 logs 可拿到 XHR/Fetch 请求详情,实现接口级断言。


6.15 使用事件监听等待 DOM 变更

代码语言:javascript
复制
fromselenium.webdriver.support.uiimportWebDriverWait
fromselenium.webdriver.support.expected_conditionsimportstaleness_of

old = driver.find_element(By.ID, 'content')
driver.find_element(By.ID, 'refresh-btn').click()
WebDriverWait(driver, 10).until(staleness_of(old))  # 等待旧节点失效

7. 实战

1、自动化登录示例

代码语言:javascript
复制
fromseleniumimportwebdriver
fromselenium.webdriver.common.byimportBy
fromselenium.webdriver.chrome.serviceimportService
fromselenium.webdriver.chrome.optionsimportOptions
fromselenium.webdriver.support.uiimportWebDriverWait
fromselenium.webdriver.supportimportexpected_conditionsasEC

# 1. 启动浏览器
service = Service('chromedriver.exe')
options = Options()
options.add_argument('--start-maximized')
driver = webdriver.Chrome(service=service, options=options)

try:
    # 2. 访问登录页
    driver.get('https://example.com/login')

    # 3. 输入账号密码
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, 'username'))
    ).send_keys('your_username')

    driver.find_element(By.ID, 'password').send_keys('your_password')

    # 4. 提交表单
    driver.find_element(By.XPATH, "//button[@type='submit']").click()

    # 5. 断言登录成功
    WebDriverWait(driver, 10).until(
        EC.url_contains('dashboard')
    )
    print('登录成功,当前标题:', driver.title)

finally:
    # 6. 关闭浏览器
    driver.quit()

2、与 pytest 深度集成(fixture + 自动截图)示例

代码语言:javascript
复制
# conftest.py
importpytest
fromseleniumimportwebdriver

@pytest.fixture(scope='function')
defchrome():
    driver = webdriver.Chrome()
    yielddriver
    driver.quit()

@pytest.hookimpl(tryfirst=True, hookwrapper=True)
defpytest_runtest_makereport(item):
    outcome = yield
    rep = outcome.get_result()
    ifrep.when == 'call'andrep.failed:
        driver = item.funcargs.get('chrome')
        ifdriver:
            driver.save_screenshot(f'{item.nodeid}.png'.replace('::', '_'))

测试失败时自动截图,方便 CI 回溯。

通过掌握这些Selenium使用方法,可以实现各种网页自动化任务和爬虫开发需求。

1、使用Selenium时,应尽量使用显式等待而非强制等待;

2、定位元素时,优先使用ID、name等稳定属性;

3、处理动态加载内容时,需要合理设置等待时间;

4、完成操作后,务必调用driver.quit()释放资源;

5、对于复杂的网页操作,可以结合JavaScript执行;

“无他,惟手熟尔”!有需要就用起来。

如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-09-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Nicholas与Pypi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.1 安装 Selenium
  • 1.2 下载浏览器驱动
  • 2. 基本用法
    • 2.1 启动浏览器
    • 2.2 访问网页
    • 2.3 浏览器控制常用接口
    • 2.4 释放资源
  • 3. 元素定位(使用统一入口 find_element)
  • 4. 元素交互
  • 5. 等待机制(避免 time.sleep)
  • 6. 高级技巧
    • 6.1 执行 JavaScript
    • 6.2 处理 iframe
    • 6.3 处理弹窗(alert / confirm / prompt)
    • 6.4 文件上传
    • 6.5 下拉选择框
    • 6.6 屏幕截图
    • 6.7 多窗口/标签页切换
    • 6.8 执行 CDP 命令(仅 Chrome)
    • 6.9 下载文件(自动保存到指定目录)
    • 6.10 鼠标悬停 & 拖拽
    • 6.11 键盘组合键 & 粘贴板
    • 6.12 滚动到任意元素可见
    • 6.13 修改/删除元素属性(隐藏输入框校验)
    • 6.14 获取网络请求 & 响应(配合 Chrome DevTools)
    • 6.15 使用事件监听等待 DOM 变更
  • 7. 实战
    • 2、与 pytest 深度集成(fixture + 自动截图)示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档