零基础到项目实战:Node.js版Selenium WebDriver教程

news2024/9/20 15:56:01

在当今数字化时代,Web应用程序的质量和性能至关重要。为了确保这些应用的可靠性,自动化测试成为一种不可或缺的工具。Selenium,作为自动化测试领域的瑰宝,为我们提供了无限可能。本教程将深入介绍Selenium,以及如何结合Node.js发挥其最大潜力。


Selenium基础

Selenium不仅是一个强大的自动化测试框架,更是开源的,允许我们以多种方式实现自动化。其中,Selenium WebDriver是其核心组件之一,为浏览器自动化提供了出色的支持。在本部分,我们将全面解析Selenium的基础概念,重点聚焦于Node.js版本的WebDriver。

环境设置

安装和配置
使用npm安装selenium-webdriver模块

在这一步,我们将通过Node.js的包管理工具npm安装Selenium WebDriver模块。打开你的终端或命令提示符,并执行以下命令:

npm install selenium-webdriver 

这将下载并安装最新版本的selenium-webdriver模块,为我们提供Selenium WebDriver的Node.js接口。

配置和管理浏览器驱动器

安装完selenium-webdriver后,我们需要配置浏览器驱动器,以便Selenium可以与浏览器进行交互。具体的配置取决于你使用的浏览器和操作系统。以下是配置ChromeDriver的简要示例:


const { Builder } = require('selenium-webdriver');

const chrome = require('selenium-webdriver/chrome');


const driver = new Builder()

.forBrowser('chrome')

.setChromeOptions(new chrome.Options().headless()) // 可选,用于无头模式

.build();


// 现在你可以使用driver与浏览器进行交互了

确保你已经下载了相应浏览器驱动器,并将其路径加入系统的PATH环境变量中。


第一个WebDriver脚本

在这一步,我们将通过编写一个简单的Node.js脚本来启动浏览器,并进行一些基本的操作。创建一个新的文件,例如firstScript.js,并输入以下代码:

 

const { Builder, By, Key, until } = require('selenium-webdriver')


async function runFirstScript() {

// 创建一个WebDriver实例

const driver = new Builder().forBrowser('chrome').build()


try {

// 导航到网页

await driver.get('https://www.baidu.com')


// 查找一个元素并输入文本

const searchBox = await driver.findElement(By.id('kw'))

await searchBox.sendKeys('Selenium WebDriver', Key.RETURN)


// 等待搜索结果加载完成

await driver.wait(

until.elementLocated(By.css('#content_left .result')),

5000

)

console.log('第一个WebDriver脚本执行成功!')

} finally {

// 延迟2秒

await new Promise((resolve) => setTimeout(resolve, 2000))

// 关闭浏览器

await driver.quit()

}

}


runFirstScript()

执行该脚本:

node firstScript.js 

你将看到浏览器启动,导航到https://www.baidu.com,在搜索框中输入关键字并回车,最后等待搜索结果页面加载完毕。这是你的第一个Selenium WebDriver脚本!

基本操作

定位元素
使用selenium-webdriver模块定位元素

在Selenium中,定位元素是自动化测试的关键步骤之一。通过selenium-webdriver模块,我们可以使用多种方法来定位网页上的元素。以下是一些基本的定位方法示例:

 

const { Builder, By } = require('selenium-webdriver');


async function locateElements() {

const driver = new Builder().forBrowser('chrome').build();


try {

await driver.get('https://www.example.com');


// 通过ID定位元素

const elementById = await driver.findElement(By.id('elementId'));


// 通过类名定位元素

const elementByClassName = await driver.findElement(By.className('className'));


// 通过标签名定位元素

const elementByTagName = await driver.findElement(By.tagName('tagName'));


// 通过名称定位元素

const elementByName = await driver.findElement(By.name('elementName'));


// 通过XPath定位元素

const elementByXPath = await driver.findElement(By.xpath('//xpathExpression'));


// 通过CSS选择器定位元素

const elementByCss = await driver.findElement(By.css('cssSelector'));


console.log('元素定位成功!');

} finally {

await driver.quit();

}

}


locateElements();

通过上述方法,你可以根据元素的ID、类名、标签名、名称、XPath或CSS选择器来定位元素。根据实际需要选择最合适的方法。


交互操作
通过WebDriver进行交互操作

