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.rhkb.cn/news/366910.html

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

相关文章

文生图功能介绍

Stable Diffusion WebUI&#xff08;SD WebUI&#xff09;及文生图功能介绍 一、引言 随着人工智能技术的飞速发展&#xff0c;AI绘画作为一种新兴的艺术形式&#xff0c;逐渐走入人们的视野。Stable Diffusion WebUI&#xff08;简称SD WebUI&#xff09;作为AI绘画领域的重…

Rust: polars行遍历,从dataframe到struct及Bar设计比较

pandas提供了iterrows()、itertuples()、apply等行遍历的方式&#xff0c;还是比较方便的。 polars的列操作功能非常强大&#xff0c;这个在其官网上有详细的介绍。由于polars底层的arrow是列存储模式&#xff0c;行操作效率低下&#xff0c;官方也不推荐以行方式进行数据操作。…

通过shell脚本创建MySQl数据库

通过shell脚本创建数据库 #!/bin/bashserverIP10.1.1.196 SERVER_NAMEecho $serverIP | cut -d . -f4cat<<EOF>db.sql drop database if exists ${SERVER_NAME}_scheduler; drop database if exists ${SERVER_NAME}_kms; drop database if exists ${SERVER_NAME}_uim…

修改CentOS7 yum源

修改CentOS默认yum源为阿里镜像源 备份系统自带yum源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下载ailiyun的yum源配置文件 CentOS7 yum源如下&#xff1a; wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun…

【0299】Postgres内核之哈希表(Hash Tables)

0. 哈希表(Hash Tables) 哈希表是 一种用于存储键值对的数据结构。与使用索引号访问元素的基本数组不同,哈希表使用键来查找表条目。这使得数据管理对于用户来说更易于管理,因为按属性对数据条目进行分类比按它们在一个巨大的列表中的数量更容易。 在 C++ 中,我们将哈希…

单向链表结构

链表结构简介 链表结构是一种用比较特殊的数据结构类型&#xff0c;它也是线性数据结构中的一种&#xff0c;但是与栈结构等线性数据结构不同&#xff0c;它的内部结构并不是一个简单的存储空间&#xff0c;而是一个带有指向性质的单元。要理解链表结构要弄清楚两个问题&#x…

鸿蒙:路由Router原理

页面路由&#xff1a;在应用程序中实现不同页面之间的跳转和数据传递 典型应用&#xff1a;商品信息返回、订单等多页面跳转 页面栈最大容量为32个页面&#xff0c;当页面需要销毁可以使用router.clear()方法清空页面栈 router有两种页面跳转模式&#xff1a; router.pushUrl…

入门Axure:快速掌握原型设计技能

2002 年&#xff0c;维克托和马丁在旧金山湾区的一家初创公司工作&#xff0c;发现自己一再被软件开发生命周期的限制所困扰&#xff0c;而且产品团队在编写规范之前很难评估他们的解决方案&#xff0c;开发人员经常不理解&#xff08;或不阅读&#xff09;给出的规范&#xff…

线程池666666

1. 作用 线程池内部维护了多个工作线程&#xff0c;每个工作线程都会去任务队列中拿取任务并执行&#xff0c;当执行完一个任务后不是马上销毁&#xff0c;而是继续保留执行其它任务。显然&#xff0c;线程池提高了多线程的复用率&#xff0c;减少了创建和销毁线程的时间。 2…

如何指定Microsoft Print To PDF的输出路径

在上一篇文章中&#xff0c;介绍了三种将文件转换为PDF的方式。默认情况下&#xff0c;在Microsoft Print To PDF的首选项里&#xff0c;是看不到输出路径的设置的。 需要一点小小的手段。 运行输入 control 打开控制面板&#xff0c;选择硬件和声音下的查看设备和打印机 找到…

ardupilot开发 --- 坐标变换 篇

