当前位置: 首页 > news >正文

Selenium UI 自动化

一、Selenium 自动化

1、什么是Selenium?

Selenium是web应用中基于UI的自动化测试框架。

2、Selenium的特点?

支持多平台、多浏览器、多语言。

3、自动化工作原理?

在这里插入图片描述
通过上图,我们可以注意到3个角色,下面具体讲解一下:

  • 自动化脚本:对于java来说也就是使用WebDriver API编写的测试脚本。用于发送给浏览器驱动。
  • 浏览器的驱动(browser driver):每个浏览器都有自己的驱动,均以exe文件形式存在。比如谷歌的chromedriver.exe、火狐的geckodriver.exe、IE的IEDriverServer.exe。它来解析这些自动化测试的代码,解析后把它们发送给浏览器。
  • 浏览器:浏览器当然就是我们很熟悉的常用的各种浏览器。执行浏览器驱动发来的指令,并最终完成工程师想要的操作。

结合上图,我们可以进一步理解:

  1. 对于每一条Selenium脚本,一个http请求会被创建并且发送给浏览器的驱动。
  2. 浏览器驱动中包含了一个HTTP Server,用来接收这些http请求。
  3. HTTP Server接收到请求后根据请求来具体操控对应的浏览器。
  4. 浏览器执行具体的测试步骤。
  5. 浏览器将步骤执行结果返回给HTTP Server。
  6. HTTP Server又将结果返回给Selenium的脚本,如果是错误的http代码我们就会在控制台看到对应的报错信息。

二、配置Selenium自动测试环境(Java)

  1. Chrome浏览器。下载地址:https://www.google.cn/intl/zh-CN/chrome/
  2. Chrome的驱动(ChromeDriver)。注意驱动版本要和你的Chrome浏览器版本对应起来。下载地址:https://chromedriver.chromium.org/downloads
  3. Selenium3工具包。maven仓库导入依赖:https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java/3.141.59

编写第一个Selenium的Demo:

    public static void main(String[] args) throws InterruptedException {// 创建浏览器驱动WebDriver webDriver = new ChromeDriver();// 访问百度webDriver.get("https://www.baidu.com");}

三、常用 WebDriver API 学习

1、元素定位

元素的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象,webdriver 提供 findElement()findElements()两种方法搭配对象定位方法进行元素定位。webdriver 提供了一系列的对象定位方法:id、name、class name、link text、partial link text、tag name、xpath、css selector,我们实际测试中比较常用的主要有两种:

(1)css定位:css selector

css定位是基于css选择器的,我们可以通过查找页面中的选择器定位页面元素内容。比如常见的有id选择器:#id、类选择器:.class、标签选择器:标签名、后代选择器:父标签 子标签。

(2)xpath定位:xpath

XPath 是一种在XML 文档中定位元素的语言。功能比较强大,但是语法比较复杂,如果想要系统学习,推荐网站 W3school,这里大致介绍一下它的基本使用:

  1. 使用绝对路径定位元素/html/head/title 整个表达式的含义是从文档的根元素开始,选择其子元素 html,再选择子元素 head,最后选择 head 元素下的子元素 title

  2. 相对路径+索引//form/span[1]/input 这个表达式表示从根节点开始,找到所有名为“form”的元素,然后在每个form元素中找到第一个span元素,并在该span元素下找到input元素。这种方法使用了索引,以确切指定所需元素的位置。

  3. 相对路径+属性值//input[@class="s_ipt"] 此XPath表达式用于选择所有标签名为input且class属性的值为"s_ipt"的元素。@符号用于引用属性,这样就可以根据属性值来定位元素。

  4. 相对路径+通配符//[@="su"] 这个XPath表达式使用通配符*来选择文档中所有包含属性名包含指定字符串“su”的元素。这种方法可以用来定位具有特定属性的元素,而不关心具体是哪种元素。

  5. 相对路径+文本匹配//a[text()="新闻"] 该表达式选择所有标签名为a且文本内容为“新闻”的元素。在括号内使用text()函数来指定需要匹配的文本内容。

(3)css定位和xpath定位哪个更好?

如果主要任务是在Web开发中定义样式和布局,那么CSS选择器会更加适合;而如果需要进行复杂的XML文档处理或需要更精细的节点定位,XPath选择器则更为合适。另外CSS选择器是专门为HTML文档设计的,浏览器在解析和渲染HTML页面时会针对CSS选择器进行高效的优化。

PS:在实际的测试中可以打开开发者工具使用选择页面元素,鼠标右键即可快速得到元素的 css/xpath 的定位。

2、操作测试对象

  • click() 点击对象
  • sendKeys() 在对象上模拟按键输入
  • clear() 清除对象中输入的内容
  • submit() 对象提交

注:如果点击的元素放在 form 标签中,此时使用 submit 实现的效果和 click 是一样的;如果点击的元素放在非 form 标签中,此时使用 submit 会报错。

public class Main {public static void main(String[] args) throws InterruptedException {// 创建浏览器驱动WebDriver webDriver = new ChromeDriver();// 访问百度webDriver.get("https://www.baidu.com");sleep(1000);// 在输入框模拟键盘输入webDriver.findElement(By.cssSelector("#kw")).sendKeys("csdn不摸鱼的程序员");sleep(1000);// 点击"百度一下"webDriver.findElement(By.cssSelector("#su")).click();sleep(1000);// 清除输入框webDriver.findElement(By.cssSelector("#kw")).clear();sleep(1000);// 点击第一条搜索结果webDriver.findElement(By.cssSelector("#\\31  > div > div:nth-child(1) > h3 > a")).click();}
}

结果展示:

3、添加等待

(1)强制等待

在上述代码中我们已经用到了 sleep(),sleep() 是强制等待,它会根据里面的时间参数进行等待。

(2)隐式等待

public class ImplicitlyWaitExample {public static void main(String[] args) {WebDriver driver = new ChromeDriver();driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);  // 设置隐式等待时间为10秒driver.get("https://www.example.com");// 后续操作// ...driver.quit();}
}

在上述示例中,我们使用 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS) 来设置隐式等待时间为10秒。这样,在查找元素或执行命令时,WebDriver会等待一定的时间直到元素出现或超时为止。

注意事项:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS) 被放置在创建ChromeDriver实例之后,但是在执行任何实际的测试步骤之前。这确保了在整个测试过程中都会应用隐式等待设置,以便在查找元素时进行等待。值得注意的是,隐式等待仅需要设置一次,通常在WebDriver实例创建后立即设置即可。在整个测试执行过程中,这个设置会对后续的元素查找操作生效,直到WebDriver实例被关闭或隐式等待设置被清除为止。

