测试|Selenium之WebDriver常见API使用

news2024/11/17 6:42:53

测试|Selenium之WebDriver常见API使用

文章目录

  • 测试|Selenium之WebDriver常见API使用
    • 1.定位对象(findElement)
      • css定位
      • xpath定位
      • css选择器语法:
      • xpath语法:
      • 校验结果
    • 2.操作对象
      • 鼠标点击对象
      • 在对象上模拟按键输入
      • clear清除对象输入的文本内容
      • submit提交
      • text获取元素的文本信息
      • getAttribute获取元素属性值
    • 3.添加等待
    • 4.打印信息
    • 5.浏览器的操作
      • 浏览器前进,刷新与后退
      • 浏览器滚动条
      • 浏览器页面最大化最小化、全屏,设置大小
      • 关闭浏览器
    • 6.键盘鼠标事件
      • **键盘事件:使用sendKeys方法**
      • 鼠标事件
    • 常见功能实现案例
      • 一组元素的定位(findElements)
      • 多层框架中元素的定位(switchTo().frame)
      • 切换窗口
      • 截图
      • 层级定位
      • 下拉框处理(两级处理)
      • 弹窗处理(alert)
      • 上传文件的处理(sendKeys(路径))
    • 总结

1.定位对象(findElement)

对象的定位是UI自动化测试的核心,webdriver提供了一系列的对象定位方法,这里只说css定位和xpath定位。

打开浏览器,进入百度首页,进入百度搜索输入框,输入

css定位

以类选择器为例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v61O4oFp-1690808760925)(F:\typora插图\image-20230731140841726.png)]

public class Main {
    public static void main(String[] args) {
        ChromeOptions options=new ChromeOptions();
        //允许所有请求
        options.addArguments("-remote-allow-origns=*");
        WebDriver webDriver = new ChromeDriver(options);
        //进入百度首页
        webDriver.get("https://www.baidu.com");

        //找到百度搜索输入框
		WebElement element=webDriver.findElement(By.cssSelector(".s_ipt"));//通过css选择器
        //输入软件测试
        element.sendKeys("软件测试");

    }
}

xpath定位

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W8pyUrlz-1690808760926)(F:\typora插图\image-20230731141138565.png)]

public class Main {
    public static void main(String[] args) {
        ChromeOptions options=new ChromeOptions();
        //允许所有请求
        options.addArguments("-remote-allow-origns=*");
        WebDriver webDriver = new ChromeDriver(options);
        //进入百度首页
        webDriver.get("https://www.baidu.com");

        //找到百度搜索输入框
//        WebElement element=webDriver.findElement(By.cssSelector(".s_ipt"));//通过css选择器
        WebElement element=webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));//通过xpath
        //输入软件测试
        element.sendKeys("软件测试");

    }
}

css选择器语法:

id选择器:“#id”

类选择器:“.classname”

标签选择器:直接标签名 “input”

后代选择器:“父级选择器 自己选择器”

xpath语法:

绝对路径:/html/head/title(不常用)

相对路径(双斜杠开头):

  • 相对路径+索引:索引默认以1开头. eg.//form/span[2]/input(百度一下)
  • 相对路径+属性值:eg.//input[@class="s_ipt"],//input[@id="su"]
  • 相对路径+通配符:eg,//*[@*="su"]
  • 相对路径+文本匹配:eg,//a[text()="新闻"]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cSMnndAF-1690808760927)(F:\typora插图\image-20230731142633112.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HLYsPWDn-1690808760927)(F:\typora插图\image-20230731142800411.png)]

相较于xpath选择器,css选择器定位元素效率更高

校验结果

    public static void test01() throws InterruptedException {
        ChromeOptions options=new ChromeOptions();
        //允许所有请求
        options.addArguments("-remote-allow-origns=*");
        WebDriver webDriver = new ChromeDriver(options);
        //进入百度首页
        webDriver.get("https://www.baidu.com/");
        //找到百度搜索输入框
        WebElement element=webDriver.findElement(By.cssSelector(".s_ipt"));//通过css选择器
//        WebElement element=webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));//通过xpath
        //输入软件测试
        element.sendKeys("软件测试");
        //找到百度一下按钮
        //点击
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);//强制等待3ms
        //校验
        boolean flag=true;
        //1.找到搜索结果
        List<WebElement> elements=webDriver.findElements(By.cssSelector("a em"));
        sleep(10000);
        for (int i = 0; i < elements.size(); i++) {
            System.out.println(elements.get(i).getText());
            //2.条件
            if(!elements.get(i).getText().contains("测试")){
                flag=false;
                System.out.println("测试不通过");
                break;
            }
        }
        if(flag){
            System.out.println("测试通过");
        }

    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XKdHGhzA-1690808760928)(F:\typora插图\image-20230731203215211.png)]

