Token导航 LogoToken导航TokenDH.com
研究检索操作浏览器github未标认证来源可访问clear审计通过

selenium-automation硒自动化

Agent Skill

selenium-automation 用于处理浏览器自动化、网页检查和页面信息提取,适合在 Codex、Claude、Cursor、Gemini CLI 中需要让 Agent 打开页面、读取网页或验证前端流程时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

12,059

周安装

518

GitHub Stars

87

下载量

4,227
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

3

许可证

MIT

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:selenium-automation(硒自动化)
来源仓库:https://github.com/mindrally/skills
仓库路径:skills/selenium-automation
安装命令:
npx skills add https://github.com/mindrally/skills --skill selenium-automation
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。不同来源提供的安装方式可能略有差异;本站展示可直接复制的安装命令,安装前请核对来源页面。

skills.shnpx skills
npx skills add https://github.com/mindrally/skills --skill selenium-automation

简介

selenium-automation 用于浏览器自动化、网页检查和页面信息提取。

  • 适合让 Agent 打开页面、读取内容或验证前端流程的场景。
  • 通过 npx skills add 命令安装,建议结合原始 README 了解具体实现。
  • 安装前应确认权限范围和维护状态,避免触发不必要的网络请求。
  • 涉及真实页面操作时应区分模拟环境和生产环境。

SKILL.md

Selenium Browser Automation

You are an expert in Selenium WebDriver, browser automation, web testing, and building reliable automated test suites for web applications.

Core Expertise

  • Selenium WebDriver architecture and browser drivers
  • Element location strategies (ID, CSS, XPath, link text)
  • Explicit and implicit waits for dynamic content
  • Page Object Model (POM) design pattern
  • Cross-browser testing with Chrome, Firefox, Safari, Edge
  • Headless browser execution
  • Integration with pytest, unittest, and other test frameworks
  • Grid deployment for parallel test execution

Key Principles

  • Write maintainable, readable test code following PEP 8 style guidelines
  • Implement the Page Object Model pattern for code reusability
  • Use explicit waits instead of implicit waits or hard-coded sleeps
  • Design tests for independence and isolation
  • Handle dynamic content and asynchronous operations properly
  • Follow DRY principles with helper functions and base classes

Project Structure

tests/
    conftest.py
    pages/
        __init__.py
        base_page.py
        login_page.py
        dashboard_page.py
    tests/
        __init__.py
        test_login.py
        test_dashboard.py
    utils/
        __init__.py
        driver_factory.py
        config.py

WebDriver Setup

Driver Factory Pattern

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service

def create_driver(browser='chrome', headless=False):
    if browser == 'chrome':
        options = Options()
        if headless:
            options.add_argument('--headless')
        options.add_argument('--no-sandbox')
        options.add_argument('--disable-dev-shm-usage')
        service = Service(ChromeDriverManager().install())
        return webdriver.Chrome(service=service, options=options)
    # Add other browsers as needed

Pytest Fixtures

import pytest
from utils.driver_factory import create_driver

@pytest.fixture(scope='function')
def driver():
    driver = create_driver(headless=True)
    driver.implicitly_wait(10)
    yield driver
    driver.quit()

Page Object Model

Base Page Class

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class BasePage:
    def __init__(self, driver):
        self.driver = driver
        self.wait = WebDriverWait(driver, 10)

    def find_element(self, locator):
        return self.wait.until(EC.presence_of_element_located(locator))

    def click_element(self, locator):
        element = self.wait.until(EC.element_to_be_clickable(locator))
        element.click()

    def enter_text(self, locator, text):
        element = self.find_element(locator)
        element.clear()
        element.send_keys(text)

Page Object Implementation

from selenium.webdriver.common.by import By
from pages.base_page import BasePage

class LoginPage(BasePage):
    # Locators
    USERNAME_INPUT = (By.ID, 'username')
    PASSWORD_INPUT = (By.ID, 'password')
    LOGIN_BUTTON = (By.CSS_SELECTOR, 'button[type="submit"]')
    ERROR_MESSAGE = (By.CLASS_NAME, 'error-message')

    def __init__(self, driver):
        super().__init__(driver)
        self.url = '/login'

    def login(self, username, password):
        self.enter_text(self.USERNAME_INPUT, username)
        self.enter_text(self.PASSWORD_INPUT, password)
        self.click_element(self.LOGIN_BUTTON)

    def get_error_message(self):
        return self.find_element(self.ERROR_MESSAGE).text

Element Location Strategies

Preferred Order (Most to Least Reliable)

  1. ID - Most reliable when available
  2. Name - Good for form elements
  3. CSS Selector - Fast and readable
  4. XPath - Powerful but can be brittle
  5. Link Text - For anchor elements
  6. Class Name - Avoid if class changes frequently

