【 ⑩】selenium概述

简介: 【 ⑩】selenium概述

1 关于selenium

1.1 什么是selenium?

Selenium是一种用于自动化浏览器操作的工具。它可以模拟用户在浏览器中的各种操作,例如点击、填写表单、提交等,以及获取页面上的数据。相比传统的基于HTTP请求的爬虫,Selenium更适合处理需要JavaScript执行的动态网页。

Selenium通常与Web驱动程序配合使用,例如ChromeDriver或GeckoDriver,用于控制真实的浏览器实例。通过Selenium,开发者可以编写脚本来模拟用户和浏览器之间的交互,从而爬取并处理网页上的内容。

使用Selenium爬虫可以解决一些传统爬虫无法应对的场景,如需要登录操作、有验证码的页面、使用JavaScript渲染的动态网页等。然而,由于使用了浏览器进行模拟操作,Selenium爬虫也会面临性能较慢、资源消耗较高的问题。因此,在选择使用Selenium爬虫时需要权衡其优缺点,并根据具体需求做出合理的选择。

1.2 为什么要使用selenium?

有几个主要的原因:

  • 动态网页爬取:传统的基于HTTP请求的爬虫对于动态生成内容的网页往往无法完全获取到想要的数据。Selenium可以模拟用户在浏览器中的行为,包括执行JavaScript代码,从而可以获取到通过JavaScript生成的内容。
  • 用户交互模拟:某些网站可能需要用户登录、填写表单、点击按钮等操作才能访问或获取数据。Selenium可以模拟这些用户交互行为,自动完成各种操作,并获取页面上的数据。
  • 解决验证码问题:一些网站为了防止机器人爬虫,会添加验证码验证机制。使用Selenium,可以通过模拟用户在网页上输入验证码来绕过这个限制。
  • 页面渲染 JavaScript:某些网页使用JavaScript进行内容渲染,传统的爬虫无法执行JavaScript并获取最终渲染结果。Selenium可以驱动浏览器执行JavaScript脚本,获取渲染后的页面内容。

尽管Selenium可以解决许多爬虫面临的问题,但它也有一些缺点,包括启动和加载时间较长、消耗更多的资源、性能较慢等。因此,在选择是否使用Selenium时,需要根据具体需求和情况评估其适用性和代价。

1.3 如何安装selenium?

  1. 操作谷歌浏览器驱动下载地址:
    http://chromedriver.storage.googleapis.com/index.html
  2. 谷歌驱动和谷歌浏览器版本之间的映射表:
    http://blog.csdn.net/huilan_same/article/details/51896672
  3. 查看谷歌浏览器版本
    谷歌浏览器右上角三个点—帮助—关于
  4. 通过cmd安装
pip install selenium

2 selenium使用步骤

首先,将上面下载好的驱动,放到一个固定的文件夹,方便后面使用,这里假设我们放到了D盘

  • 导入模块

首先,我们需要导入selenium库。在Python中,可以使用以下语句导入selenium库:

from selenium import webdriver
  • 创建WebDriver对象

接下来,我们需要创建一个WebDriver对象。WebDriver对象是Selenium的核心组件,用于控制浏览器。我们可以使用以下语句创建一个Chrome浏览器的WebDriver对象:

driver = webdriver.Chrome()
  • 定位元素

在创建好WebDriver对象之后,我们需要定位页面上的元素。Selenium提供了多种定位元素的方法,如通过ID、名称、类名、标签名、链接文本等。下面是一个示例,演示如何通过ID定位元素:

element = driver.find_element_by_id("element_id")
  • 执行操作

有了定位到的元素,我们就可以对其进行各种操作了。例如,输入文本、点击按钮等。这里以输入文本为例:

element.send_keys("Hello, World!")

3 常用Selenium方法

  • find_element_by_*方法及其用法

包括用id、name、class name、tag name、link text 、css、xpath等定位元素

# 通过id定位元素
element = driver.find_element_by_id("element_id")
# 通过name定位元素
element = driver.find_element_by_name("element_name")
# 通过class name定位元素
element = driver.find_element_by_class_name("element_class")
# 通过tag name定位元素
element = driver.find_element_by_tag_name("element_tag")
# 通过link text定位元素
element = driver.find_element_by_link_text("link_text")
# 通过partial link text定位元素
element = driver.find_element_by_partial_link_text("partial_link_text")
# 通过css selector定位元素
element = driver.find_element_by_css_selector("css_selector")
# 通过XPath定位元素
element = driver.find_element_by_xpath("xpath")
  • find_elements_by_*方法及其用法
