WebDriver API

WebDriver API 是一组允许程序控制和自动化Web浏览器的接口,它是Selenium框架的一部分。Selenium 是一个广泛使用的开源自动化测试工具,用于Web应用程序的自动化测试。WebDriver API 提供了与浏览器进行交互的能力,支持多种浏览器,包括Chrome、Firefox、Edge、Safari等。

本文会对其常用 API 进行详细的介绍。

目录

一、通过 WebDriver,WebElement 接口与浏览器交互

导航和操作浏览器

二、查找(定位)页面元素:findElement 和 findElements

常用的定位策略

关于XPath的基本语法

1. 绝对路径

2. 相对路径

相对路径常见用法

应用示例

示例代码

三、通过WebElement接口操作页面元素

1. send_keys

2. click

3. submit

4. clear

5. text

示例

四、添加等待

1. sleep 等待

2. 智能等待

2.1 隐式等待

方法签名

参数解释

2.2 显式等待

方法签名

参数解释

2.3 等待常见报错

隐式等待中的常见报错

显式等待中的常见报错

示例代码


一、通过 WebDriver,WebElement 接口与浏览器交互

WebDriver接口是整个API的核心,所有与浏览器的交互都是通过该接口实现的。具体的浏览器驱动程序(如ChromeDriverFirefoxDriver等)都是实现了该接口的类。

WebElement接口表示HTML文档中的一个元素。通过WebElement,可以执行各种操作,如点击、输入文本、获取元素属性等

我们通过一个具体的例子来感受一下 WebDriver 的大概功能。

package org.example;import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;public class WebDriverExample {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");// 初始化WebDriverWebDriver driver = new ChromeDriver();// 打开指定的URLdriver.get("https://www.example.com");// 查找元素WebElement searchBox = driver.findElement(By.name("q"));// 输入查询内容并提交searchBox.sendKeys("Selenium WebDriver");searchBox.submit();// 获取并打印当前页面的标题String title = driver.getTitle();System.out.println("Page title is: " + title);// 关闭浏览器driver.quit();}
}

以上代码展示了如何启动一个Chrome浏览器,打开一个指定的URL,查找搜索框元素,输入查询内容并提交,最后获取并打印页面标题,最后关闭浏览器。

导航和操作浏览器

笔者直接将相关导航和操作浏览器的方法写入示例中,请看示例:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;public class BrowserOperations {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 初始化WebDriverWebDriver driver = new ChromeDriver();// 打开百度首页driver.get("https://www.baidu.com");// 获取当前页面的标题String title = driver.getTitle();System.out.println("Page title is: " + title);// 获取当前页面的URLString currentUrl = driver.getCurrentUrl();System.out.println("Current URL is: " + currentUrl);// 打开另一个页面driver.get("https://www.google.com");// 获取新页面的标题String newTitle = driver.getTitle();System.out.println("New page title is: " + newTitle);// 关闭当前窗口driver.close();// 重新初始化WebDriver并打开百度首页(重新创建一个新的ChromeDriver实例并打开百度首页。)driver = new ChromeDriver();driver.get("https://www.baidu.com");// 退出浏览器,关闭所有相关窗口driver.quit();}
}

二、查找(定位)页面元素:findElement 和 findElements

在Selenium WebDriver中,findElementfindElements 是用于查找页面元素的两个主要方法。它们可以根据不同的定位策略来查找单个元素或多个元素。

findElementfindElements

作用

查找并返回页面上第一个匹配指定定位策略的元素查找并返回页面上所有匹配指定定位策略的元素
返回值返回一个 WebElement 对象

返回一个包含所有匹配元素的 List<WebElement> 对象

如果没有找到匹配的元素,返回一个空列表

异常处理如果找不到匹配的元素,会抛出 NoSuchElementException 异常即使找不到任何匹配的元素,也不会抛出异常,只会返回一个空的 List
示例
WebElement element = driver.findElement(By.id("elementId"));
List<WebElement> elements = driver.findElements(By.className("className"));

常用的定位策略

Selenium 提供了多种定位策略来查找元素:

定位策略方法

说明