一旦我们成功地定位了元素,下一步就是与这些元素进行交互。这可能包括在输入框中输入文本、点击按钮、选择下拉框等。以下是一些基本的交互操作示例:

 

const { Builder, By, Key } = require('selenium-webdriver');


async function interactWithElements() {

const driver = new Builder().forBrowser('chrome').build();


try {

await driver.get('https://www.example.com');


// 在输入框中输入文本

const searchBox = await driver.findElement(By.name('q'));

await searchBox.sendKeys('Selenium WebDriver', Key.RETURN);


// 点击按钮

const submitButton = await driver.findElement(By.id('submitBtn'));

await submitButton.click();


// 选择下拉框中的选项

const dropdown = await driver.findElement(By.tagName('select'));

await dropdown.findElement(By.css('option[value="optionValue"]')).click();


console.log('交互操作成功!');

} finally {

await driver.quit();

}

}


interactWithElements();

在这个示例中,我们演示了如何在输入框中输入文本、点击按钮以及选择下拉框中的选项。根据页面上的元素类型和操作需求,你可以进一步扩展这些基本的交互操作。

高级操作

等待机制
使用selenium-webdriver提供的等待机制

等待机制是Selenium中用于处理页面加载和元素可见性的关键特性。在进行自动化测试时,经常需要等待某个条件的发生,以确保测试步骤按预期执行。以下是等待机制的基本使用示例:

 

const { Builder, By, until } = require('selenium-webdriver');


async function waitForElement() {

const driver = new Builder().forBrowser('chrome').build();


try {

await driver.get('https://www.example.com');


// 等待元素出现在页面上

const element = await driver.wait(until.elementLocated(By.id('elementId')), 5000);


// 等待元素可见

await driver.wait(until.elementIsVisible(element), 5000);


console.log('等待成功!');

} finally {

await driver.quit();

}

}


waitForElement();

在这个例子中,我们使用driver.wait来等待页面上的元素,确保它在指定的时间内出现,并且可见。等待机制可以帮助我们更好地处理异步加载和页面变化的情况。


多窗口和弹窗处理
处理多个浏览器窗口之间的切换

当一个应用程序涉及到多个浏览器窗口时,我们需要能够在这些窗口之间进行切换。以下是一个简单的多窗口切换示例:

 

const { Builder, By } = require('selenium-webdriver');


async function switchToWindow() {

const driver = new Builder().forBrowser('chrome').build();


try {

await driver.get('https://www.example.com');


// 打开新窗口

await driver.executeScript("window.open('https://www.example2.com', '_blank');");


// 获取所有窗口的句柄

const windowHandles = await driver.getAllWindowHandles();


// 切换到新窗口

await driver.switchTo().window(windowHandles[1]);


console.log('已切换到新窗口!');

} finally {

await driver.quit();

}

}


switchToWindow();
处理弹窗(Alert、Confirm、Prompt)

在自动化测试中,我们可能会遇到各种弹窗,例如Alert、Confirm和Prompt。以下是处理这些弹窗的基本示例:

 

const { Builder, By } = require('selenium-webdriver');


async function handleAlert() {

const driver = new Builder().forBrowser('chrome').build();


try {

await driver.get('https://www.example.com');


// 触发一个带有文本的Alert

await driver.executeScript("alert('Hello, WebDriver!');");


// 切换到Alert

const alert = await driver.switchTo().alert();


// 获取Alert的文本

const alertText = await alert.getText();

console.log('Alert文本:', alertText);


// 关闭Alert

await alert.accept();


console.log('已处理Alert!');

} finally {

await driver.quit();

}

}


handleAlert();

在这两个示例中,我们演示了如何切换到新窗口以及如何处理弹窗。在实际测试中,这些技术对于处理多窗口和各种弹窗非常有用。

进阶主题

数据驱动测试
从外部数据源读取测试数据

数据驱动测试是一种强大的测试方法,可以通过外部数据源提供测试数据,使测试用例更灵活和可维护。以下是一个简单的数据驱动测试的示例:

 

const { Builder, By } = require('selenium-webdriver');

const testData = require('./testdata.json'); // 假设有一个JSON文件包含测试数据