2.操作对象

鼠标点击对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IQWaj859-1690808760929)(F:\typora插图\image-20230731150321017.png)]

在对象上模拟按键输入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E4wBRsew-1690808760929)(F:\typora插图\image-20230731150336385.png)]

clear清除对象输入的文本内容

public static void test02() throws InterruptedException {
    ChromeOptions options=new ChromeOptions();
    options.addArguments("-remote-allow-origns=*");
    WebDriver webDriver = new ChromeDriver(options);
    //进入百度首页
    webDriver.get("https://www.baidu.com");
    //找到搜索框
    WebElement element=webDriver.findElement(By.cssSelector(".s_ipt"));
    //输入软件测试
    element.sendKeys("软件测试");
    sleep(3000);
    //点击搜索按钮
    webDriver.findElement(By.cssSelector("#su")).click();
    //删除内容
    element.clear();
    //在输入Vue框架
    element.sendKeys("Vue框架");
    sleep(3000);
    //再次点击
    webDriver.findElement(By.cssSelector("#su")).click();

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cFWfGAvj-1690808760930)(F:\typora插图\image-20230731151451051.png)]

submit提交

如果点击的元素放在form标签中,此时使用submit实现的效果和click是一样的,如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-whXmKlHk-1690808760930)(F:\typora插图\image-20230731151607972.png)]

如果点击的元素放在非form标签中,会报错,如下所示:

private static void test03() throws InterruptedException {
    ChromeOptions options = new ChromeOptions();
    options.addArguments("-remote-allow-origns=*");
    WebDriver webDriver = new ChromeDriver(options);
    //进入百度首页
    webDriver.get("https://www.baidu.com");
    //找到搜索框
    webDriver.findElement(By.xpath("//*[@id=\"s-top-left\"]/a[1]")).submit();//输入软件测试
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eSdU7hMh-1690808760931)(F:\typora插图\image-20230731153701092.png)]

所以推荐使用click()

text获取元素的文本信息

getText[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bSlZ9I3j-1690808760931)(F:\typora插图\image-20230731160404555.png)]

getAttribute获取元素属性值

getText获取不了

    private static void test04() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("-remote-allow-origns=*");
        WebDriver webDriver = new ChromeDriver(options);
        //进入百度首页
        webDriver.get("https://www.baidu.com");
        //获取元素属性值
//        String button_value=webDriver.findElement(By.cssSelector("#su")).getText();
//        System.out.println(button_value);	

        String button_value=webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
        if(button_value.equals("百度一下")){
            System.out.println("测试通过");
        }else{
            System.out.println("测试不通过");
        }
    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j0BtupZf-1690808760932)(F:\typora插图\image-20230731160117303.png)]

3.添加等待

1.sleep强制等待:sleep(xxx);单位为ms,1000ms=1s

2.智能等待:隐式等待(使用WebDriver对象的manage方法返回值的timeouts方法的返回值的implicitlywait方法),显示等待(使用WebDriverWait对象的until方法)

隐式等待等待所有的元素被定位到

显示等待等待一定的条件被定位到(程序员自己设定)

隐式等待:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2SH1RQBD-1690808760932)(F:\typora插图\image-20230731171845814.png)]

显示等待:

    private static void test07() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
//判断能否点击
        // 显式等待设置:最长等待时间为10秒,并等待元素可见
        WebDriverWait wait = new WebDriverWait(webDriver, 10);
//        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#su"))).click();//能定位到
        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#s"))).click();//定位不到,就会有问题

    }

eg:driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

隐式地等待并非一个固定的等待时间当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长

4.打印信息

打印title和url

private static void test06() {
    // 创建Chrome浏览器的WebDriver实例
    WebDriver webDriver = new ChromeDriver();

    // 导航到目标网页
    webDriver.get("https://www.baidu.com/");

    String url=webDriver.getCurrentUrl();
    String title=webDriver.getTitle();
    if(url.equals("https://www.baidu.com/")&&title.equals("百度一下,你就知道")){//这里可能因为一个/就出错!!!
        System.out.println("测试通过");
    }else {
        System.out.println(url);
        System.out.println(title);
        System.out.println("测试不通过");
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7TIm4yKV-1690808760933)(F:\typora插图\image-20230731165548572.png)]