示例
id
By.id(String id)
适用于元素有唯一的 id 属性
driver.findElement(By.id("elementId"));
name
By.name(String name)
适用于元素有唯一的 name 属性
driver.findElement(By.name("elementName"));
className
By.className(String className)
适用于元素有特定的 class 属性
driver.findElement(By.className("className"));
tagName
By.tagName(String tagName)
适用于查找特定标签名的元素,如 <input><button>
driver.findElement(By.tagName("div"));
LinkText
By.linkText(String linkText)	
适用于查找链接文本完全匹配的 <a> 标签
driver.findElement(By.linkText("Example Link"));
partialLinkText
By.partialLinkText(String linkText)	
适用于查找链接文本部分匹配的 <a> 标签
driver.findElement(By.partialLinkText("Example"));

cssSelector
By.cssSelector(String cssSelector)
适用于使用CSS选择器查找元素
driver.findElement(By.cssSelector(".className #id"));
XPath
By.xpath(String xpath)	
适用于使用XPath表达式查找元素
driver.findElement(By.xpath("//div[@id='elementId']"));

关于XPath的基本语法

XPath(XML Path Language)是一种在XML文档中查找元素的语言。虽然它主要用于XML文档,但在Web开发中,我们也经常使用XPath在HTML文档中定位网页元素。XPath非常强大,允许我们通过各种复杂的规则查找元素,这些规则比简单的ID或类名要灵活得多。

XPath提供了很多功能和表达式来定位元素。以下是一些常见的XPath语法和用法:

1. 绝对路径

绝对路径从根节点开始,一直指定到目标元素。绝对路径以单斜杠 / 开始。

/html/body/div[1]/div[2]/a

这个XPath表示从HTML根节点开始,依次经过body、div等节点,最终找到一个a标签。

2. 相对路径

相对路径从当前节点开始,不以单斜杠 / 开头。相对路径更常用,因为它更灵活,不依赖于页面的整体结构。

相对路径主要使用双斜杠 // 或单斜杠 / 开始:

  • //: 从当前节点的所有后代节点中查找匹配的元素,不限于直接子节点。
  • /: 从当前节点的直接子节点中查找匹配的元素。

相对路径常见用法

xpath说明示例说明
基于标签名称查找
//tagName
查找所有指定标签的元素
//div

查找所有的 div 元素

基于属性查找

//tagName[@attribute='value']

根据属性值查找元素

//input[@id='username']

查找 id 属性为 usernameinput 元素

基于部分属性值查找 contains

//tagName[contains(@attribute, 'partialValue')]

查找属性值中包含指定部分内容的元素。

//a[contains(@href, 'login')]

查找 href 属性中包含 login 的所有 a 元素

基于文本内容查找 text()
//tagName[text()='textValue']

根据元素的文本内容查找元素

//button[text()='Submit']

查找文本内容为 Submitbutton 元素。

基于部分文本内容的查找
//tagName[contains(text(), 'partialText')]

这查找文本内容中包含指定部分内容的元素

//p[contains(text(), 'Welcome')]

查找文本内容中包含 Welcome 的所有 p 元素

组合条件查找
//tagName[@attribute='value' and text()='textValue']

组合多个条件进行查找

//input[@type='text' and @name='username']

查找 type 属性为 textname 属性为 usernameinput 元素

查找父节点
//tagName/..
查找元素的父节点
//input[@id='username']/..

查找 idusernameinput 元素的父节点

查找子节点
//parentTagName/childTagName
查找直接子节点
//div/span

查找所有 div 元素的直接 span 子节点。

 补充:

基于通配符

1. 匹配任何标签

使用 * 作为标签名,可以匹配任何标签。这在不知道确切标签名的情况下非常有用。

//*[text()='Submit']

 这个XPath表达式匹配所有文本内容为 Submit 的元素,不论它们的标签名是什么。

2. 匹配部分属性值

使用 contains() 函数可以匹配部分属性值,特别适用于那些属性值会动态变化的情况。

//input[contains(@id, 'user')]

这个XPath表达式匹配所有 id 属性中包含 userinput 元素。

3. 匹配部分文本内容

同样可以使用 contains() 函数来匹配部分文本内容。

//div[contains(text(), 'Welcome')]

这个XPath表达式匹配所有文本内容中包含 Welcomediv 元素。

4. 匹配属性名

使用 @* 可以匹配任何属性名。

//*[@*='value']

这个XPath表达式匹配所有具有值为 value 的任意属性的元素。


应用示例

