Selenium自动化测试 常见API的使用

news2024/11/24 15:23:37

本篇文章内容是关于 Selenium 自动化测试工具的常见 API 的使用
Selenium版本:4.23.1
编程语言:Java JDK22
编译器:IDEA 2024.2.0.2
浏览器版本:谷歌浏览器128.0.6613.36(正式版本) (64 位)
ChromeDriver:128.0.6613.84

依赖项下载地址:https://mvnrepository.com/
谷歌浏览器驱动下载地址(一定要和浏览器对应的版本匹配):https://googlechromelabs.github.io/chrome-for-testing/#stable
或者版本比较旧的 https://chromedriver.storage.googleapis.com/index.html

接下来所有的 Web 页面操作示例都会以百度的页面演示

findment 定位页面元素操作

    private static void test001() {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        //打开百度页面
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        //定位元素
        webDriver.findElement(By.cssSelector(".s_ipt"));
    }

“允许所有请求”操作在 Selenium4 后可以不用添加
页面元素定位可以在页面按F12,然后使用元素选择作即可,找到对应的代码进行 CSS 样式的复制
在这里插入图片描述

sendKeys 在搜索框中输入信息

    private static void test001() {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
        element.sendKeys("测试在搜索框中输入数据");
    }

click 模拟点击操作

    private static void test001() {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
        element.sendKeys("测试在搜索框中输入数据");
        //找到“百度一下按钮” 模拟确认操作
        webDriver.findElement(By.cssSelector("#su")).click();
    }

clear 清空搜索框信息

    private static void test001() {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
        element.sendKeys("测试在搜索框中输入数据");
        //找到“百度一下按钮” 模拟确认操作
        webDriver.findElement(By.cssSelector("#su")).click();
        webDriver.findElement(By.cssSelector("#kw")).clear();
    }

等待操作 (sleep,隐式等待,显式等待)

普通的等待

调用sleep() API即可

智能等待

智能等待可以提前结束等待,比如设置了等待 3 秒,如果 3 秒内满足了条件,就会提前结束等待。最长等待结束时间为 3 秒

智能等待分为 隐式等待 和 显示等待
两者的区别是 隐式等待要等待当前页面的所有元素加载出来后才会提前结束等待。显示等待可以设置为页面上某一个元素加载出来后就可以提前结束等待。

隐式等待

    private static void test002() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");

        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
    }

显示等待

    private static void test03() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        //元素出来后,等待结束。
        WebDriverWait wait = new WebDriverWait(webDriver, Duration.ofSeconds(3));
        //等待该元素加载出来后就可以提前结束等待
        wait.until(ExpectedConditions.titleIs("百度一下,你就知道"));
    }

自动化操作浏览器(后退,刷新,前进,滑动滚动条,最大化窗口,全屏,设置窗口大小)

    private static void test04() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        //在搜索框搜索
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件");
        webDriver.findElement(By.cssSelector("#su")).click();
        //浏览器后退
        sleep(3000);
        webDriver.navigate().back();
        sleep(3000);
        //刷新
        webDriver.navigate().refresh();
        sleep(3000);
        //前进
        webDriver.navigate().forward();
        sleep(3000);
       //滚动条操作 ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
        //最大化窗口
        webDriver.manage().window().maximize();
        sleep(3000);
        //全屏
        webDriver.manage().window().fullscreen();
        sleep(3000);
        //设置窗口大小
        webDriver.manage().window().setSize(new Dimension(600,1000));
    }

自动化键盘操作(CTRL + A ,CTRL + X ,CTRL + V)

    private static void test05() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        //在搜索框搜索
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件");
        // ctrl A + X + V
        sleep(3000);
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");
        sleep(3000);
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X");
        sleep(3000);
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");

    }

自动化鼠标操作(单击左键,单击右键)

    private static void test06() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("跑步");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //找到图片按钮
        WebElement webElement = webDriver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-pic_p4Uej.s-tab-pic"));
        Actions actions = new Actions(webDriver);
        sleep(3000);
        //鼠标右击
        actions.moveToElement(webElement).contextClick().perform();
        sleep(3000);
        //鼠标左击
        actions.moveToElement(webElement).click().perform();
    }

