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?
- 操作谷歌浏览器驱动下载地址:
http://chromedriver.storage.googleapis.com/index.html - 谷歌驱动和谷歌浏览器版本之间的映射表:
http://blog.csdn.net/huilan_same/article/details/51896672 - 查看谷歌浏览器版本
谷歌浏览器右上角三个点—帮助—关于 - 通过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-excep
t语句来捕获并处理不同类型的异常。最后,我们关闭所有WebDriver实例。
这只是一个简单示例,实际应用中可能会根据具体需求进行更复杂的管理和异常处理。