假设我们有以下HTML结构:

<html><body><div class="container"><h1>Welcome to My Page</h1><form id="loginForm"><input type="text" name="username" id="username" /><input type="password" name="password" /><button type="submit">Login</button></form></div></body>
</html>

我们可以使用以下XPath表达式查找元素:

1. 查找 idloginFormform 元素:

//form[@id='loginForm']

2. 查找 name 属性为 usernameinput 元素:

//input[@name='username']

3. 查找 type 属性为 submitbutton 元素:

//button[@type='submit']

4. 查找文本内容为 Welcome to My Pageh1 元素:

//h1[text()='Welcome to My Page']

5. 查找所有 div 元素中的 input 元素:

//div//input
示例代码

以下是一个使用相对路径的Java示例:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;public class XPathRelativeExample {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");// 初始化WebDriverWebDriver driver = new ChromeDriver();// 打开指定的URLdriver.get("https://www.example.com");// 使用XPath查找元素WebElement usernameInput = driver.findElement(By.xpath("//input[@id='username']"));WebElement loginButton = driver.findElement(By.xpath("//button[text()='Login']"));// 对元素进行操作usernameInput.sendKeys("myUsername");loginButton.click();// 关闭浏览器driver.quit();}
}

三、通过WebElement接口操作页面元素

Selenium webdriver 核心之一是对页面元素的操作,前文已经通过定位策略定位到了具体的元素, 那么接下来我们可以通过使用WebElement接口,拟用户行为,如输入文本、点击按钮、提交表单等。这使得我们能够自动化地执行各种用户操作,从而进行功能测试、回归测试等。

1. send_keys

send_keys 方法用于在输入框或文本区域上模拟按键输入。

示例:

WebElement inputField = driver.findElement(By.name("q"));
inputField.sendKeys("Selenium WebDriver");
  • 作用:向名为 "q" 的输入框输入 "Selenium WebDriver"。

2. click

click 方法用于点击页面上的元素,如按钮、链接等。

示例:

WebElement searchButton = driver.findElement(By.name("btnK"));
searchButton.click();
  • 作用:点击名为 "btnK" 的按钮。

3. submit

示例:

WebElement form = driver.findElement(By.name("formName"));
form.submit();
  • 作用:提交名为 "formName" 的表单。

clicksubmit 的区别

  • click:用于点击按钮、链接、复选框等任何可点击的元素。
  • submit:专门用于提交表单,通常应用于 <form> 元素或表单内的输入元素。

4. clear

clear 方法用于清除输入框或文本区域中的文本内容。

示例:

WebElement inputField = driver.findElement(By.name("q"));
inputField.clear();
  • 作用:清空名为 "q" 的输入框中的文本内容。

5. text

text 属性用于获取元素的文本内容。

示例:

WebElement element = driver.findElement(By.id("message"));
String message = element.getText();
System.out.println("Message: " + message);
  • 作用:获取ID为 "message" 的元素的文本内容并打印。

示例

以下是一个综合示例,展示如何使用这些方法在百度首页上进行操作:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;public class BaiduSearchTest {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 初始化WebDriverWebDriver driver = new ChromeDriver();// 打开百度首页driver.get("https://www.baidu.com");// 找到搜索输入框并输入搜索关键词WebElement searchBox = driver.findElement(By.id("kw"));searchBox.sendKeys("Selenium WebDriver");// 找到搜索按钮并点击WebElement searchButton = driver.findElement(By.id("su"));searchButton.click();// 找到搜索结果页面的某个元素,获取其文本内容WebElement result = driver.findElement(By.xpath("//div[@id='content_left']//h3/a"));String resultText = result.getText();System.out.println("搜索结果的标题: " + resultText);// 清空搜索输入框searchBox.clear();// 关闭浏览器driver.quit();}
}

四、添加等待

1. sleep 等待

Thread.sleep 是Java标准库中的一种强制等待方法,它会使当前线程暂停执行指定的时间(以毫秒为单位)。这种等待方式是非智能的,因为它无法根据网页加载的实际情况来调整等待时间。

示例

try {Thread.sleep(3000);  // 等待3秒
} catch (InterruptedException e) {e.printStackTrace();
}

2. 智能等待