解释一下 perform
在Selenium WebDriver中,perform() 方法用于执行之前通过 Actions 类构建的一系列鼠标或键盘操作。当你构建了一个动作序列之后,必须调用 perform() 方法来实际执行这些操作。这是因为 Selenium 设计 Actions 类时采用了“构建-执行”模式,这样可以让你灵活地构建一系列连续的动作,然后再一次性执行它们。
为什么需要perform()
构建动作序列:Actions 类允许你构建一系列动作,如移动鼠标、点击等,而不立即执行它们。这使得你可以组合多个动作,形成更复杂的操作。
执行动作序列:一旦构建好了动作序列,你必须调用 perform() 方法来实际执行这些动作。如果不调用 perform() ,构建的动作将不会被执行。

模拟浏览器操作(quit 、close)

    private static void test07() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        sleep(3000);
        //webDriver.quit(); // 关闭整个浏览器
        //webDriver.close();  //关闭get方法打开的页面
    }

quit 和 close 的区别
quit 关闭的是整个浏览器,而close 只是关闭get打开的页面
quit 会清空缓存,close 不会清空

获取新窗口的操作句柄

当打开一个新的窗口或标签页时,WebDriver会保持在原来的窗口。为了能够与新打开的窗口进行交互,需要使用窗口句柄来切换到那个窗口

    private static void test08() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        sleep(3000);
        //通过 getWindowHandles 获取所有的窗口句柄
        //通过 getWindowHandle 获取get打开的页面的窗口句柄
        Set<String> handles = webDriver.getWindowHandles();
        String target_handle = "";
        for(String handle:handles)
        {
            target_handle = handle;
        }
        webDriver.switchTo().window(target_handle);
        //一定要获取到当前页面句柄才能进行下面的操作
        //否则会找不到元素,原因是元素默认是在 get 打开的页面找的
        webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");
        webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
    }

模拟截图操作

截图后需要设置图片的存放路径,设计到文件的操作,需要在 POM 文件引入新的依赖项

        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
    private static void test09() throws InterruptedException, IOException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //图片保存路径
        File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(file,new File("D://test.png"));
    }

findElements 定位一组元素

webdriver 可以很方便的使用findElement 方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用findElements 方法。

定位一组对象一般用于以下场景:
批量操作对象,比如将页面上所有的checkbox 都勾上先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox,然后选择最后一个

以下是 html 代码,页面为一组checkbox 元素,方便演示

<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <title>Checkbox</title>
</head>
<body>
<h3>checkbox</h3>
<div class="well">
    <form class="form-horizontal">
        <div class="control-group">
            <label class="control-label" for="c1">checkbox1</label>
            <div class="controls">
                <input type="checkbox" id="c1" />
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="c2">checkbox2</label>
            <div class="controls">
                <input type="checkbox" id="c2" />
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="c3">checkbox3</label>
            <div class="controls">
                <input type="checkbox" id="c3" />
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="r">radio</label>
            <div class="controls">
                <input type="radio" id="r1" />
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="r">radio</label>
            <div class="controls">
                <input type="radio" id="r2" />
            </div>
        </div>
    </form>
</div>
</body>
</html>

页面如下:
在这里插入图片描述

    private static void page01() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("D:\\code\\java\\seleniumstudy\\src\\page\\page01.html");
        List<WebElement> webElements = webDriver.findElements(By.cssSelector("input"));
        for(int i = 0;i < webElements.size();i++)
        {
            //如果每个元素type值等于checkbox进行点击
            //getAttribute 获取页面上的元素属性值,里面的type是当前的元素属性
            if(webElements.get(i).getAttribute("type").equals("checkbox"))
            {
                webElements.get(i).click();
            }
            else{}
        }
    }

在这里插入图片描述

frame 多层级框架定位

多层级框架定位在Selenium WebDriver中非常重要,尤其是在测试使用了嵌套框架的Web页面时。框架(Frames)是一种HTML元素,用于在一个页面中嵌入另一个独立的文档。当页面包含多个嵌套的框架时,就需要使用多层级框架定位来进行测试。
如果不使用多层级框架定位,就会出现无法定位的情况

