【 ⑩】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实例。

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

相关文章
|
7月前
selenium 实战
selenium 实战
76 0
|
7月前
|
Web App开发
selenium使用的一些注意事项
selenium使用的一些注意事项
424 0
|
4月前
|
XML Java 测试技术
Selenium WebDriver自动化测试(基础篇):不得不掌握的Java基础
关于Selenium WebDriver自动化测试的Java基础篇,涵盖了Java的变量、数据类型、字符串操作、运算符、流程控制、面向对象编程、关键字用法、权限修饰符、异常处理和IO流等基础知识点,为进行自动化测试提供了必要的Java语言基础。
110 1
|
4月前
|
Web App开发 敏捷开发 Java
自动化测试入门:以Selenium为例
【8月更文挑战第31天】在软件开发的海洋中,自动化测试犹如一座灯塔,指引着项目质量保障的方向。本文将带你驶入Selenium自动化测试的港湾,从搭建环境到编写简单的测试脚本,逐步展开对Web应用功能和界面的自动化验证之旅。通过实际代码示例,我们将一起探索如何利用Selenium工具提升测试效率,确保软件质量的同时,为开发流程增添一份信心与乐趣。
|
4月前
|
Web App开发 测试技术 API
Web自动化测试框架(基础篇)--Selenium WebDriver工作原理和环境搭建
本文详细介绍了Selenium WebDriver的工作原理,包括其架构、通信机制及支持的浏览器,并指导读者如何在Python环境下搭建Selenium WebDriver的测试环境,从安装Python和Selenium库到编写并运行第一个自动化测试脚本。
242 0
|
7月前
|
前端开发 测试技术 Python
《手把手教你》系列技巧篇(四十一)-java+ selenium自动化测试 - 处理iframe -上篇(详解教程)
【5月更文挑战第5天】本文介绍了HTML中的`iframe`标签,它用于在网页中嵌套其他网页。`iframe`常用于加载外部内容或网站的某个部分,以实现页面美观。文章还讲述了使用Selenium自动化测试时如何处理`iframe`,通过`switchTo().frame()`方法进入`iframe`,完成相应操作,然后使用`switchTo().defaultContent()`返回主窗口。此外,文章提供了一个包含`iframe`的HTML代码示例,并给出了一个简单的自动化测试代码实战,演示了如何在`iframe`中输入文本。
64 3
|
Web App开发 IDE Java
Selenium是什么?深入探讨Selenium
Selenium 是一款 Web UI 测试工具,是一款 自动化测试 工具,使用 Selenium 测试工具进行的测试通常被称为 Selenium Testing
Selenium是什么?深入探讨Selenium
|
Web App开发 缓存 文字识别
scrapy_selenium的常见问题和解决方案
scrapy_selenium是一个结合了scrapy和selenium的库,可以让我们使用selenium的webdriver来控制浏览器进行动态网页的爬取。但是在使用scrapy_selenium的过程中,我们可能会遇到一些问题,比如如何设置代理、如何处理反爬、如何优化性能等。本文将介绍一些scrapy_selenium的常见问题和解决方案,希望对你有所帮助。
293 0
scrapy_selenium的常见问题和解决方案
|
7月前
|
Java 测试技术 API
《手把手教你》系列技巧篇(六)-java+ selenium自动化测试-阅读selenium源码(详细教程)
【2月更文挑战第15天】《手把手教你》系列技巧篇(六)-java+ selenium自动化测试-阅读selenium源码(详细教程) 前面几篇基础系列文章,足够你迈进了Selenium门槛,再不济你也至少知道如何写你第一个基于Java的Selenium自动化测试脚本。接下来宏哥介绍Selenium技巧篇,主要是介绍一些常用的Selenium方法或者接口(API),通过这些接口(API)或者方法的具体操作,达到能够熟练使用Selenium编写Java的自动化测试脚本,从而为后续的Java+Selenium自动化测试框架设计打基础。
107 0
|
XML 前端开发 机器人
Selenium工具学习
Selenium工具学习
96 1

相关实验场景

更多