
Selenium是一个强大的网页自动化测试工具,也被广泛用于网络爬虫开发。本文将详细介绍Python Selenium库的核心使用方法,并提供实用的代码示例。
1. 安装与环境配置
pip install selenium -U浏览器 | 驱动下载地址 |
|---|---|
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 中,或在代码中显式指定路径,避免版本冲突。
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)driver.get('https://www.example.com')driver.maximize_window() # 最大化
driver.set_window_size(1280, 720) # 设置窗口大小
driver.back() # 后退
driver.forward() # 前进
driver.refresh() # 刷新
print(driver.current_url) # 当前 URL
print(driver.title) # 页面标题driver.quit() # 关闭所有窗口并释放进程find_element)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")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)time.sleep)类型 | 使用场景 | 示例 |
|---|---|---|
强制等待 | 调试阶段 | time.sleep(5) |
隐式等待 | 全局设置 | driver.implicitly_wait(10) |
显式等待 | 精确等待 | 见下方 |
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')
)# 滚动到页面底部
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
# 高亮元素
driver.execute_script("arguments[0].style.border='3px solid red'", element)iframe = driver.find_element(By.TAG_NAME, 'iframe')
driver.switch_to.frame(iframe) # 进入 iframe
driver.switch_to.default_content() # 返回主文档
driver.switch_to.parent_frame() # 返回父 iframealert = driver.switch_to.alert
print(alert.text) # 获取文本
alert.accept() # 确认
alert.dismiss() # 取消
alert.send_keys('OK') # prompt 输入file_input = driver.find_element(By.NAME, 'file')
file_input.send_keys(r'C:\path\to\file.txt') # 必须是绝对路径若上传按钮被
<input type="file" hidden>隐藏,可先执行 JS 取消hidden属性。
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() # 多选时取消全部driver.save_screenshot('screenshot.png')
png_bytes = driver.get_screenshot_as_png() # 二进制
base64_str = driver.get_screenshot_as_base64() # Base64场景:点击超链接后打开新标签页,需要切换上下文才能继续操作。
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) # 切回原标签利用Chrome DevTools Protocol实现原生API难以覆盖的能力,例如屏蔽图片、拦截请求、修改 UA。
# 屏蔽图片,提升加载速度
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)'
})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)下载完成后,可轮询目录直到文件出现或超时。
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()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')elm = driver.find_element(By.ID, 'footer')
driver.execute_script('arguments[0].scrollIntoView({behavior: "smooth"});', elm)pwd = driver.find_element(By.ID, 'password')
driver.execute_script('arguments[0].removeAttribute("required")', pwd)driver.execute_cdp_cmd('Network.enable', {})
logs = driver.get_log('performance') # 需开启 loggingPrefs解析 logs 可拿到 XHR/Fetch 请求详情,实现接口级断言。
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)) # 等待旧节点失效1、自动化登录示例
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()# 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执行;
“无他,惟手熟尔”!有需要就用起来。
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!