前端演示页面代码:

<head>
  <meta http-equiv="content-type" content="text/html;charset=utf-8" />
  <title>frame</title>
<!--  <link-->
<!--          href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstra-->
<!--p-combined.min.css" rel="stylesheet" />-->
  <script type="text/javascript">$(document).ready(function(){
});
  </script>
</head>
<body>
<div class="row-fluid">
  <div class="span10 well">
    <h3>frame</h3>
    <iframe id="f1" src="inner.html" width="800",
            height="600"></iframe>
  </div>
</div>
</body>
<!--<script-->
<!--        src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.-->
<!--min.js"></script>-->
</html>

inner.html

<html>
<head>
  <meta http-equiv="content-type" content="text/html;charset=utf-8" />
  <title>inner</title>
</head>
<body>
<div class="row-fluid">
  <div class="span6 well">
    <h3>inner</h3>
    <iframe id="f2" src="http://www.baidu.com"
            width="700"height="500"></iframe>
    <a href="javascript:alert('watir-webdriver better than
selenium webdriver;')">click</a>
  </div>
</div>
</body>
</html>

前端页面图在这里插入图片描述

现在想定位 click 这个元素,如果不使用多层级框架定位的 API 是无法定位到的。

    private static void page02() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("D:\\code\\java\\seleniumstudy\\src\\page\\page02.html");
        webDriver.switchTo().frame("f1");
        webDriver.findElement(By.cssSelector("body > div > div > a")).click();
    }

模拟 下拉框操作

前端页面代码

<html>
<body>
<select id="ShippingMethod"
        onchange="updateShipping(options[selectedIndex]);" name="ShippingMethod">
  <option value="12.51">UPS Next Day Air ==> $12.51</option>
  <option value="11.61">UPS Next Day Air Saver ==> $11.61</option>
  <option value="10.69">UPS 3 Day Select ==> $10.69</option>
  <option value="9.03">UPS 2nd Day Air ==> $9.03</option>
  <option value="8.34">UPS Ground ==> $8.34</option>
  <option value="9.25">USPS Priority Mail Insured ==> $9.25</option>
  <option value="7.45">USPS Priority Mail ==> $7.45</option>
  <option value="3.20" selected="">USPS First Class ==> $3.20</option>
</select>
</body>
</html>

前端页面图
在这里插入图片描述

    private static void page03() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("D:\\code\\java\\seleniumstudy\\src\\page\\page03.html");
        WebElement webElement = webDriver.findElement(By.cssSelector("#ShippingMethod"));
        Select select = new Select(webElement);
        //通过下标选中
        //select.selectByIndex(3);
        //通过值选中
        select.selectByValue("12.51");
    }

模拟alert 弹窗操作

前端页面图
在这里插入图片描述
点击按钮后,出现弹窗,可以输入信息,并显示到页面
在这里插入图片描述
前端代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>弹窗输入信息示例</title>
  <style>
    #message {
        margin-top: 20px;
        font-weight: bold;
        color: blue;
    }
  </style>
</head>
<body>
<h1>点击按钮输入信息</h1>
<button onclick="showPrompt()">点击我</button>
<p id="message"></p>

<script>
  function showPrompt() {
      var input = prompt("请输入一些信息:");
      if (input !== null) {
          document.getElementById('message').innerText = "你输入的是: " + input;
      }
  }
</script>
</body>
</html>

自动化操作

    private static void page04() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("D:\\code\\java\\seleniumstudy\\src\\page\\page04.html");
        webDriver.findElement(By.cssSelector("body > button")).click();
        sleep(3000);
        // alert 弹窗取消
        webDriver.switchTo().alert().dismiss();
        sleep(3000);
        //点击按钮
        webDriver.findElement(By.cssSelector("body > button")).click();
        //在 alert 弹窗中输入 信息
        webDriver.switchTo().alert().sendKeys("测试");
        //alert 弹窗确认
        sleep(3000);
        webDriver.switchTo().alert().accept();
    }

模拟文件上传操作