# 通过id定位多个元素
elements = driver.find_elements_by_id("element_id")
# 通过name定位多个元素
elements = driver.find_elements_by_name("element_name")
# 通过class name定位多个元素
elements = driver.find_elements_by_class_name("element_class")
# 通过tag name定位多个元素
elements = driver.find_elements_by_tag_name("element_tag")
# 通过link text定位多个元素
elements = driver.find_elements_by_link_text("link_text")
# 通过partial link text定位多个元素
elements = driver.find_elements_by_partial_link_text("partial_link_text")
# 通过css selector定位多个元素
elements = driver.find_elements_by_css_selector("css_selector")
# 通过XPath定位多个元素
elements = driver.find_elements_by_xpath("xpath")
  • click() 方法
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
driver = webdriver.Chrome()
driver.get("https://www.example.com")
# 定位到响应的元素
element = driver.find_element(By.ID, "example_id")
# 点击元素
element.click()
  • submit() 方法

submit() 方法的作用:模拟表单提交操作。

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
driver = webdriver.Chrome()
driver.get("https://www.example.com/form")
element = driver.find_element(By.ID, "example_id")
# 提交表单
element.submit()
  • clear() 方法

clear() 方法的作用:清除输入框的内容。

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
driver = webdriver.Chrome()
driver.get("https://www.example.com/input")
element = driver.find_element(By.ID, "example_id")
# 清除输入框的内容
element.clear()
  • send_keys() 方法

send_keys() 方法的作用:向输入框发送文本。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("https://www.example.com")
username_input = driver.find_element_by_name("username")
password_input = driver.find_element_by_name("password")
# 在用户名输入框中输入文本 "testuser" 并提交表单
username_input.send_keys("testuser")
password_input.send_keys("testpassword")
# 按回车键提交表单
password_input.send_keys(Keys.RETURN)  
# 等待页面加载完成
time.sleep(5)  
driver.quit()

其中,element 是 WebElement 对象,表示要向其发送文本的元素;text 是字符串类型,表示要发送的文本内容。最后,按回车键提交表单并关闭浏览器。


4 WebDriver管理与异常处理

4.1 为什么需要管理多个WebDriver实例?

  • 并发测试:在并发测试中,我们需要同时操作多个浏览器窗口或标签页,以模拟用户在实际使用场景中的操作。
  • 不同环境(如开发、测试、生产)使用不同的WebDriver实例:为了确保测试的准确性和稳定性,我们需要为不同的环境创建和管理不同的WebDriver实例。例如,开发环境可能使用较低版本的WebDriver,而生产环境可能使用最新版本的WebDriver。

4.2 如何创建和管理多个WebDriver实例?

  • 使用Selenium Grid:Selenium Grid是一个分布式测试工具,可以自动将测试任务分配给多台计算机上的WebDriver实例,从而实现并行测试。
  • 使用多线程或多进程:我们可以在一个程序中创建多个WebDriver实例,并使用多线程或多进程来同时执行测试任务。
  • 使用容器化技术(如Docker):通过将WebDriver实例和测试代码封装在一个容器中,我们可以轻松地在不同的环境中运行测试。

4.3 WebDriver异常处理

4.3.1 WebDriver中可能出现的异常类型?

  • 元素定位失败:例如,找不到指定的元素或元素不存在。
  • 页面加载超时:当页面无法在指定时间内加载完成时,会抛出此异常。
  • 网络连接问题:例如,与服务器的连接中断或超时。
  • 其他异常:如JavaScript执行错误等。

4.3.2 如何捕获和处理WebDriver异常?

  • 使用try-except语句捕获异常:在编写测试用例时,我们可以使用try-except语句来捕获和处理WebDriver异常。
  • 自定义异常处理器(如使用Python的unittest库):我们还可以自定义异常处理器,以便更好地记录和分析异常信息。
  • 使用日志记录异常信息:通过记录异常信息,我们可以更好地了解测试过程中出现的问题,并进行相应的优化。

