
初识selenium,还是当时热衷于爬虫开发的时候。当时老是遇到一些js加密、动态加载的反爬措施,因为在浏览器上看到的页面,是经过浏览器内核对js执行过后数据渲染的结果。而爬虫程序获取的是原始网页,是没有经过js渲染的。
所以如果想要获取js渲染后的数据,简单的就是动态加载,在控制台找到对应的数据请求接口,然后构造参数请求接口就可以了。对于复杂的,例如之前写过的js混淆、js加密等,需要从很多js文件中推导出参数的构造过程和数据的请求过程。
在推导的过程中,主要借助浏览器控制台的Debugger,在一层层调用链中寻找蛛丝马迹。不过这种方式的确是挺耗费时间。后来就想着python是否有些包,操作类似于浏览器一样的工具,可以执行js并渲染数据后将网页内容返回给爬虫。
你还别说,你还真别说,后来就让我找到了selenium和Scrapy的splash,都可以实现上面的需求。Splash是部署在docker的一个类似于代理的api服务,在请求目标网站时,splash会渲染数据后返回给程序,通常与Scrapy爬虫框架一起使用。
而selenium是让python具备打开浏览器加载网页的一个功能,让浏览器渲染数据。但是需要下载一个浏览器的驱动,也就是说你的程序中有一个浏览器。所以我在爬虫开发时尽量避免使用selenium,但是这并不妨碍selenium对浏览器强大操作能力,以及在自动化测试中的重要地位。
selenium 是一个开源的自动化测试框架,主要用于自动化Web应用程序的测试。它能够与各种浏览器(如Chrome、Firefox、Safari等)进行交互,使得开发者和测试人员能够快速、准确地验证Web应用的功能和性能。接下来就看看selenium的主要功能:
Selenium 提供了多种方式来定位页面元素,例如:
Selenium 能够模拟用户的各种操作,包括:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import Select
import time
# 配置 ChromeDriver 的路径
service = Service(r'D:\workspace\PythonDemo\chromedriver.exe')
options = Options()
driver = webdriver.Chrome(service=service, options=options)
try:
# 打开网页
driver.get('https://www.example.com') # 替换为你要访问的网页
# 1. 点击按钮
button = driver.find_element(By.ID, 'button_id') # 替换为按钮的 ID
button.click()
# 2. 输入文本
input_field = driver.find_element(By.NAME, 'input_name') # 替换为输入框的 name
input_field.send_keys('Hello, Selenium!')
# 3. 选择下拉框
select_element = driver.find_element(By.ID, 'select_id') # 替换为下拉框的 ID
select = Select(select_element)
select.select_by_visible_text('Option 1') # 替换为你要选择的选项文本
# 4. 提交表单
form = driver.find_element(By.ID, 'form_id') # 替换为表单的 ID
form.submit()
# 5. 切换选项卡或窗口
original_window = driver.current_window_handle
driver.execute_script("window.open('https://www.another-example.com');") # 打开新窗口
time.sleep(2) # 等待新窗口加载
new_window = [window for window in driver.window_handles if window != original_window][0]
driver.switch_to.window(new_window) # 切换到新窗口
# 在新窗口中执行操作
driver.get('https://www.another-example.com') # 替换为新窗口中的网址
# 关闭新窗口并切换回原窗口
driver.close()
driver.switch_to.window(original_window)
finally:
# 关闭浏览器
driver.quit()为了提高测试的稳定性,Selenium 提供了:
可以对当前浏览器窗口进行截图,方便记录测试过程中的状态和结果,帮助调试和分析问题。
driver.get('https://www.example.com') # 替换为你要访问的网页
# 等待网页加载
time.sleep(2)
# 截图并保存为文件
driver.get_screenshot_as_file('screenshot.png') # 将截图保存为 screenshot.png
screenshot = driver.get_screenshot_as_png()
with open('screenshot_binary.png', 'wb') as f:
f.write(screenshot)Selenium 可以轻松处理浏览器弹出窗口、模态框和 JavaScript 对话框(如 alert、confirm、prompt)。
可以与数据源(如 CSV、Excel 或数据库)结合使用,支持数据驱动测试,方便在不同数据集下重复执行测试用例。
Selenium 可以与多种测试框架(如 JUnit、TestNG、pytest)结合使用,实现更强大的测试管理和报告功能。
除了 UI 自动化测试,Selenium 也可以用于 API 测试,验证 Web 应用后端服务的功能和性能。
在Scrapy的middleware中间件中,同样可以集成selenium用作一些js加密的网站爬取。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。