前端页面
在这里插入图片描述
点击按钮后可选择文件上传

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>文件上传示例</title>
</head>
<body>
<h1>点击按钮上传文件</h1>
<input type="file" id="fileInput" onchange="displayFileName()">
<p id="fileName"></p>

<script>
  function displayFileName() {
      var fileInput = document.getElementById('fileInput');
      var fileName = document.getElementById('fileName');
      fileName.innerText = "你选择了文件: " + fileInput.files[0].name;
  }
</script>
</body>
</html>
    private static void page05() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("D:\\code\\java\\seleniumstudy\\src\\page\\page05.html");
        webDriver.findElement(By.cssSelector("#fileInput")).sendKeys("C:\\qg1.ini");
    }

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

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

相关文章

【Hexo】hexo-butterfly主题添加装备展示页面

本文首发于 ❄️慕雪的寒舍 在翻开往的时候看到了一位老哥的博客里面正好有这个教程&#xff0c;整了一下发现效果还不错&#xff01; Hexo的Butterfly魔改教程&#xff1a;我的装备&#xff0c;分享你在用的设备 | 张洪HeoHexo博客添加自定义css和js文件 | Leonus 注&#x…

Python个人收入影响因素模型构建:回归、决策树、梯度提升、岭回归|数据分享...

全文链接&#xff1a;https://tecdat.cn/?p37423 分析师&#xff1a;Greata Xie “你的命运早在出生那一刻起便被决定了。”这样无力的话语&#xff0c;无数次在年轻人的脑海中回响&#xff0c;尤其是在那些因地域差异而面临教育资源匮乏的年轻人中更为普遍。在中国&#xff0…

NRC-SIM:基于Node-RED的多级多核缓存模拟器

整理自&#xff1a; 《NRC-SIM: A NODE-RED Based Multi-Level, Many-Core Cache Simulator》&#xff0c;由 Ezequiel Trevio 撰写&#xff0c;作为他在德克萨斯大学里奥格兰德河谷分校攻读电气工程硕士学位的部分成果。以下是论文的详细主要内容&#xff1a; 摘要(Abstract…

全网最适合入门的面向对象编程教程:37 Python常用复合数据类型-列表和列表推导式

全网最适合入门的面向对象编程教程&#xff1a;37 Python 常用复合数据类型-列表和列表推导式 摘要&#xff1a; 在 Python 中&#xff0c;列表是一个非常灵活且常用的复合数据类型。它允许存储多个项&#xff0c;这些项可以是任意的数据类型&#xff0c;包括其他列表。列表推…

大话MoE混合专家模型

MoE&#xff08;Mixture of Experts&#xff09;&#xff0c;专家混合&#xff0c;就像是人工智能界的超级团队。想象一下&#xff0c;每个专家都有自己的拿手好戏&#xff0c;比如医疗问题找医生&#xff0c;汽车故障找机械师&#xff0c;做饭找大厨。MoE也是这样&#xff0c;…

【前端面试】操作系统

进程与线程 进程线程定义是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源分配和调度的基本单位是进程中的一个实体&#xff0c;是CPU调度和分派的基本单位&#xff0c;共享进程的资源资源分配拥有独立的内存空间和系统资源共享进程的内存和资源开销…

【Harmony OS 4.0】像素单位 - px、vp、fp

1. px 物理像素&#xff0c;以像素个数来定义图像尺寸。弊端是&#xff0c;在不同像素密度的屏幕上&#xff0c;相同的像素个数对应的物理尺寸是不同的。就会导致我们的应用在不同设备上显示的尺寸可能不同。如下图&#xff1a; 2. vp(Virtual Pixel) 虚拟像素是一种可根据屏幕…

L-Eval:一个60k左右长文评测数据集

前言 L-Eval是复旦大学邱锡鹏老师团队在 2023 年 7 月左右发布的一个标准化的长文本语言模型&#xff08;LCLMs&#xff09;评估数据集&#xff0c;包含20个子任务、411篇长文档、平均长度为7217个单词&#xff0c;超过2000个人工标记的QA对。它分为封闭型任务和开放型任务&am…

Niushop商城第三方插件cps联盟_同城配送_上门预约上手教程配置方法适合单商户和多商户以及V6哈