CSS Selector Best Practices

# Good: Specific, stable selectors
By.CSS_SELECTOR, 'form#login input[name="username"]'
By.CSS_SELECTOR, '[data-testid="submit-button"]'

# Avoid: Fragile selectors
By.CSS_SELECTOR, 'div > div > div > button'  # Too structural
By.CSS_SELECTOR, '.btn-primary'  # Class might change

XPath Best Practices

# Use for complex relationships
By.XPATH, '//label[text()="Email"]/following-sibling::input'
By.XPATH, '//table//tr[contains(., "John")]//button[@class="edit"]'

Waits and Synchronization

Explicit Waits (Preferred)

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)

# Wait for element to be clickable
element = wait.until(EC.element_to_be_clickable((By.ID, 'button')))

# Wait for element to be visible
element = wait.until(EC.visibility_of_element_located((By.ID, 'modal')))

# Wait for text to be present
wait.until(EC.text_to_be_present_in_element((By.ID, 'status'), 'Complete'))

# Custom wait condition
wait.until(lambda d: d.find_element(By.ID, 'count').text == '5')

Common Expected Conditions

  • presence_of_element_located - Element exists in DOM
  • visibility_of_element_located - Element is visible
  • element_to_be_clickable - Element is visible and enabled
  • staleness_of - Element is no longer attached to DOM
  • frame_to_be_available_and_switch_to_it - Frame is available

Test Writing Best Practices

Test Structure

import pytest
from pages.login_page import LoginPage
from pages.dashboard_page import DashboardPage

class TestLogin:
    @pytest.fixture(autouse=True)
    def setup(self, driver):
        self.driver = driver
        self.login_page = LoginPage(driver)
        self.dashboard_page = DashboardPage(driver)

    def test_successful_login(self):
        """Verify user can login with valid credentials"""
        self.driver.get('https://example.com/login')
        self.login_page.login('valid_user', 'valid_pass')
        assert self.dashboard_page.is_displayed()

    def test_invalid_password_shows_error(self):
        """Verify error message displays for invalid password"""
        self.driver.get('https://example.com/login')
        self.login_page.login('valid_user', 'wrong_pass')
        assert 'Invalid credentials' in self.login_page.get_error_message()

Test Naming Conventions

  • Use descriptive names: test_login_with_valid_credentials_redirects_to_dashboard
  • Include the action and expected outcome
  • Group related tests in classes

Handling Special Elements

Dropdowns

from selenium.webdriver.support.ui import Select

select = Select(driver.find_element(By.ID, 'country'))
select.select_by_visible_text('United States')
select.select_by_value('us')
select.select_by_index(1)

Alerts

alert = driver.switch_to.alert
alert.accept()  # Click OK
alert.dismiss()  # Click Cancel
alert.send_keys('input text')  # Type in prompt

Frames

driver.switch_to.frame('frame_name')
# Or by element
frame = driver.find_element(By.ID, 'myframe')
driver.switch_to.frame(frame)
# Return to main content
driver.switch_to.default_content()

Multiple Windows

original_window = driver.current_window_handle
# Click link that opens new window
for handle in driver.window_handles:
    if handle != original_window:
        driver.switch_to.window(handle)
        break
# Return to original
driver.switch_to.window(original_window)

Performance and Reliability

  • Run tests in headless mode for faster execution
  • Use parallel execution with pytest-xdist
  • Implement retry logic for flaky tests
  • Take screenshots on failure for debugging
  • Use WebDriverWait instead of time.sleep()

Key Dependencies

  • selenium
  • webdriver-manager
  • pytest
  • pytest-xdist (parallel execution)
  • pytest-html (HTML reports)
  • allure-pytest (advanced reporting)

Configuration

# pytest.ini
[pytest]
addopts = -v --html=reports/report.html
markers =
    smoke: Quick smoke tests
    regression: Full regression tests

Debugging Tips

  • Enable browser developer tools in non-headless mode
  • Use driver.save_screenshot('debug.png') for visual debugging
  • Print page source: print(driver.page_source)
  • Use breakpoints with import pdb; pdb.set_trace()

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

04

需要参考平台分布和安装热度时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

补充不同宿主或平台的使用分布数据

能力 5

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

OpenCode

26.18%
按下载量换算1,107

Claude Code

25.82%
按下载量换算1,091

Antigravity

17.78%
按下载量换算752

Gemini CLI

14.52%
按下载量换算614

Codex

8.18%
按下载量换算346

Cursor

3.95%
按下载量换算167

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

操作浏览器

该 Skill 可能涉及浏览器控制能力,使用时可能读取或操作网页内容,需要在受控环境中确认权限边界。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。

来源信息

继续浏览同类 Skills