async function dataDrivenTest() {

const driver = new Builder().forBrowser('chrome').build();


try {

await driver.get('https://www.example.com');


// 循环遍历测试数据

for (const data of testData) {

// 从测试数据中获取用户名和密码

const username = data.username;

const password = data.password;


// 找到用户名和密码输入框,并输入值

const usernameInput = await driver.findElement(By.id('username'));

await usernameInput.sendKeys(username);


const passwordInput = await driver.findElement(By.id('password'));

await passwordInput.sendKeys(password);


// 其他测试步骤...


// 清空输入框,准备下一组数据

await usernameInput.clear();

await passwordInput.clear();

}


console.log('数据驱动测试完成!');

} finally {

await driver.quit();

}

}


dataDrivenTest();

在这个例子中,我们假设有一个名为testdata.json的JSON文件,包含多组测试数据。通过循环遍历测试数据,我们可以动态地输入不同的用户名和密码,从而进行数据驱动测试。


页面对象模型(POM)
POM的概念和优势

页面对象模型(POM)是一种设计模式,旨在提高测试代码的可维护性和可读性。在POM中,页面的每个元素和每个操作都被封装在一个单独的类中。以下是一个简单的POM示例:

 

// LoginPage.js

const { By } = require('selenium-webdriver');


class LoginPage {

constructor(driver) {

this.driver = driver;

this.usernameInput = By.id('username');

this.passwordInput = By.id('password');

this.loginButton = By.id('loginButton');

}


async login(username, password) {

await this.driver.findElement(this.usernameInput).sendKeys(username);

await this.driver.findElement(this.passwordInput).sendKeys(password);

await this.driver.findElement(this.loginButton).click();

}

}


module.exports = LoginPage;

在测试脚本中使用:

 

const { Builder } = require('selenium-webdriver');

const LoginPage = require('./LoginPage');


async function testWithPOM() {

const driver = new Builder().forBrowser('chrome').build();

const loginPage = new LoginPage(driver);


try {

await driver.get('https://www.example.com');


// 使用POM执行登录操作

await loginPage.login('testuser', 'password123');


console.log('POM测试完成!');

} finally {

await driver.quit();

}

}


testWithPOM();

POM通过将每个页面的元素和操作封装在单独的类中,提高了代码的可维护性。当页面结构发生变化时,只需要更新页面对应的类,而不必修改测试脚本。

这两个进阶主题可以在测试代码中提供更高层次的抽象,使测试更易于维护和扩展。

测试框架集成

测试框架介绍
在Node.js中使用测试框架

测试框架是用于组织和执行测试的工具,可以提供更丰富的功能,例如测试用例的组织、断言库、测试报告等。在Node.js中,常见的测试框架有Mocha、Jest等。以下是一个简单的示例,演示如何使用Mocha进行测试:

首先,安装Mocha:

npm install mocha --save-dev 

然后,创建一个测试文件,例如test.js


// test.js

const assert = require('assert');


describe('Example Test Suite', () => {

it('should pass a simple test', () => {

assert.strictEqual(1 + 1, 2);

});


it('should handle asynchronous code', (done) => {

setTimeout(() => {

assert.strictEqual(3 * 3, 9);

done();

}, 1000);

});

});

运行测试:

npx mocha test.js 

这是一个简单的Mocha测试文件,包含两个测试用例。你可以根据需要组织测试套件和编写更多测试用例。


测试报告生成
使用测试框架生成详细的测试报告

生成详细的测试报告是测试流程中的关键步骤,可以更好地理解测试结果和问题。在Node.js中,有一些工具可以生成漂亮的测试报告,例如mochawesomejest-html-reporters

以下是一个使用mochawesome生成测试报告的简单示例:

首先,安装mochawesome

npm install mochawesome --save-dev 

修改Mocha的执行命令:


// package.json

"scripts": {

"test": "mocha test.js --reporter mochawesome"

}

然后,运行测试并生成报告:

npm test 

你将在项目目录中生成一个mochawesome-report文件夹,里面包含详细的HTML测试报告。

以上是一个简单的测试框架集成和测试报告生成的例子。根据实际项目的需要,可以选择适合你的测试框架和报告生成工具,以提高测试的可读性和易管理性。

性能优化和最佳实践

提高效率的并行测试
利用Node.js的并行执行特性

通过Node.js的并行执行特性,实现在多个浏览器和平台上同时运行测试,提高整体测试效率。使用concurrently等工具,将测试任务分发到多个进程,充分利用计算资源,缩短测试执行时间。