Niushop商城第三方插件cps联盟_同城配送_上门预约上手教程配置方法 序言&#xff1a;Niushop里面插件比较多可以说有上百种&#xff0c; 不过大多数都是官方自研默认自带50余种剩余的是收费的价格在80-299不等&#xff0c;另外的插件就是和第三方合作&#xff0c;简单的说就是…

25届应届网安面试,默认页面信息泄露

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

linux系统使用yum安装mysql5.6版本的流程

1.下载安装包及依赖包 MySQL :: Download MySQL Community Server (Archived Versions) [rootlocalhost localrepo]# ls MySQL-client-5.6.47-1.el7.x86_64.rpm MySQL-server-5.6.47-1.el7.x86_64.rpm MySQL-test-5.6.47-1.el7.x86_64.rpm MySQL-devel-5.6.47-1.…

如何关闭谷歌浏览器后台运行

当谷歌浏览器不再需要时仍处于后台运行的状态&#xff0c;这不仅消耗宝贵的系统资源&#xff0c;还会影响到多任务的处理效率。本文将为大家详细介绍关闭谷歌浏览器后台还在运行的原因&#xff0c;并提供详细步骤帮助大家禁用后台运行。&#xff08;本文由https://www.liulanqi…

【FESCO福利专区-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

无线液位变送器的特点优势

无线液位变送器集成了多种先进功能&#xff0c;广泛应用于消防水车、水厂、污水处理厂、城市供水、高楼水池、水井、水塔、地热井、矿井等领域的液位监测&#xff0c;具有以下几个显著特点&#xff1a; 4G远程通信能力&#xff1a;无线液位变送器通过内置的4G模块&#xff0c;能…

详细分析Ubuntu中的ufw基本知识

目录 前言1. 基本知识2. 基本使用 前言 由于命令行比较简单&#xff0c;此处主要以表格的形式呈现&#xff0c;还有实战中遇到的一个注意点 1. 基本知识 Ubuntu 中一种用户友好的防火墙配置工具&#xff0c;简化 iptables 的使用&#xff0c;适合那些不熟悉复杂防火墙配置的…

JAVA基础面试题总结(十四)——JVM(下)

类文件结构详解 什么是字节码&#xff1f; 在 Java 中&#xff0c;JVM 可以理解的代码就叫做字节码&#xff08;即扩展名为 .class 的文件&#xff09;&#xff0c;它不面向任何特定的处理器&#xff0c;只面向虚拟机。Java 语言通过字节码的方式&#xff0c;在一定程度上解决…

第二十八节、场景互动的逻辑实现

一、实现接口 mono后面加上接口类&#xff0c;然后实现方法 onenable在场景或物体关闭再打开的激活状态使用 二、绑定按键 三、场景转换 卸载当前场景&#xff1b;加载另一个场景&#xff1b;提供玩家的所处位置 将玩家位置粘贴过来

【Hexo】使用cloudflare pages自动化部署hexo

本文首发于 ❄️慕雪的寒舍 本文将教您使用cloudflare pages来白嫖部署hexo博客。 1.注册cloudflare 这部分就省略了&#xff0c;用邮箱注册就可以了 cloudflare pages的免费版本功能如下&#xff1a; 并发构建数&#xff1a;1&#xff08;如果有多个pages&#xff0c;同一…

搭建Windows环境下的Redis服务与TinyRDM客户端

Redis是一个开源的高性能键值对数据库&#xff0c;以其内存中数据存储和快速的读写能力而广受开发者欢迎。在Windows环境下搭建Redis服务并使用TinyRDM客户端&#xff0c;可以为开发和日常使用提供极大的便利。 安装Redis服务 1. 下载Redis安装包 首先&#xff0c;下载Redis…

conda install 报错:LibMambaUnsatisfiableError

出现这个错误 LibMambaUnsatisfiableError 通常是因为 Conda 无法在当前配置的通道中找到满足所有依赖项的软件包。 运行下面两个命令解决&#xff1a; conda config --add channels conda-forge conda install -c stanfordnlp stanza1.4.0 有些包可能不在默认的 Conda 通道中…