Good Morning, and in case I dont see you, good afternoon, good evening, and good night! 0. 一些概念1. 坐标系的旋转1.1 轴角法1.2 四元素1.3 基于欧拉角的旋转矩阵1.3.1 单轴旋转矩阵1.3.2 多轴旋转矩阵1.3.3 其他 2. 齐次变换矩阵3. visp实践 0. 一些概念 相关概念&am…

github仓库的基本使用-创建、上传文件、删除

1.第一步 先点击左侧菜单栏的远程仓库 2.点击NEW 3.创建仓库 然后点击右下角的 CREATE 4.点击code 点击SSH,然后我出现了You don’t have any public SSH keys in your GitHub account. You can add a new public key, or try cloning this repository via HTTPS. 1&#xff…

你喜欢波段交易吗?

波段交易的核心在于精准捕捉市场中的长期趋势波动&#xff0c;以实现更为稳健的收益。与剥头皮和日内交易不同&#xff0c;波段交易者更倾向于持有交易头寸数日乃至数周&#xff0c;以更宽广的视角把握市场动态。 这种交易方式的优势在于&#xff0c;它降低了对即时市场反应的…

JavaWeb系列三: JavaScript学习 下

文章目录 js数组定义方式数组遍历 js函数函数入门函数使用方式使用方式一使用方式二 函数注意事项函数练习题 定义对象使用object定义使用{}定义 事件onload事件onclick事件失去焦点事件内容发生改变事件表单提交事件静态注册动态注册表单作业 dom对象文档对象模型document对象…

Linux --账号和权限管理

目录 1、 管理用户账号和组账概述 1.1 用户账号分类 1.2 组账号 1.3 UID 和 GID 2、用户账号文件 2.1 passwd 2.2 shadow 3、管理目录和文件属性 3.1 chage 命令 3.2 useradd 命令 3.3 passwd 命令 ​编辑3.4 usermod 命令 3.5 userdel 命令 4、用户账户的初始配置…

爬数据是什么意思?

爬数据的意思是&#xff1a;通过网络爬虫程序来获取需要的网站上的内容信息&#xff0c;比如文字、视频、图片等数据。网络爬虫&#xff08;网页蜘蛛&#xff09;是一种按照一定的规则&#xff0c;自动的抓取万维网信息的程序或者脚本。 学习一些爬数据的知识有什么用呢&#x…

分解+降维+预测!多重创新!直接写核心!EMD-KPCA-Transformer多变量时间序列光伏功率预测

分解降维预测&#xff01;多重创新&#xff01;直接写核心&#xff01;EMD-KPCA-Transformer多变量时间序列光伏功率预测 目录 分解降维预测&#xff01;多重创新&#xff01;直接写核心&#xff01;EMD-KPCA-Transformer多变量时间序列光伏功率预测效果一览基本介绍程序设计参…

[数据集][目标检测]水面垃圾水面漂浮物检测数据集VOC+YOLO格式3749张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3749 标注数量(xml文件个数)&#xff1a;3749 标注数量(txt文件个数)&#xff1a;3749 标注…

聊聊etsy平台,一个年入百万的项目

聊聊etsy平台&#xff0c;一个年入百万的项目 什么是etsy,这是怎样一个平台&#xff0c;怎样盈利的&#xff1f;相信现在大家满脑子都是这些疑问。 这个平台也是无意间一个学员提到的&#xff0c;据说他朋友靠这个平台年赚好几百万。苦于门槛太高&#xff0c;他也做不了。今天…

web权限到系统权限 内网学习第一天 权限提升 使用手工还是cs???msf可以不??

现在开始学习内网的相关的知识了&#xff0c;我们在拿下web权限过后&#xff0c;我们要看自己拿下的是什么权限&#xff0c;可能是普通的用户权限&#xff0c;这个连添加用户都不可以&#xff0c;这个时候我们就要进行权限提升操作了。 权限提升这点与我们后门进行内网渗透是乘…