Python Selenium 实战指南:从入门到精通

Selenium 是一个用于自动化 Web 浏览器交互的强大工具,常用于网页测试、数据抓取和自动化任务。以下是 Python 中 Selenium 的详细使用说明。

安装 Selenium

首先需要安装 Selenium 库和浏览器驱动:

pip install selenium

然后下载对应浏览器的驱动:

  • Chrome: ChromeDriver

  • Firefox: GeckoDriver

  • Edge: EdgeDriver

  • 将驱动放在系统 PATH 路径中,或指定驱动路径。

    基本使用

    启动浏览器

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    
    # 使用 Chrome 浏览器
    driver = webdriver.Chrome()  # 或指定路径 webdriver.Chrome('/path/to/chromedriver')
    
    # 使用 Firefox
    # driver = webdriver.Firefox()
    
    # 访问网页
    driver.get("https://www.google.com")

    常用操作

    # 查找元素
    search_box = driver.find_element(By.NAME, "q")  # 通过name属性查找
    
    # 输入内容
    search_box.send_keys("Python Selenium")
    
    # 模拟按键
    search_box.send_keys(Keys.RETURN)  # 回车
    
    # 点击元素
    button = driver.find_element(By.CSS_SELECTOR, "input[type='submit']")
    button.click()
    
    # 获取元素属性
    print(button.get_attribute("value"))
    
    # 获取文本内容
    print(driver.find_element(By.TAG_NAME, "h1").text)
    
    # 执行JavaScript
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    
    # 等待(隐式等待)
    driver.implicitly_wait(10)  # 最多等待10秒
    
    # 显式等待
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )

    选择元素的方式

    # 通过ID
    driver.find_element(By.ID, "id_name")
    
    # 通过name属性
    driver.find_element(By.NAME, "name")
    
    # 通过XPath
    driver.find_element(By.XPATH, "//input[@name='q']")
    
    # 通过链接文本
    driver.find_element(By.LINK_TEXT, "Continue")
    
    # 通过部分链接文本
    driver.find_element(By.PARTIAL_LINK_TEXT, "Conti")
    
    # 通过标签名
    driver.find_element(By.TAG_NAME, "h1")
    
    # 通过类名
    driver.find_element(By.CLASS_NAME, "content")
    
    # 通过CSS选择器
    driver.find_element(By.CSS_SELECTOR, "p.content")

    高级功能

    处理弹窗和警告

    # 获取并接受alert
    alert = driver.switch_to.alert
    print(alert.text)
    alert.accept()
    
    # 取消alert
    alert.dismiss()
    
    # 在prompt中输入文本
    alert.send_keys("text")
    alert.accept()

    切换窗口和iframe

    # 获取当前所有窗口句柄
    all_handles = driver.window_handles
    
    # 切换到新窗口
    driver.switch_to.window(all_handles[1])
    
    # 切换回原窗口
    driver.switch_to.window(all_handles[0])
    
    # 切换到iframe
    iframe = driver.find_element(By.TAG_NAME, "iframe")
    driver.switch_to.frame(iframe)
    
    # 切回主文档
    driver.switch_to.default_content()

    处理下拉选择框

    from selenium.webdriver.support.ui import Select
    
    select = Select(driver.find_element(By.ID, "dropdown"))
    
    # 通过可见文本选择
    select.select_by_visible_text("Option 1")
    
    # 通过value属性选择
    select.select_by_value("1")
    
    # 通过索引选择
    select.select_by_index(0)

    浏览器操作

    # 前进和后退
    driver.forward()
    driver.back()
    
    # 刷新页面
    driver.refresh()
    
    # 获取当前URL
    print(driver.current_url)
    
    # 获取页面标题
    print(driver.title)
    
    # 获取页面源代码
    print(driver.page_source)
    
    # 设置窗口大小
    driver.set_window_size(1024, 768)
    
    # 最大化窗口
    driver.maximize_window()
    
    # 最小化窗口
    driver.minimize_window()
    
    # 全屏
    driver.fullscreen_window()

    截图和保存

    # 截屏保存
    driver.save_screenshot("screenshot.png")
    
    # 获取元素截图
    element = driver.find_element(By.TAG_NAME, "h1")
    element.screenshot("element.png")

    使用Cookies

    # 获取所有cookies
    print(driver.get_cookies())
    
    # 添加cookie
    driver.add_cookie({"name": "test", "value": "123"})
    
    # 获取指定cookie
    print(driver.get_cookie("test"))
    
    # 删除cookie
    driver.delete_cookie("test")
    
    # 删除所有cookies
    driver.delete_all_cookies()

    无头模式

    无头模式运行浏览器,不显示GUI界面:

    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.add_argument("--headless")  # 启用无头模式
    options.add_argument("--disable-gpu")  # 禁用GPU加速
    
    driver = webdriver.Chrome(options=options)

    关闭浏览器

    # 关闭当前窗口
    driver.close()
    
    # 关闭所有窗口并退出浏览器
    driver.quit()  # 推荐使用,确保释放资源

    实际示例:自动登录网站

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    import time
    
    # 初始化浏览器
    driver = webdriver.Chrome()
    
    try:
        # 打开登录页面
        driver.get("https://example.com/login")
        
        # 输入用户名和密码
        username = driver.find_element(By.ID, "username")
        password = driver.find_element(By.ID, "password")
        
        username.send_keys("your_username")
        password.send_keys("your_password")
        
        # 提交表单
        password.send_keys(Keys.RETURN)
        
        # 等待登录完成
        time.sleep(2)
        
        # 验证是否登录成功
        if "Dashboard" in driver.title:
            print("登录成功!")
        else:
            print("登录失败")
            
    finally:
        # 关闭浏览器
        driver.quit()

    注意事项

    1. 元素定位:确保使用稳定的定位方式,避免使用可能变化的XPath

    2. 等待机制:合理使用隐式和显式等待,避免硬性等待(time.sleep)

    3. 异常处理:添加try-except块处理可能的异常

    4. 资源释放:始终在finally块中调用driver.quit()释放资源

    5. 反爬措施:部分网站有反爬机制,需合理设置请求间隔和User-Agent

    作者:二九筒

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python Selenium 实战指南:从入门到精通

    发表回复