5.浏览器的操作

浏览器前进,刷新与后退

使用的navigate

webDriver.navigate().back();
webDriver.navigate().refresh();
webDriver.navigate().forward();
private static void test08() throws InterruptedException {
    //打开百度首页,强制等待3秒
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("https://www.baidu.com/");
    sleep(3000);

    //搜索儿童节,强制等待3秒
    webDriver.findElement(By.cssSelector("#kw")).sendKeys("儿童节");//输入框的id名
    webDriver.findElement(By.cssSelector("#su")).click();
    sleep(3000);
    //浏览器后退
    webDriver.navigate().back();
    sleep(3000);
    //强制等待3秒,前进
    webDriver.navigate().refresh();
    webDriver.navigate().forward();
    sleep(3000);
}

浏览器滚动条

如果自动化不符合预期,大部分时候都是页面渲染的问题

((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GLq04iy7-1690808760933)(F:\typora插图\image-20230731173929172.png)]

浏览器页面最大化最小化、全屏,设置大小

使用的manage的windows

webDriver.manage().window().maximize();
sleep(3000);
webDriver.manage().window().fullscreen();
sleep(3000);
webDriver.manage().window().setSize(new Dimension(600,1000));

关闭浏览器

有两种方式:webDriver.quit();``webDriver.close();

    private static void test11() 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(4000);
//        webDriver.quit();
        webDriver.close();
    }

两者的区别:☆☆☆

  1. quit是关闭了整个浏览器,close是关闭了上一级页面
  2. quit会清空缓存(cookie),close不会清空缓存

6.键盘鼠标事件

键盘事件:使用sendKeys方法

功能键的选择:

通过send_keys()调用按键:
sendkeys(Keys.TAB) # TAB
sendkeys(Keys.ENTER) # 回车
sendkeys(Keys.SPACE) #空格键
sendkeys(Keys.ESCAPE) #回退键(Esc)

组合键:sendKeys(Keys.xxx,“xx”)…

private static void test09() throws InterruptedException {
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("https://www.baidu.com/");
    webDriver.findElement(By.cssSelector("#kw")).sendKeys("儿童节");//输入框的id名
    //ctrl+a
    webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");//输入框的id名
    sleep(3000);
    //ctr+x
    webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X");//输入框的id名
    sleep(3000);

    //ctrl+v
    webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");//输入框的id名
    sleep(3000);

}

信息的输入:“xxx”(直接加内容)

鼠标事件

  • contextClick() 右击
  • doubleClick() 双击
  • dragAndDrop() 拖动
  • moveToElement() 移动

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LOz4oOAa-1690808760934)(F:\typora插图\image-20230731181247322.png)]

private static void test10() 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.xpath("//*[@id=\"kw\"]"));
    Actions actions=new Actions(webDriver);
    sleep(10000);
    actions.moveToElement(webElement).contextClick().perform();
}

常见功能实现案例

一组元素的定位(findElements)

(场景类似调查问卷的多选问题)执行代码,满足条件的所有选项就都选择了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jTdQPS6T-1690808760935)(F:\typora插图\image-20230731184900090.png)]

多层框架中元素的定位(switchTo().frame)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xx7EM8c9-1690808760935)(F:\typora插图\image-20230731185828203.png)]

有可能嵌套的不是框架,而是窗口,还有针对窗口的方法:switchTo().window
用法与switchTo.frame 相同.

切换窗口

private static void test12() 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打开的页面窗口句柄
    System.out.println(webDriver.getWindowHandle());
    Set<String> handles = webDriver.getWindowHandles();
    String target_handle = "";
    for(String handle:handles) {
        target_handle = handle;
    }
    webDriver.switchTo().window(target_handle);
    sleep(3000);
    webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");
    webDriver.findElement(By.cssSelector("#s_btn_wr")).click();

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-guhGFdwu-1690808760935)(F:\typora插图\image-20230731195900770.png)]

截图

使用((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);这个方法,并使用FileUtils工具类的copyFile方法复制到硬盘上。

private static void test13() 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("F://typora插图//20230731jietu.png"));
}