(3)显式等待

public class WebDriverWaitExample {public static void main(String[] args) {WebDriver driver = new ChromeDriver();driver.get("https://www.example.com");// 使用显式等待等待元素可点击WebDriverWait wait = new WebDriverWait(driver, 10);WebElement button = wait.until(ExpectedConditions.elementToBeClickable(By.id("myButton")));button.click();// 后续操作// ...driver.quit();}
}

在上述示例中,我们使用了 WebDriverWait 结合 ExpectedConditions等待直到特定的条件 发生后再继续执行。在这里,我们等待元素可点击后再进行点击操作

4、信息获取

  • getText() 方法用于获取网页元素显示的文本内容,通常指的是元素内部的可见文本。
  • getAttribute() 方法用于获取元素的指定属性的值,比如id、name、class等。
    public static void main(String[] args) throws InterruptedException {// 创建浏览器驱动WebDriver webDriver = new ChromeDriver();// 访问百度webDriver.get("https://www.baidu.com");sleep(1000);// 获取百度词条文本String text = webDriver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")).getText();System.out.println("元素内文本:"+text);sleep(1000);// 获取输入框nameString name = webDriver.findElement(By.cssSelector("#kw")).getAttribute("name");System.out.println("元素属性 name:"+name);}

在这里插入图片描述

  • getCurrentUrl() 方法用于获取当前浏览器所在页面的 URL 地址。

  • getTitle() 方法用于获取当前页面的标题,即页面标签()中的文本内容。

    public static void main(String[] args) throws InterruptedException {// 创建浏览器驱动WebDriver webDriver = new ChromeDriver();// 访问百度webDriver.get("https://www.baidu.com");sleep(1000);// 获取百度urlString url = webDriver.getCurrentUrl();System.out.println("百度 url:"+url);sleep(1000);// 获取百度titleString title = webDriver.getTitle();System.out.println("百度 title:"+title);}

5、鼠标操作

  • click() 点击: 模拟鼠标左键单击操作,可以用于点击链接、按钮或其他可交互的元素。
  • doubleClick() 双击: 模拟鼠标左键双击操作,可以用于特定的双击交互场景。
  • contextClick() 右键点击: 模拟鼠标右键单击操作,可以触发上下文菜单或其他右键交互效果。
  • moveToElement() 悬停: 将鼠标移动到指定的元素上并悬停,可以用于触发显示悬停菜单或者提示信息。
  • dragAndDrop() 拖放: 模拟鼠标拖动操作,通常用于实现拖放交互效果。

Actions类代表用户交互的动作,它用于构建和执行用户在网页上的鼠标、键盘等操作。

public static void main(String[] args) throws InterruptedException {// 创建浏览器驱动WebDriver driver = new ChromeDriver();// 访问百度driver.get("https://www.baidu.com");sleep(1000);// 获取到百度一下按钮WebElement element = driver.findElement(By.cssSelector("#su"));// 初始化 actionActions actions = new Actions(driver);// 点击操作actions.click(element).perform();sleep(1000);// 获取底部元素WebElement element1 = driver.findElement(By.cssSelector("#bottom_layer > div > p:nth-child(8)"));// 双击操作actions.doubleClick(element1).perform();sleep(1000);// 获取“图片”文字WebElement element2 = driver.findElement(By.cssSelector("#s-top-left > a:nth-child(6)"));// 右键点击操作actions.contextClick(element2).perform();sleep(1000);// 获取到百度logoWebElement element3 = driver.findElement(By.cssSelector("#lg > map > area"));// 悬停操作actions.moveToElement(element3).perform();sleep(1000);// 模拟拖放操作(从底部移动到顶部)WebElement sourceElement = driver.findElement(By.cssSelector("#bottom_layer > div > p:nth-child(1) > a"));WebElement targetElement = driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)"));actions.dragAndDrop(sourceElement, targetElement).perform();sleep(1000);actions.click().perform();sleep(1000);}

在这里插入图片描述

PS:在 Selenium 中,perform()方法用于执行之前定义的动作序列。当你使用Actions类构建了一系列的鼠标或键盘操作时,这些操作并不会立即执行,而是将它们放入了一个动作序列中。只有当调用perform()方法时,Selenium才会按照你定义的顺序执行这些操作。这种设计方式的好处在于你可以构建复杂的鼠标和键盘操作序列,然后一次性执行它们。

6、键盘操作

  • sendKeys(Keys.TAB) // TAB
  • sendKeys(Keys.ENTER) // 回车
  • sendKeys(Keys.SPACE) // 空格键
  • sendKeys(Keys.ESCAPE) // 回退键(Esc)
  • sendKeys(Keys.CONTROL,“a”) // 全选(Ctrl+A)
  • sendKeys(Keys.CONTROL,“c”) // 复制(Ctrl+C)
  • sendKeys(Keys.CONTROL,“x”) // 剪贴(Ctrl+X)
  • sendKeys(Keys.CONTROL,“v”) // 粘贴(Ctrl+V)
    public static void main(String[] args) throws InterruptedException {// 创建浏览器驱动WebDriver driver = new ChromeDriver();// 访问百度driver.get("https://www.baidu.com");sleep(2000);// 获取到百度搜索框WebElement element = driver.findElement(By.cssSelector("#kw"));// 输入内容-》输入空格-》输入内容-》输入TAP-》输入内容-》回车键element.sendKeys("不摸鱼");sleep(1000);element.sendKeys(Keys.SPACE);sleep(1000);element.sendKeys("的");sleep(1000);element.sendKeys(Keys.TAB);sleep(1000);element.sendKeys("程序员");sleep(1000);element.sendKeys(Keys.ENTER);// 全选-》剪贴-》粘贴element.sendKeys(Keys.CONTROL,"a");sleep(1000);element.sendKeys(Keys.CONTROL,"x");sleep(1000);element.sendKeys(Keys.CONTROL,"v");sleep(1000);}

在这里插入图片描述

7、浏览器操作

  • webDriver.navigate().forward():这条语句是用于让浏览器向前导航,即转到浏览历史中的下一个页面。
  • webDriver.navigate().back():与forward()相反,该语句用于使浏览器返回到浏览历史中的上一个页面。
  • webDriver.manage().window().maximize():这是用来最大化浏览器窗口的操作。
  • webDriver.manage().window().setSize(new Dimension(width, height)):该语句用于设置浏览器窗口的大小。你可以指定所需的宽度和高度参数,从而调整浏览器窗口的大小,适应不同的测试场景或需求。
  • window.scrollTo(0, document.body.scrollHeight) Js脚本,实现滚动到页面底部。(第一个参数是水平滚动位置,第二个参数是垂直滚动位置)
  • window.scrollTo(0, 0) Js脚本,实现滚动到页面顶部。
    public static void main(String[] args) throws InterruptedException {// 创建浏览器驱动WebDriver driver = new ChromeDriver();// 访问百度driver.get("https://www.baidu.com");sleep(2000);// 获取到百度搜索框WebElement element = driver.findElement(By.cssSelector("#kw"));// 搜索“软件测试”element.sendKeys("软件测试");sleep(1000);element.sendKeys(Keys.ENTER);sleep(1000);// 返回百度首页driver.navigate().back();sleep(1000);// 返回软件测试搜索页driver.navigate().forward();sleep(1000);// 自定义浏览器窗口driver.manage().window().setSize(new Dimension(500,500));sleep(1000);// 实现浏览器窗口最大化driver.manage().window().maximize();sleep(1000);// 实现滚动到页面底部JavascriptExecutor js = (JavascriptExecutor) driver;js.executeScript("window.scrollTo(0, document.body.scrollHeight)");sleep(1000);// 实现滚动到页面顶部js.executeScript("window.scrollTo(0, 0)");sleep(1000);}

8、弹窗操作

Alert弹窗、确认框(Confirm)、提示框(Prompt):

  • switchTo().alert():用于切换到页面上的警告框,并返回一个Alert对象,你可以使用这个对象来接受、取消或者输入文本到警告框中。
  • alert.accept():用于接受警告框(点击“确定”按钮)。
  • alert.dismiss():用于取消警告框(点击“取消”按钮)。
  • alert.sendKeys("your_text"):用于在警告框中输入文本。

下面就以Prompt提示框为例进行演示:

    public static void main(String[] args) throws InterruptedException {// 创建浏览器驱动WebDriver webDriver = new ChromeDriver();// 访问webDriver.get("http://localhost:63342/autoTest/src/main/page/alert.html?_ijt=g52rrlh3gfrag8ivs5g3ec40c0");sleep(1500);// 点击弹窗按钮webDriver.findElement(By.cssSelector("body > button")).click();sleep(1000);// 切换到页面上的警告框Alert alert = webDriver.switchTo().alert();// 点击取消alert.dismiss();sleep(1000);// 再次点击按钮webDriver.findElement(By.cssSelector("body > button")).click();sleep(1000);// 输入“不摸鱼”alert = webDriver.switchTo().alert();alert.sendKeys("不摸鱼");sleep(1000);// 点击确定alert.accept();sleep(1000);}

9、选项操作

单选按钮(Radio Button)操作:

  • 通过WebElement对象来处理单选按钮。
  • click():单击选择单选按钮。

复选框(Checkbox)操作:

  • 通过WebElement对象来处理复选框。
  • click():单击以切换复选框的选中状态。
    public static void main(String[] args) throws InterruptedException {// 创建浏览器驱动WebDriver webDriver = new ChromeDriver();// 访问webDriver.get("http://localhost:63342/autoTest/src/main/page/choice.html?_ijt=fc7i1795ada371afdv81v0iqk2");sleep(1500);// 选择并点击2/3两个复选框WebElement box1 = webDriver.findElement(By.cssSelector("#c2"));box1.click();sleep(1000);WebElement box2 = webDriver.findElement(By.cssSelector("#c3"));box2.click();sleep(1000);// 选择第二个单选框WebElement choice = webDriver.findElement(By.cssSelector("#r2"));choice.click();sleep(1000);}

在这里插入图片描述

10、下拉框操作

通过Select类来处理下拉框:

  • selectByVisibleText("visible_text"):根据下拉选项的可见文本进行选择。
  • selectByValue("value"):根据下拉选项的值进行选择。
  • selectByIndex(index):根据下拉选项的索引进行选择(从0开始)。
    public static void main(String[] args) throws InterruptedException {// 创建浏览器驱动WebDriver webDriver = new ChromeDriver();// 访问webDriver.get("http://localhost:63342/autoTest/src/main/page/pulldown.html?_ijt=bjk05362bbitst3j1nrntnnrn9");sleep(1500);// 定位下拉框按钮WebElement shippingMethod = webDriver.findElement(By.name("ShippingMethod"));sleep(1000);// 定义select对象Select select = new Select(shippingMethod);// 根据索引选择第3个select.selectByIndex(2);sleep(1000);// 根据属性孩子选择value=11.61select.selectByValue("11.61");sleep(1000);}

11、上传文件

WebElement.sendKeys():这是用于将文件路径发送到 input 元素的方法。你可以找到file input元素,然后调用sendKeys()方法并传递文件的绝对路径作为参数,以便实现文件上传操作。

    public static void main(String[] args) throws InterruptedException, IOException {// 创建浏览器驱动WebDriver webDriver = new ChromeDriver();// 访问webDriver.get("http://localhost:63342/autoTest/src/main/page/upload.html?_ijt=bhatof5910d1h8q6675j3jjoa5");sleep(1500);// 上传图片WebElement uploadFile = webDriver.findElement(By.cssSelector("body > input[type=file]"));uploadFile.sendKeys("D:\\博客图片\\MyBlog\\java.png");sleep(1000);}

12、截图

截图操作需要导入Commons-io依赖:https://mvnrepository.com/artifact/commons-io/commons-io/2.11.0

然后调用 TakesScreenshot 接口中的 getScreenshotAs() 方法:

    public static void main(String[] args) throws InterruptedException, IOException {// 创建浏览器驱动WebDriver webDriver = new ChromeDriver();// 访问webDriver.get("https://www.baidu.com");sleep(1500);// 搜索“不摸鱼的程序员”webDriver.findElement(By.cssSelector("#kw")).sendKeys("不摸鱼的程序员-csdn");webDriver.findElement(By.cssSelector("#su")).click();sleep(3000);// 截图File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);// 将图片保存到硬盘FileUtils.copyFile(file, new File("D://20231111.png"));}

13、iframe 框架定位

在 web 页面中如果使用到iframe框架,则不能直接对框架内部的元素进行定位,需要先切换到对应的iframe在进行定位操作:

  • webDriver.switchTo().frame():这是Selenium中用于切换到指定iframe的主要方法。你可以通过索引ID名称WebElement对象来指定要切换到的iframe。
  • webDriver.switchTo().parentFrame():当你需要从iframe返回到其上一级的上下文时,可以使用这个方法。
  • webDriver.switchTo().defaultContent():如果你需要从所有嵌套的iframes中返回到最外层的页面上下文,可以使用这个方法。
    public static void main(String[] args) throws InterruptedException, IOException {// 创建浏览器驱动WebDriver webDriver = new ChromeDriver();// 访问webDriver.get("http://localhost:63342/autoTest/src/main/page/iframe.html?_ijt=hiqvtbuga50aga3831ql9nu2ph");sleep(1500);// 切换到 iframe:f1webDriver.switchTo().frame("f1");// 点击内部的clickwebDriver.findElement(By.cssSelector("body > div > div > a")).click();sleep(1000);}

14、多窗口定位

在讲解多窗口定位前,我们先了解一下 窗口句柄

窗口句柄是一个在操作系统级别用于标识窗口的唯一标识符。在Selenium中,窗口句柄通常用于标识浏览器窗口或标签页,并且允许我们在多个窗口之间进行切换和操作。当你在浏览器中打开一个新的标签页或窗口时,每个窗口都有自己的唯一句柄。通过获取这些句柄,Selenium可以帮助你跟踪和管理不同的窗口,从而实现在多个窗口之间进行切换、定位元素和执行操作的功能。

Selenium 中提供了如下api用于操作窗口:

  • 获取当前窗口句柄:使用driver.getWindowHandle()方法可以获取当前窗口的句柄。
  • 获取所有窗口句柄:使用driver.getWindowHandles()方法可以获取所有打开窗口的句柄。
  • 切换窗口:使用driver.switchTo().window(windowHandle)方法可以切换到指定的窗口。
    public static void main(String[] args) throws InterruptedException, IOException {// 创建浏览器驱动WebDriver webDriver = new ChromeDriver();// 访问百度(注:此时窗口句柄在百度首页,webDerive的所有操作只能针对首页)webDriver.get("https://www.baidu.com");sleep(1500);// 打开百度图片窗口webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(6)")).click();sleep(1000);// 先将窗口句柄切换到百度图片窗口// 1.获取所有窗口句柄Set<String> windowHandles = webDriver.getWindowHandles();// 2.找到最后一个句柄即为百度图片窗口句柄String imageHHandle = "";for (String handle : windowHandles) {imageHHandle = handle;}// 3.切换到百度图片窗口webDriver.switchTo().window(imageHHandle);// 点击百度图片窗口中的头像标签webDriver.findElement(By.cssSelector("#wrapper_head_box > div > div > div > div > div.hotquery > a:nth-child(3)")).click();sleep(1000);}

15、浏览器关闭操作

  • webDriver.close() 关闭当前聚焦的浏览器窗口,不会清空会话和缓存。
  • webDriver.quit() 关闭所有的浏览器窗口,会清空会话和缓存。
    public static void main(String[] args) throws InterruptedException, IOException {// 创建浏览器驱动WebDriver webDriver = new ChromeDriver();// 访问百度(注:此时窗口句柄在百度首页,webDerive的所有操作只能针对首页)webDriver.get("https://www.baidu.com");String mainHandle = webDriver.getWindowHandle(); // 获取首页句柄sleep(1500);// 打开百度图片窗口webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(6)")).click();sleep(1500);// 切换到主页(这个操作只是为了将显示页面切换到首页,句柄还是首页)webDriver.switchTo().window(mainHandle);sleep(1500);// 打开百度贴吧窗口webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(4)")).click();sleep(1500);// 关闭当前聚焦页面(注:由于此时窗口句柄为百度首页,所以此时close()会关闭首页,而不是百度图片页)webDriver.close();sleep(1500);// 关闭浏览器webDriver.quit();}

相关文章:

Selenium UI 自动化

一、Selenium 自动化 1、什么是Selenium&#xff1f; Selenium是web应用中基于UI的自动化测试框架。 2、Selenium的特点&#xff1f; 支持多平台、多浏览器、多语言。 3、自动化工作原理&#xff1f; 通过上图&#xff0c;我们可以注意到3个角色&#xff0c;下面具体讲解一…...

竞赛 题目:基于深度学习的图像风格迁移 - [ 卷积神经网络 机器视觉 ]

文章目录 0 简介1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习卷积神经网络的花卉识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…...

【unity3D-网格编程】01:Mesh基础属性以及用代码创建一个三角形

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的网格编程方面学习笔记 &#x1f236;本篇是unity的网格编程系列01-mesh基础属性 网格编程系列01 mesh基础属性实践操作用代码初始化一个三角形在三角形的基础上改成正…...

Java贪吃蛇小游戏

Java贪吃蛇小游戏 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.LinkedList; import java.util.Random;publi…...

Linux:系统基本信息扫描(1)

#系统基本信息: uname -a #Linux发行版信息: lsb_release -a #内核与发行版信息: cat /proc/version #linux 用户 cat /etc/passwd #Linux 组查询 cat /etc/group #CPU详细信息:lscpu -a #获取CPU模式: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling\_governor #per…...

VR全景打造亮眼吸睛创意内容:三维模型、实景建模

随着VR技术在不同行业之间应用落地&#xff0c;市场规模也在快速扩大&#xff0c;VR全景这种全新的视觉体验为我们生活中的许多方面都带来了无限的可能。更加完整的呈现出一个场景或是物体的所有细节&#xff0c;让浏览者感受到自己仿佛置身于现场一般&#xff1b;其次&#xf…...

ProTable高级表格获取表单数据

隐藏高级表格中的收起按钮 手动控制高级表格中的搜索按钮 获取高级表格中的表单数据 Forminstance 引入 然后在代码中定义 const refForm useRef(); 使用 refForm.current.getFileDsValue();...

力扣刷题第二十七天--二叉树

前言 题目大同小异&#xff0c;按要求来即可。 内容 一、二叉树的右视图 199.二叉树的右视图 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 广度优先搜索 取每层最后一个…...

一个快递包裹的跨国之旅

事情要从今年三月份说起&#xff0c;一位爱尔兰的同事在6月份结婚&#xff0c;团队同事准备了中国风的丝绸画轴、领带、丝巾作为礼物。3月份开始邮寄&#xff0c;4月初爱尔兰方面收件&#xff0c;5月份因为文件不足、不完整、不正确等原因被取消进口&#xff0c;7月份退回到大连…...

qsort函数使用方法总结

目录 一、qsort函数原型 二、compar参数 三、各种类型的qsort排序 1. int 数组排序 2. 结构体排序 3. 字符串指针数组排序 4. 字符串二维数组排序 四、回调函数 1. 什么是回调函数 2. 为什么要用回调函数&#xff1f; 3. 怎么使用回调函数&#xff1f; 4.下面是…...

机器学习介绍与分类

随着科学技术的不断发展&#xff0c;机器学习作为人工智能领域的重要分支&#xff0c;正逐渐引起广泛的关注和应用。本文将介绍机器学习的基本概念、原理和分类方法&#xff0c;帮助读者更好地理解和应用机器学习技术。 一、机器学习的基本概念 机器学习是一种通过从数据中学…...

linux控制台命令

进入root sudo su root 浏览当前文件夹列表 ll ls 查看文件 vim test.txt :q 退出查看模式 上传 sudo rz rz 覆盖上传 rz -y 修改文件名&#xff1a; mv 旧文件名 新文件名 修改文件权限 sudo chmod ar xxx.txt sudo chmod 777 test.txt 7 4 2 1 读写运行权限…...

快时尚品牌Halara登上TikTok美国小店榜Top 5,运动健身风靡TikTok

TikTok Shop美国电商数据周榜&#xff08;11/06-12&#xff09;已出&#xff0c;具体信息如下&#xff1a; 上周总GMV达到5850万美元&#xff0c;日均出单840万美元&#xff1b;单日出单最高达2110万美元&#xff0c;是当前美国单日最高销售额&#xff1b; 截至11月12日&…...

Docker 安装 Oracle Database 23c

目录 访问 Oracle 官方网站 使用 Docker 运行 Oracle Database 23c 免费容器映像 创建并运行 Oracle Database 23c 容器 查看已下载的镜像 列出正在运行的容器 进入容器 sqlplus 命令 访问 Oracle 官方网站 Database Software Downloads | Oracle 中国 使用 Docker 运行…...

什么是美国服务器,有哪些优势,适用于什么场景?

​  在互联网发展的过程中&#xff0c;服务器扮演着至关重要的角色。而美国作为全球信息技术的中心&#xff0c;其服务器在全球范围内受到广泛关注。  美国服务器是指在美国本土机房搭建并运行的服务器。其拥有带宽大、优质硬件、售后运维好、位置优越、数据安全性高以及免备…...

TeXLive 2023安装教程

TeXLive 2023安装教程 本文介绍最新TeX发行版——TeXLive 2023的安装步骤。如果你想用LaTeX进行写作&#xff0c;那么需要搭建LaTeX环境&#xff1a;可以选择下面两种方案之一进行安装&#xff1a;(1)TeXLive 2023TeXStudio或者(2)TeXLive 2023WinEdt 11。其中TeXLive 2023是由…...

uniapp中swiper 轮播带左右箭头,点击切换轮播效果demo(整理)

可以点击箭头左右切换-进行轮播 <template><view class"swiper-container"><swiper class"swiper" :current"currentIndex" :autoplay"true" interval"9000" circular indicator-dotschange"handleSw…...

网络连接Android设备

参考&#xff1a;https://blog.csdn.net/qq_37858386/article/details/123755700 二、网络adb调试开启步骤 1、把Android平板或者手机WiFi连接到跟PC机子同一个网段的网络&#xff0c;在设置-系统-关于-状态 下面查看设备IP,然后查看PC是否可以ping通手机的设备的IP。 2、先…...

Redis(位图Bitmap和位域Bitfield)

位图&#xff1a; 位图是字符串类型的扩展。 Redis中的位图是一种特殊的数据结构&#xff0c;用于表示一系列位的集合。它可以存储大量的布尔值数据&#xff0c;每个位代表一个布尔值&#xff08;0或1&#xff09;&#xff0c;并且可以对这些位进行各种位运算操作。位图通常用…...

【ArcGIS】批量对栅格图像按要素掩膜提取

要把一张大的栅格图裁成分省或者分县市的栅格集&#xff0c;一般是用ArcGIS里的按掩膜提取。 但是有的时候所要求的栅格集量非常大&#xff0c;所以用代码来做批量掩膜&#xff08;按字段&#xff09;会非常方便。 import arcpy , shutil , os from arcpy import env from ar…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...

游戏开发中常见的战斗数值英文缩写对照表

游戏开发中常见的战斗数值英文缩写对照表 基础属性&#xff08;Basic Attributes&#xff09; 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...