智能等待是Selenium提供的一种更灵活的等待方式,它包括隐式等待和显式等待两种类型。智能等待可以根据网页加载的实际情况动态调整等待时间,从而提高测试的稳定性和效率。

2.1 隐式等待

隐式等待是设置一个全局的等待时间,在这个时间范围内,如果WebDriver没有找到元素,它将继续等待,直到超时。隐式等待是对整个WebDriver实例生效的。

方法签名
driver.manage().timeouts().implicitlyWait(long time, TimeUnit unit);
参数解释
  1. long time

    • 描述:等待时间的数值。
    • 作用:指定WebDriver在查找元素时的最大等待时间。
    • 示例:10 表示等待10个时间单位(由第二个参数 unit 指定)。
  2. TimeUnit unit

    • 描述:时间单位。
    • 作用:指定 time 参数的时间单位,可以是秒、毫秒、分钟等。
    • 示例:TimeUnit.SECONDS 表示时间单位为秒。

示例:

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

在这个示例中,WebDriver在查找元素时会等待最多10秒。如果元素在10秒内出现,WebDriver将立即继续执行。如果在10秒内没有找到元素,WebDriver将抛出 NoSuchElementException 异常。 

2.2 显式等待

显式等待是等待特定条件发生。显式等待可以在代码中指定等待的条件和最长等待时间。它只对特定的元素和条件生效。

方法签名
WebDriverWait wait = new WebDriverWait(WebDriver driver, long timeoutInSeconds);
WebElement element = wait.until(ExpectedConditions.condition);
参数解释
  1. WebDriver driver

    • 描述:WebDriver实例。
    • 作用:指定用于执行显式等待的WebDriver实例。
    • 示例:driver 是已初始化的WebDriver对象。
  2. long timeoutInSeconds

    • 描述:超时时间的数值,以秒为单位。
    • 作用:指定等待特定条件发生的最长时间,单位为秒。
    • 示例:10 表示等待最多10秒。
  3. ExpectedConditions.condition

    • 描述:指定等待的条件。
    • 作用:在超时时间内,WebDriver 将持续检查此条件是否成立。如果条件成立,until 方法将立即返回;否则,它将一直等待,直到超时时间结束。
    • 示例:ExpectedConditions.visibilityOfElementLocated(By.id("elementId")) 表示等待元素可见。

常用 ExpectedConditions

  • visibilityOfElementLocated(By locator): 等待元素可见。
  • elementToBeClickable(By locator): 等待元素可点击。
  • presenceOfElementLocated(By locator): 等待元素存在。
  • textToBePresentInElementLocated(By locator, String text): 等待元素中的文本为指定值。

示例:

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("elementId")));

在这个示例中,显式等待会等待最多10秒,直到指定的元素通过 ExpectedConditions 条件出现。如果在10秒内条件满足,WebDriver将继续执行。如果条件在10秒内没有满足,WebDriver将抛出 TimeoutException 异常。

2.3 等待常见报错

隐式等待中的常见报错

1. NoSuchElementException

  • 描述:WebDriver在指定的时间内未能找到元素。
  • 原因:隐式等待时间过短或页面加载速度较慢导致元素未能在预期时间内出现。
  • 解决方法:增加隐式等待时间,确保页面元素有足够的时间加载。

示例:

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); // 设置隐式等待时间为5秒
WebElement element = driver.findElement(By.id("nonexistentElement")); // 元素不存在,将抛出NoSuchElementException
显式等待中的常见报错

1. TimeoutException

  • 描述:在指定的时间内未能满足等待的条件。
  • 原因:条件未能在显式等待时间内得到满足,例如元素未能在指定时间内可见或可点击。
  • 解决方法:增加显式等待时间,检查条件设置是否正确,确保页面元素加载或状态变化所需时间足够。

示例:

WebDriverWait wait = new WebDriverWait(driver, 5); // 设置显式等待时间为5秒
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("nonexistentElement"))); // 元素不可见,将抛出TimeoutException

2. NoSuchElementException

  • 描述:在等待过程中试图访问不存在的元素
  • 原因查找条件设置错误,导致WebDriver尝试查找不存在的元素。
  • 解决方法:检查查找条件和元素定位方法是否正确。

示例:

