Selenium技术详解与实战案例解析

Selenium技术详解与实战案例解析


1. Selenium核心架构

1.1 组件交互模型

JSON Wire Protocol
浏览器原生API
DOM操作
测试脚本
WebDriver
浏览器
被测网页

1.2 WebDriver支持矩阵

浏览器驱动名称下载地址
Chromechromedriverhttps://chromedriver.chromium.org
Firefoxgeckodriverhttps://github.com/mozilla/geckodriver
Edgemsedgedriverhttps://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

2. 自动化测试原理

2.1 元素定位策略

from selenium.webdriver.common.by import By

class LocatorStrategies:
    """八大元素定位方式"""
    ID = (By.ID, "username")
    NAME = (By.NAME, "password")
    CLASS = (By.CLASS_NAME, "form-control")
    TAG = (By.TAG_NAME, "input")
    LINK_TEXT = (By.LINK_TEXT, "忘记密码")
    PARTIAL_LINK = (By.PARTIAL_LINK_TEXT, "忘记")
    CSS = (By.CSS_SELECTOR, "#login .btn")
    XPATH = (By.XPATH, "//input[@type='submit']")

2.2 等待机制对比

等待类型原理代码示例
强制等待固定时间等待time.sleep(5)
隐式等待全局等待超时driver.implicitly_wait(10)
显式等待条件触发等待WebDriverWait(driver, 10).until(EC.visibility_of_element_located(...))

3. 案例分析与实现

案例1:电商登录自动化测试

目标:实现用户登录功能测试

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class EcommerceLogin:
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.wait = WebDriverWait(self.driver, 10)
    
    def open_login_page(self, url):
        self.driver.get(url)
        self.wait.until(EC.title_contains("登录"))
    
    def enter_credentials(self, username, password):
        self.wait.until(EC.visibility_of_element_located(
            (By.ID, "username"))).send_keys(username)
        self.driver.find_element(By.ID, "password").send_keys(password)
    
    def submit_login(self):
        self.driver.find_element(By.CSS_SELECTOR, ".login-btn").click()
        self.wait.until(EC.url_contains("dashboard"))
    
    def verify_login(self):
        welcome_text = self.driver.find_element(
            By.CLASS_NAME, "welcome-msg").text
        return "欢迎" in welcome_text
    
    def run_test(self, url, username, password):
        try:
            self.open_login_page(url)
            self.enter_credentials(username, password)
            self.submit_login()
            return self.verify_login()
        finally:
            self.driver.quit()

# 使用示例
test = EcommerceLogin()
result = test.run_test("https://example.com/login", "testuser", "Test@123")
print("测试结果:", "成功" if result else "失败")

流程图

启动浏览器
访问登录页
输入用户名密码
点击登录按钮
验证跳转结果
生成测试报告

案例2:动态数据抓取系统

目标:抓取AJAX加载的电商商品数据

from selenium.webdriver.common.keys import Keys
import pandas as pd