编写可维护、稳定和可扩展的测试代码的最佳实践
关键建议和最佳实践
  • 良好的命名和组织: 使用清晰、描述性的命名,合理组织测试用例和代码结构。

  • 版本控制: 使用Git等版本控制工具管理测试代码,确保代码的版本追踪和团队协作。

  • 错误处理和日志: 实现健壮的错误处理,记录详细日志以便排查问题。

  • 隔离测试数据: 使用隔离的测试数据,确保测试用例的独立性和可重复性。

  • 定期维护和更新: 定期检查和更新测试代码,保持与应用程序的同步。

  • 并行测试执行: 利用并行测试来提高测试效率,加速整体测试过程。

  • 代码审查: 进行团队内部的代码审查,确保编码标准和最佳实践的一致性。

  • 文档和注释: 提供清晰的文档和注释,帮助团队理解代码的设计和目的。

  • 测试环境一致性: 在测试环境中保持一致性,包括浏览器版本、驱动程序版本等。

  • 定期审查和改进: 定期审查测试策略和代码,寻找改进的机会,持续提高测试质量。

通过遵循这些最佳实践,你可以建立一个高效、稳定且易于维护的自动化测试框架,提高团队的测试效率和整体软件质量。

实战项目

构建一个简单的自动化测试项目

在这一部分,我们将通过一个简单的自动化测试项目来帮助读者应用前面学到的知识。我们的项目将基于以下几个步骤:

项目概述

我们将创建一个自动化测试项目,测试一个简单的登录页面。项目将包括以下关键组件:

  • 项目结构设计: 我们会设计一个清晰的项目结构,包括 tests(存放测试脚本)、pages(存放页面对象)、config(存放配置文件)等。

  • 测试脚本编写: 我们会编写测试脚本,覆盖登录页面的主要功能和交互。

  • 数据驱动测试: 我们将使用外部的JSON文件,通过数据驱动的方式执行多组测试。

  • 测试框架集成: 我们会集成Mocha测试框架,以组织和执行测试。

  • 报告生成: 我们将使用Mocha生成详细的测试报告,以更好地理解测试结果。

项目实现步骤

步骤 1: 创建项目文件夹结构

首先,让我们创建项目文件夹结构:


- automation-project

- tests

- loginTest.js

- pages

- loginPage.js

- config

- config.json

步骤 2: 编写测试用例

在 tests 文件夹中,创建 loginTest.js

 

const { Builder, By, Key } = require('selenium-webdriver');

const assert = require('assert');

const LoginPage = require('../pages/loginPage');

const config = require('../config/config.json');


describe('Login Test Suite', function () {

let driver;

let loginPage;


before(async function () {

driver = new Builder().forBrowser(config.browser).build();

loginPage = new LoginPage(driver);

});


after(async function () {

await driver.quit();

});


it('should navigate to the login page', async function () {

await loginPage.navigateToLoginPage();

const title = await driver.getTitle();

assert.strictEqual(title, 'Login Page');

});


it('should login with valid credentials', async function () {

await loginPage.login('username', 'password');

const welcomeMessage = await loginPage.getWelcomeMessage();

assert.strictEqual(welcomeMessage, 'Welcome, User!');

});


it('should handle invalid login', async function () {

await loginPage.login('invalidUser', 'invalidPassword');

const errorMessage = await loginPage.getErrorMessage();

assert.strictEqual(errorMessage, 'Invalid username or password.');

});

});

步骤 3: 设计页面对象

在 pages 文件夹中,创建 loginPage.js

 

const { By, Key, until } = require('selenium-webdriver');


class LoginPage {

constructor(driver) {

this.driver = driver;

this.usernameInput = By.id('username');

this.passwordInput = By.id('password');

this.loginButton = By.id('loginButton');

this.welcomeMessage = By.id('welcomeMessage');

this.errorMessage = By.id('errorMessage');

}


async navigateToLoginPage() {

await this.driver.get('https://example.com/login');

}


async login(username, password) {

const usernameInput = await this.driver.findElement(this.usernameInput);

await usernameInput.sendKeys(username);


const passwordInput = await this.driver.findElement(this.passwordInput);

await passwordInput.sendKeys(password);


const loginButton = await this.driver.findElement(this.loginButton);

await loginButton.click();

}


async getWelcomeMessage() {

const welcomeMessageElement = await this.driver.findElement(this.welcomeMessage);

return await welcomeMessageElement.getText();

}


async getErrorMessage() {

const errorMessageElement = await this.driver.findElement(this.errorMessage);

return await errorMessageElement.getText();

}

}