WebDriverWait wait = new WebDriverWait(driver, 5);
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("nonexistentElement"))); // 元素不存在,将抛出NoSuchElementException
示例代码
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.util.concurrent.TimeUnit;public class WaitExample {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 初始化WebDriverWebDriver driver = new ChromeDriver();// 隐式等待示例try {driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); // 设置隐式等待时间为5秒WebElement element = driver.findElement(By.id("nonexistentElement")); // 可能抛出NoSuchElementException} catch (NoSuchElementException e) {System.out.println("隐式等待:元素未找到 - " + e.getMessage());}// 显式等待示例try {WebDriverWait wait = new WebDriverWait(driver, 5); // 设置显式等待时间为5秒WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("nonexistentElement"))); // 可能抛出TimeoutException} catch (TimeoutException e) {System.out.println("显式等待:条件未满足 - " + e.getMessage());}// 关闭浏览器driver.quit();}
}

阅读后文

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

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

相关文章

苹果电脑废纸篓数据被清空了,有什么方法可以恢复吗?

使用电脑的用户都知道&#xff0c;被删除的文件一般都会经过回收站&#xff0c;想要恢复它直接点击“还原”就可以恢复到原始位置。mac电脑同理也是这样&#xff0c;但是“回收站”在mac电脑显示为“废纸篓”。 苹果电脑废纸篓数据被清空了&#xff0c;有什么方法可以恢复吗&am…

java反射和注解

反射 获取class对象的三种方法 ①&#xff1a;Class.forName("全类名"); ②&#xff1a;类名.class ③&#xff1a;对象.getclass(); 代码样例 package com.ithema;public class Main {public static void main(String[] args) throws ClassNotFoundException {//第…

基于Canvas的Html5多时区动态时钟实战

目录 前言 一、关于Canvas技术 1、Canvas是什么 2、Canvas的属性及渲染特性 二、Canvas动态多时区展示 1、新建html页面 2、创建Canvas对象 3、绘制所有的时钟 总结 前言 出差旅行相信大家一定会住酒店&#xff0c;大家在酒店的前台进行预订的时候&#xff0c;是不是都…

centos执行yum相关命令报错的可能原因

文章目录 1. 执行yum命令是报下面一大帕拉2. 安装某个包报错&#xff0c;找不到这个包 1. 执行yum命令是报下面一大帕拉 最后一行报错&#xff0c;在repo文件中找不到空baseurl&#xff1a;xxx / x86_64 执行这行命令把这个找不到的 xxx 禁掉即可sudo yum-config-manager --di…

【项目日记(三)】搜索引擎-搜索模块

❣博主主页: 33的博客❣ ▶️文章专栏分类:项目日记◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多项目内容 目录 1.前言2.项目回顾3.搜索流程3.1分词3.2触发3.3去重3.4排序3.5包装 4.总结 1.前言 在前…

Qt的源码目录集合(V5.12.12版本)

目录 1.QObject实现源码 2.qml中的ListModel实现源码 3.qml中的JS运行时的环境和数据类型源码 1.QObject实现源码 .\Qt\Qt5.12.12\5.12.12\Src\qtbase\src\corelib\kernel\qobject.h .\Qt\Qt5.12.12\5.12.12\Src\qtbase\src\corelib\kernel\qobject.cpp .\Qt\Qt5.12.12\5…

虚拟机USB——解决每次插U盘都得选择连接到主机还是虚拟机问题

虚拟机USB——解决每次插U盘都得选择连接到主机还是虚拟机问题 1.编辑–>首选项–> 2.如果想每次插U盘都连接到主机就选“将设备连接到主机” 如果想每次插U盘都进行选择&#xff0c;就选择“询问要执行的操作”

Vscode常用快捷键

前言: 使用环境&#xff1a;ubuntu22.04 按键组合功能AltO切换源/头文件CtrlK,CtrlC注释CtrlK,CtrlU取消注释CtrlK,CtrlI格式化F12跳转函数定义CtrlAlt-跳转函数后返回CtrlW关闭当前标签页CtrlB关闭右侧边栏Ctrl← /→光标移至单词首/尾CtrlShift←/→跳选单词选中CtrlDelete删…

【软考论文】论基于架构的软件设计方法及应用(ABSD)

目录 一、题目二、论文2.1 摘要2.2 正文三、扩展一、题目 基于架构的软件设计(Architecture-Based Software Design,ABSD)方法以构成软件架构的 商业、质量和功能需求 等要素来驱动整个软件的开发过程。ABSD是一个自顶向下,递归细化的软件开发方法,它以软件系统功能的分解…