class ProductScraper:
    def __init__(self, headless=True):
        options = webdriver.ChromeOptions()
        if headless:
            options.add_argument("--headless")
        self.driver = webdriver.Chrome(options=options)
        self.data = []
    
    def scroll_to_bottom(self):
        last_height = self.driver.execute_script(
            "return document.body.scrollHeight")
        while True:
            self.driver.execute_script(
                "window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(2)
            new_height = self.driver.execute_script(
                "return document.body.scrollHeight")
            if new_height == last_height:
                break
            last_height = new_height
    
    def extract_products(self):
        products = self.driver.find_elements(
            By.CSS_SELECTOR, ".product-item")
        for product in products:
            self.data.append({
                "name": product.find_element(
                    By.CLASS_NAME, "title").text,
                "price": product.find_element(
                    By.CLASS_NAME, "price").text,
                "rating": product.find_element(
                    By.CLASS_NAME, "stars").get_attribute("data-rating")
            })
    
    def save_to_csv(self, filename):
        pd.DataFrame(self.data).to_csv(filename, index=False)
    
    def run(self, url, output_file):
        self.driver.get(url)
        self.scroll_to_bottom()
        self.extract_products()
        self.save_to_csv(output_file)
        self.driver.quit()

# 使用示例
scraper = ProductScraper()
scraper.run("https://example.com/products", "products.csv")

流程图

初始化无头浏览器
访问目标页面
滚动加载全部内容
解析商品数据
存储到CSV文件

案例3:跨浏览器兼容性测试

目标:在多浏览器执行统一测试用例

from abc import ABC, abstractmethod

class BrowserTest(ABC):
    @abstractmethod
    def setup_driver(self):
        pass
    
    @abstractmethod
    def teardown(self):
        pass
    
    def run_test(self, url):
        try:
            self.setup_driver()
            self.driver.get(url)
            # 执行通用测试步骤
            self.execute_test_steps()
            return True
        except Exception as e:
            print(f"测试失败: {str(e)}")
            return False
        finally:
            self.teardown()

class ChromeTest(BrowserTest):
    def setup_driver(self):
        self.driver = webdriver.Chrome()
    
    def teardown(self):
        self.driver.quit()

class FirefoxTest(BrowserTest):
    def setup_driver(self):
        self.driver = webdriver.Firefox()
    
    def teardown(self):
        self.driver.quit()

def run_cross_browser_tests(url):
    browsers = [ChromeTest(), FirefoxTest()]
    results = {}
    for browser in browsers:
        browser_name = browser.__class__.__name__
        results[browser_name] = browser.run_test(url)
    return results

# 使用示例
results = run_cross_browser_tests("https://example.com")
print("跨浏览器测试结果:", results)

流程图

测试套件
Chrome测试
Firefox测试
Edge测试
生成报告

4. 高级应用技巧

4.1 处理验证码方案

def handle_captcha(driver):
    # 方案1:测试环境禁用验证码
    driver.execute_script(
        "document.getElementById('captcha').style.display='none';")
    
    # 方案2:使用第三方识别服务
    # captcha_img = driver.find_element(...)
    # captcha_text = ocr_service(captcha_img.screenshot_as_base64)
    # driver.find_element(...).send_keys(captcha_text)

4.2 文件上传处理

# 直接send_keys文件路径
upload_input = driver.find_element(By.XPATH, "//input[@type='file']")
upload_input.send_keys("/path/to/file.jpg")

# 处理隐藏的input元素
driver.execute_script(
    "arguments[0].style.display='block';", upload_input)

4.3 性能优化技巧

技巧实现方式效果提升
无头模式options.add_argument("--headless")减少资源占用
禁用图片加载options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})加速页面加载
并行测试使用pytest-xdist插件缩短总执行时间

5. 最佳实践总结

5.1 测试框架推荐组合

Selenium
Pytest
Allure
测试报告

5.2 常见问题解决方案

问题现象可能原因解决方案
ElementNotInteractable元素被遮挡使用JavaScript直接操作元素
NoSuchElementException元素加载延迟增加显式等待时间
StaleElementReferenceDOM已更新重新定位元素

5.3 企业级实施建议

  1. 环境隔离:使用Docker容器管理浏览器环境
    FROM selenium/standalone-chrome
    COPY test_scripts /tests
    CMD ["pytest", "/tests"]
    
  2. 持续集成:Jenkins集成自动化测试
  3. 可视化监控:Grafana展示测试指标
  4. 异常处理:智能截图和日志记录
    def save_screenshot(driver, name):
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        driver.save_screenshot(f"screenshots/{name}_{timestamp}.png")
    

通过这三个案例的实践,可以掌握Selenium的以下核心能力:

  1. Web页面自动化操作技巧
  2. 动态内容处理方案
  3. 跨浏览器测试策略
  4. 企业级测试框架搭建

实际项目中建议:

  • 使用Page Object模式组织代码
  • 实现自动化测试失败自动重试
  • 定期更新浏览器驱动版本
  • 结合AI技术处理验证码等复杂场景
  • 建立完善的测试数据管理体系

Selenium作为最流行的Web自动化测试工具,持续保持技术更新,结合最佳实践可构建稳定高效的自动化测试体系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲人编程

你的鼓励就是我最大的动力,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值