module.exports = LoginPage;

步骤 4: 配置文件设置

在 config 文件夹中,创建 config.json


{

"browser": "chrome"

}

步骤 5: 数据驱动测试

通过创建测试数据文件 testData.json


[

{

"username": "validUser",

"password": "validPassword"

},

{

"username": "invalidUser",

"password": "invalidPassword"

}

]

在 loginTest.js 中使用数据驱动测试:

 

const testData = require('../config/testData.json');


// ...


it('should login with valid and invalid credentials', async function () {



for (const data of testData) {

await loginPage.login(data.username, data.password);


if (data.username === 'validUser') {

const welcomeMessage = await loginPage.getWelcomeMessage();

assert.strictEqual(welcomeMessage, 'Welcome, User!');

} else {

const errorMessage = await loginPage.getErrorMessage();

assert.strictEqual(errorMessage, 'Invalid username or password.');

}

}

});

步骤 6: 测试框架集成

在 package.json 中添加测试脚本:


"scripts": {

"test": "mocha tests/loginTest.js --reporter mochawesome"

}

步骤 7: 报告生成集成

安装 mochawesome

npm install mochawesome --save-dev 

执行测试并生成报告:

npm test 

这样,我们就成功构建了一个简单的自动化测试项目,覆盖了测试脚本编写、数据驱动测试、测试框架集成和报告生成等方面。读者可以根据这个示例项目的结构和实现来扩展和应用到实际项目中。

结尾

这次教程带你玩转Node.js版的Selenium WebDriver,是不是觉得自动化测试有点神奇?我们学了点基础知识,搞定了环境设置,还把操作搞得很高级。最后,我们通过一个项目,让你亲自动手,感受一下自动化测试的魅力。有兴趣的话,可以深入了解Node.js,瞄一眼其他测试框架,别忘了多动手实践,加深印象哦!

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末自行领取】

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2149342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何删除EXCELL文件中的空行?

1,选择某一列 2,点击《开始》《查找和选择》>《定位条件》,调出《定位条件》的选择框; 3,在定位条件选项框,选择《空值》; 4,找到变灰被选中的某一行,右击《删除》 5&…

配置管理之configmap

一 、云原生要素——配 置分离 ConfigMap:存储明文配置 Secret:存储密文、敏感配置、用户重要信息和密码 等。 配置更新直接同步容器,热加载,无需重启pod或者容 器;镜像和配置分离,可单独修改发布 二、ConfigMap 1.…

详细分析Pytorch中的register_buffer基本知识(附Demo)

目录 1. 基本知识2. Demo3. 与自动注册的差异3.1 torch.nn.Parameter3.2 自动注册子模块3.3 总结 1. 基本知识 register_buffer 是 PyTorch 中 torch.nn.Module 提供的一个方法,允许用户将某些张量注册为模块的一部分,但不会被视为可训练参数。这些张量…

2区“发稿大户”!SCISSCI双检,3天上线出版,在这里,不用担心创新性不足~

【SciencePub学术】眼瞅评职晋升最后期限就在眼前,小编今天就给大家带来了一本“百发百中”的救命神刊~ 01 期刊详情 【期刊简介】IF:2.0-3.0 JCR2区中科院4区 【出版社】MDPI出版社 【自引率】8.30% 【类别】医学 【INDEX】SCIE&SSCI在检 02…

es由一个集群迁移到另外一个集群es的数据迁移

迁移es的数据 改下index的索引 就可以了。 查询 用curl -u就可以查询了

[数据集][目标检测]不同颜色的安全帽检测数据集VOC+YOLO格式7574张5类别

重要说明:数据集里面有2/3是增强数据集,请仔细查看图片预览,确认符合要求在下载,分辨率均为640x640 数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件…

微店商品列表API接口实战指南

微店商品列表数据接口是一种允许开发者在其应用程序中调用微店店铺所有商品数据的 API 接口。通过这个接口,开发者可以获取到微店店铺内所有商品的信息,包括但不限于商品的 ID、标题、价格、库存、销量、详情描述、图片等。以下是对微店商品列表数据接口…

如何确保Java程序分发后不被篡改?使用JNI对Java程序进行安全校验

前言 众所周知,Java/Kotlin编译后会编译成smali,使用Jadx这类的反编译工具或者Hook工具就能很轻松的把我们的软件安全校验给破解了。 为了防止这种情况发生,我们一般会将核心代码使用C编写,然后使用JNI技术,使用Java…