GCP FrontendConfig 详解:优化您的云负载均衡

目录 1. 什么是GCP FrontendConfig? 2. FrontendConfig的主要功能 2.1 协议选择 2.2 SSL/TLS配置 2.3 重定向配置 2.4 自定义响应头 3. 配置FrontendConfig 4. FrontendConfig的高级特性 4.1 智能路由 4.2 流量控制 4.3 日志和监控 5. FrontendConfig最佳实践 5.…

Ubuntu22.04使用/etc/rc.local开机启动程序

前言 因为在工作中&#xff0c;Ubuntu系统经常使用到开机启动&#xff0c;为了方便之后使用&#xff0c;特此介绍下如何使用/etc/rc.local来开机启动程序&#xff0c;步骤如下&#xff0c;针对Ubuntu20.04或Ubuntu22.04系统都有效。 使用root权限编辑/lib/systemd/system/rc-…

在 Mac 上使用 本地 LLM 文本终结

我们可使用本地大型语言模型&#xff0c;如Mistral、Llama等&#xff0c;来给文本做总结&#xff0c;相比在线的 Kimi &#xff0c;ChatGPT&#xff0c; 我们不用担心数据泄露&#xff0c;因为整个操作都是在本地电脑完成的。 我们用 ollama 举例 首先安装 ollama https://ol…

IPython脚本加载秘籍:探索脚本魔法的艺术

IPython脚本加载秘籍&#xff1a;探索脚本魔法的艺术 IPython&#xff0c;这个强大的交互式Python解释器&#xff0c;不仅提供了丰富的交互式编程功能&#xff0c;还允许用户加载和运行Python脚本。这一功能极大地扩展了IPython的实用性&#xff0c;使得用户可以在IPython环境…

数组-二分查找

二分查找 leetcode704 /*** param {number[]} nums* param {number} target* return {number}*/ var search function(nums, target) {let left 0, right nums.length - 1;while (left < right) {const mid Math.floor((right - left) / 2) left;const num nums[mid]…

SpringSecurity中文文档(体系结构).md

体系结构&#xff08;Architecture&#xff09; 本节讨论基于 Servlet 的应用程序中 Spring Security 的高级体系结构。我们将在参考文献的身份验证、授权和防止利用部分中构建这种高层次的理解。 过滤器的综述 &#xff08;A Review of Filters&#xff09; Spring Securit…

vue3弹窗usehook

说明 个人记录保存。 import {ref} from "vue";export default function useDialog(opts) {const visible ref(false)const loading ref(false)const open (v) > {visible.value truetypeof opts.onOpen "function" && opts.onOpen(v)}c…

实现WebSocket聊天室功能

实现WebSocket聊天室功能 什么是WebSocket&#xff1f;WebSocket的工作原理服务器端实现客户端实现 在现代Web开发中&#xff0c;实时通信已经变得越来越重要。传统的HTTP协议由于其无状态和单向通信的特点&#xff0c;无法很好地满足实时通信的需求。而WebSocket协议则应运而生…

【讨论C++继承】

讨论C继承 继承定义继承方式和访问限定符 基类和派生类的赋值转换继承中的作用域派生类的默认成员函数继承和友元继承和静态成员菱形继承虚拟继承 继承是面向对象程序设计中&#xff0c;使代码可以复用的重要手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展。 继…

【Jetpack】ViewModel数据共享

如何进行数据共享 ViewModel的数据共享&#xff0c;主要是通过ViewModelProvider来实现的 val viewModel ViewModelProvider(this).get(ContextViewModel::class.java)这里的this&#xff0c;可以是任意的ViewModelStoreOwner ViewModelStoreOwner的主要实现类包括&#xf…

【ONLYOFFICE】| 桌面编辑器从0-1使用初体验

目录 一. &#x1f981; 写在前面二. &#x1f981; 在线使用感受2.1 创建 ONLYOFFICE 账号2.2 编辑pdf文档2.3 pdf直接创建表格 三. &#x1f981; 写在最后 一. &#x1f981; 写在前面 所谓桌面编辑器就是一种用于编辑文本、图像、视频等多种自媒体的软件工具&#xff0c;具…