这里需要引入相关依赖common-io:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

层级定位

有时候我们需要定位的元素没有直接在页面展示,而是需要对页面的元素经过一系列操作之后才展示出来,这个时候我们就需要一层层去定位.

没有直接在页面中展示:可能需要一些操作才能定位到

定位思路与多层框架/窗口定位思路一致。

下拉框处理(两级处理)

(场景:类似选择收货地址的省市县…)

下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框,定位到下拉框进行操作后,再定位到下拉框里的选项。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iJSXIyPV-1690808760937)(F:\typora插图\image-20230731190814317.png)]

这里除了可以通过value值进行定位,还可以通过index下标(默认从0开始),定位等等

弹窗处理(alert)

页面中有一个按钮,点击按钮会有弹窗,弹窗中有对话框,对于输入信息的处理:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HtZTomTP-1690808760937)(F:\typora插图\image-20230731192054709.png)]

上传文件的处理(sendKeys(路径))

上传文件一般要打开一个本地串口,从窗口选择本地文件添加。

在selenium webdriver中,只需要定位上传按钮,通过sendKeys添加本地文件路径即可,绝对路径和相对路径均可,关键是上传的文件存在。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LAi7R834-1690808760937)(F:\typora插图\image-20230731192517454.png)]

总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D8JEDIG1-1690808760938)(F:\typora插图\image-20230731210509252.png)]

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

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

相关文章

TCP三次握手和四次挥手以及11种状态(一)

1、三次握手 置位概念&#xff1a;根据TCP的包头字段&#xff0c;存在3个重要的标识ACK、SYN、FIN ACK&#xff1a;表示验证字段 SYN&#xff1a;位数置1&#xff0c;表示建立TCP连接 FIN&#xff1a;位数置1&#xff0c;表示断开TCP连接 三次握手过程说明&#xff1a; 1、…

【自动化剧本】Role角色

目录 一、Roles模块1.1roles的目录结构1.2roles 内各目录含义解释1.3在一个 playbook 中使用 roles 的步骤 二、使用Role编写LNMP剧本2.1 搭建Nginx角色2.2搭建Mysql角色2.3搭建php角色2.4lnmp剧本 一、Roles模块 roles用于层次性、结构化地组织playbook。roles能够根据层次型结…

实战!聊聊工作中使用了哪些设计模式

实战&#xff01;聊聊工作中使用了哪些设计模式 策略模式 业务场景 假设有这样的业务场景&#xff0c;大数据系统把文件推送过来&#xff0c;根据不同类型采取不同的解析方式。多数的小伙伴就会写出以下的代码&#xff1a; if(type"A"){//按照A格式解析}else if(t…

力扣468 验证IP地址

ipv4地址&#xff1a;1.必须是四个非空子串 2.每个非空子串不含前导零 3.子串里字符只能是0~255 ipv6地址&#xff1a;1.必须是八个非空子串 2。每段非空串得长度是否在1~4之间&#xff0c;且不含0-9&#xff0c;a-f&#xff0c;A-F之外得字符。 3.同时0-9也不允许含前导零 cl…

HTML5+CSS3小实例:带标题的3D多米诺人物卡片

实例:带标题的3D多米诺人物卡片 技术栈:HTML+CSS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content…

vue关闭ESlint

在 vue.config.js里边写上这一句代码 lintOnsave:false

Maven如何创建Java web项目(纯干货版)!!!

1.创建Maven项目。 2.创建完成后会来到这个界面。 3.在src/main目录下&#xff0c;建立webapp / WEB-INF/web.xml文件&#xff0c;并在web.xml文件中写入以下内容&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http…

AI技术快讯:清华开源ChatGLM2双语对话语言模型

ChatGLM2-6B是一个开源项目&#xff0c;提供了ChatGLM2-6B模型的代码和资源。根据提供的搜索结果&#xff0c;以下是对该项目的介绍&#xff1a; 论文&#xff1a;https://arxiv.org/pdf/2103.10360.pdf ChatGLM2-6B是一个开源的双语对话语言模型&#xff0c;是ChatGLM-6B模…

批量生成ChunJun json任务脚本

最近在研究chunjun&#xff0c;它是一款稳定、易用、高效、批流一体的数据集成框架。一直在用chunjun做数据抽取测试&#xff0c;json任务重复地在写&#xff0c;感觉十分浪费时间&#xff0c;于是想写个自动生成json脚本。 1.设计模板 模板通过excel设计&#xff0c;主要记录…