4.4 示例

下面是一个使用Python和Selenium库来管理多个WebDriver实例并处理异常的示例代码:

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, TimeoutException, WebDriverException
# 创建并管理多个WebDriver实例的类
class WebDriverManager:
    def __init__(self):
        self.drivers = []
    # 创建WebDriver实例
    def create_driver(self):
        driver = webdriver.Chrome()  # 使用Chrome浏览器作为示例
        self.drivers.append(driver)
    # 处理并捕获常见的WebDriver异常
    def handle_exceptions(self):
        for driver in self.drivers:
            try:
                driver.find_element_by_id("element_id")  # 示例:尝试定位一个不存在的元素
            except NoSuchElementException:
                print("Element not found.")
            except TimeoutException:
                print("Page load timeout.")
            except WebDriverException:
                print("WebDriver exception occurred.")
    # 关闭WebDriver实例
    def close_drivers(self):
        for driver in self.drivers:
            driver.quit()
# 创建WebDriverManager实例
manager = WebDriverManager()
# 创建3个WebDriver实例
for _ in range(3):
    manager.create_driver()
# 处理并捕获异常
manager.handle_exceptions()
# 关闭WebDriver实例
manager.close_drivers()

这个示例中,我们定义了一个WebDriverManager类来创建和管理多个WebDriver实例。它包含了创建WebDriver实例、处理异常以及关闭WebDriver实例的方法。

其中,我们使用Chrome浏览器作为WebDriver实例,并尝试定位一个不存在的元素来模拟NoSuchElementException异常。在异常处理部分,我们使用了try-except语句来捕获并处理不同类型的异常。最后,我们关闭所有WebDriver实例。

这只是一个简单示例,实际应用中可能会根据具体需求进行更复杂的管理和异常处理。

相关文章
|
消息中间件 缓存 关系型数据库
Flink CDC产品常见问题之upsert-kafka增加参数报错如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
|
数据采集 数据可视化 Python
在Python中进行数据清洗和预处理缺失值处理查看缺失值比例
在Python中进行数据清洗和预处理缺失值处理查看缺失值比例
285 5
|
JSON 监控 数据管理
【Elasticsearch专栏 12】深入探索:Elasticsearch使用索引生命周期管理(ILM)自动化删除旧数据
Elasticsearch的ILM功能允许用户定义策略,自动管理索引从创建到删除的生命周期。用户可以设置策略,根据索引年龄或大小自动删除旧数据,节省存储空间。通过应用ILM策略于索引模板,新索引将遵循预定义的生命周期。用户还可以监控ILM状态,确保策略按预期执行。使用ILM,用户可以高效地管理数据,确保旧数据及时删除,同时保持数据完整性和安全性。
549 3
|
5月前
|
机器学习/深度学习 数据采集 API
Python自动化解决滑块验证码的最佳实践
Python自动化解决滑块验证码的最佳实践
|
11月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
网络协议 算法 网络虚拟化
【计算机网络】数据链路层(超多图详析)
之前学习了原理体系结构中的物理层,也写了非常详细文章。如果没有看可以先去学习一下,这样有助于我们对数据链路层的学习。
【计算机网络】数据链路层(超多图详析)
|
安全 小程序 Linux
Linux中信号是什么?Ctrl + c后到底为什么会中断程序?
信号在进程的学习中是一个非常好用的存在,它是软件层次上对中断机制的一种模拟,是异步通信方式,同时也可以用来检测用户空间到底发生了什么情况,然后系统知道后就可以做出相应的对策。
491 6
|
存储 JavaScript 安全
Web中的C/S架构
Web中的C/S架构
670 0
|
存储 SQL 缓存
N+1查询问题详解与应对策略
【8月更文挑战第21天】
702 0
|
测试技术 API Android开发
《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)
【7月更文挑战第15天】这是关于自动化测试框架中Selenium API二次封装的教程总结。教程中介绍了如何设计一个支持不同浏览器测试的页面基类(BasePage),该基类包含了对Selenium方法的二次封装,如元素的输入、点击、清除等常用操作,以减少重复代码。此外,页面基类还提供了获取页面标题和URL的方法。
326 2