TCP报文格式

RFC9293协议规范,规定的TCP格式如图1, 对比RFC793规定的格式,控制位从6bit变成了8bit 图1,图片来源:datatracker.ietf.org 图2为,可对照的中文版TCP格式,中文版参照的是RFC793 图2 重点…

htop 命令:系统状态监控

一、命令简介 ​htop ​是一个互动式的进程查看器,它是 top ​命令的增强版本,提供了更丰富的功能和更好的用户界面。htop ​显示了系统的实时进程和资源使用情况(比如 CPU 和 memory 占用情况),允许用户进行交互式操…

基于Ubuntu的ECS实例实现OSS反向代理

阿里云OSS的存储空间(Bucket)访问地址会随机变换,您可以通过在ECS实例上配置OSS的反向代理,实现通过固定IP地址访问OSS的存储空间。 背景信息 阿里云OSS通过Restful API方式对外提供服务。最终用户通过OSS默认域名或者绑定的自定…

掌握Spring Boot数据库集成:用JPA和Hibernate构建高效数据交互与版本控制

在现代应用开发中,数据库操作是核心环节之一。Spring Boot提供了简化数据库集成的强大工具,而JPA(Java Persistence API)和Hibernate是两种非常流行的ORM(对象关系映射)框架,可以帮助我们将对象…

CLI示例(V2R8至V2R19C00版本):直连二层组网直接转发【AP+上层网络,增加AP下行口有线接入】

CLI示例(V2R8至V2R19C00版本):直连二层组网直接转发【AP+上层网络,增加AP下行口有线接入】 适用于:V200R008至V200R019C00版本的AC,以及有空闲以太网口的AP。 说明:本示例基于“直连二层组网直接转发【AP+AC+出口网关】”场景来介绍如何增加AP下行口有线接入。 业务需求…

Vue使用代理方式解决跨域问题

1、解决跨域问题 如果 Vue 前端应用请求后端 API 服务器,出现跨域问题(CORS),如下图: 解决方法:在 Vue 项目中,打开 vue.config.js 配置文件,在配置文件中使用代理解决跨域问题。 …

怎么找到抖音爆款内容,进行扩散传播?

企业如果想做好抖音平台的品牌营销,需要时刻监测抖音爆款内容并进行加热放大,据此快速创新和改进内容,才能短期提高品牌相关内容的曝光量,快速拉升品牌声量。怎么去找到抖音的爆款内容或者是值得品牌关注的优质内容,主…

印尼有几百种语言,初学者要怎么开始学习?《印尼语翻译通》app或许可以帮助你!印尼语零基础入门学习。

快速翻译,准确高效 采用最新技术,提供精准翻译。翻译结果符合中国人习惯。 体验印尼文化 学习地道印尼语,贴近当地文化。 旅游和工作的好帮手 提供旅游和商务用语,沟通无障碍。 学习印尼语的良师 文本和语音翻译,…

Spark-RDD持久化

一、Spark的三种持久化机制 1、cache 它是persist的一种简化方式,作用是将RDD缓存到内存中,以便后续快速访问,提高计算效率。cache操作是懒执行的,即执行action算子时才会触发。 2、persist 它提供了不同的存储级别&#xff0…

解锁数字转型新纪元:Vatee万腾平台,您的智能加速与策略智库

在数字经济时代的大潮中,企业的数字化转型已不再是选择题,而是必答题。面对这一挑战,Vatee万腾平台以其卓越的技术实力和前瞻性的战略视野,成为了众多企业加速数字化转型、实现智能化升级的得力助手和智囊团。 加速转型&#xff…

人工智能时代:程序员如何在变革中保持核心竞争力?

随着人工智能生成内容(AIGC)领域的快速发展,大语言模型如ChatGPT、Midjourney、Claude等层出不穷,AI辅助编程工具迅速普及,程序员的工作方式正在经历翻天覆地的变革。面对这一趋势,有人担心AI可能取代部分编…

嵌入式处理器详解

文章目录 一、CPU、MPU、MCU、SoC、Application Processors的概念1.CPU (Central Processing Unit)2.MPU (Micro Processor Unit)3.MCU (Micro Controller Unit)4.SoC(System on Chip)5.Application Processors 二、哈弗架构与冯诺伊曼架构三、XIP概念四、嵌入式系统硬件组成五…