【phaser微信抖音小游戏开发004】往画布上增加文本以及文本的操作

我们在states中创建st004.js的类&#xff0c;或者将states中的index.js直接重命名为st004.js&#xff0c;把里面的类名也修改为st004.如下图 在main.js中&#xff0c;引入st004,并设置启用的state为st004。如下图 接下来到states/st004里面&#xff0c;在create里面将文本修改一…

为什么不推荐用 index 做 key

之所以添加key属性&#xff0c;究其根本是因 diff算法。而在业务开发过程中特别是使用map, forEach 等遍历函数的时候往往随手就将index做为组件的key. 那么:key 到底有什么用&#xff1f; 当 Vue.js 用 v-for 正在更新已渲染过的元素列表时&#xff0c;它默认用就地复用策略 …

IP 工具

什么是IP 工具 IP 工具是用于轻松扫描和排除网络 IP 地址空间故障的网络工程工具。IP 工具使网络管理员能够审核、跟踪和监视 IP 地址、子网以及使用 IP 的设备和主机的性能。这个全面的网络工程工具集包括高级 IP 工具&#xff0c;如 Ping、系统资源管理器、MAC 地址解析器和…

看表情包学C语言 ——局部优先原则

&#x1f517; 【C语言趣味教程】专栏介绍&#x1f448; 猛戳了解&#xff01;&#xff01;&#xff01; Ⅰ. 作用域&#xff08;Scope&#xff09; 0x00 引入&#xff1a;什么是作用域&#xff1f; 变量和常量在程序中都是有作用范围的&#xff0c;这个范围我们称之为变量的 …

40k的offer拿到手!爽歪歪~

据说周一和就业喜报更配&#xff1f;快跟着我一起来看看2023上半年黑马软件测试学科的就业喜报&#xff1a; 从黑马软件测试学科的就业中&#xff0c;我们也能看到软件测试对于企业的重要性&#xff0c;一点也不比程序员差&#xff0c;他们拿到的薪资也能和程序员的高薪媲美&am…

Netty 执行了多次channelReadComplete()却没有执行ChannelRead()

[TOC](Netty 执行了多次channelReadComplete()) Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. happy for hardess to solve denpendies.…

JAVA的回调机制、同步/异步调用

一、同步调用 同步调用是最基本的调用方式。类A的a()方法调用类B的b()方法&#xff0c;类A的方法需要等到B类的方法执行完成才会继续执行。如果B的方法长时间阻塞&#xff0c;就会导致A类方法无法正常执行下去。 二、异步调用 如果A调用B&#xff0c;B的执行时间比较长&#…

【Git系列】Git概述

&#x1f433;Git概述 &#x1f9ca;1. Git发展历史&#x1f9ca; 2. Git与SVN的区别&#x1f9ca;3. Git本地结构&#x1f9ca;4. 代码托管中心&#x1fa9f;4.1 代码托管中心是什么&#xff1f;&#x1fa9f;4.2 托管中心种类 &#x1f9ca;1. Git发展历史 Git的发展历史可以…

容灾独家技术揭秘:HyperBDR无主机数据同步技术

01、一对一单机热备-传统灾备方式 单机热备是一种备份解决方案&#xff0c;它使用两台服务器来确保高可用性&#xff0c;是市场上最为常见的灾备模式。 在单机热备中&#xff0c;一台主服务器和一台备用服务器保持同步&#xff0c;以确保在主服务器出现故障或宕机时可以立即切换…

【Unity】超简单特效 - 烟雾

前言&#xff1a; 各式各样的制造工坊常常会出现在任意类型的游戏中&#xff0c;铁匠铺、车间、工业建筑等等&#xff0c;那么如何快速且简单的实现一款可复用的烟雾特效呢&#xff0c;先在脑海中想象一下我们生活里常见的烟雾吧。 初步实现&#xff1a; 在经过简单的想象以后…

TensorFlow项目练手(三)——基于GRU股票走势预测任务

项目介绍 项目基于GRU算法通过20天的股票序列来预测第21天的数据&#xff0c;有些项目也可以用LSTM算法&#xff0c;两者主要差别如下&#xff1a; LSTM算法&#xff1a;目前使用最多的时间序列算法&#xff0c;是一种特殊的RNN&#xff08;循环神经网络&#xff09;&#xf…