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

WebDriver API (2)

本文将继续上文对WebDriver API的功能使用进行介绍。

一、浏览器操作

1. 浏览器前进forward与后退back

浏览器前进操作是指导航到前一个页面,在浏览器的历史记录中向前移动一页。

浏览器后退操作是指导航到前一个页面,在浏览器的历史记录中向后移动一页。

示例代码:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;public class BrowserNavigation {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 初始化WebDriverWebDriver driver = new ChromeDriver();// 打开第一个网页driver.get("https://www.example.com");// 打开第二个网页driver.get("https://www.google.com");// 执行后退操作,返回到第一个网页driver.navigate().back();// 执行前进操作,返回到第二个网页driver.navigate().forward();// 关闭浏览器driver.quit();}
}

2. 操作滚动条

操作滚动条通常使用JavaScript执行,因为Selenium WebDriver没有直接的方法来操作滚动条。以下是滚动到页面底部、滚动到特定元素和滚动到页面顶部的示例。

示例代码:

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.By;public class ScrollExample {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 初始化WebDriverWebDriver driver = new ChromeDriver();// 打开一个网页driver.get("https://www.example.com");// 创建一个JavaScript执行器JavascriptExecutor js = (JavascriptExecutor) driver;// 滚动到页面底部js.executeScript("window.scrollTo(0, document.body.scrollHeight);");// 滚动到特定元素WebElement element = driver.findElement(By.id("someElementId"));js.executeScript("arguments[0].scrollIntoView(true);", element);// 滚动到页面顶部js.executeScript("window.scrollTo(0, 0);");// 关闭浏览器driver.quit();}
}

解释

  • 滚动条

    • window.scrollTo(0, document.body.scrollHeight);:滚动到页面底部。
    • arguments[0].scrollIntoView(true);:滚动到指定元素的位置。
    • window.scrollTo(0, 0);:滚动到页面顶部。

二、sendKey模拟按键操作

在Selenium WebDriver中,sendKeys 方法不仅可以用于输入文本,还可以用于模拟按键操作。Selenium 提供了一个 Keys 枚举类,其中包含了许多常见的键,如箭头键、功能键、回车键等。

常见按键及其对应的 Keys 枚举值

按键Keys 枚举值
回车键Keys.ENTER
空格键Keys.SPACE
退格键Keys.BACK_SPACE
删除键Keys.DELETE
选项键Keys.ALT
控制键Keys.CONTROL
转移键Keys.SHIFT
箭头上键Keys.ARROW_UP
箭头下键Keys.ARROW_DOWN
箭头左键Keys.ARROW_LEFT
箭头右键Keys.ARROW_RIGHT
Tab 键Keys.TAB
ESC 键Keys.ESCAPE
F1-F12 键Keys.F1Keys.F12

示例代码

以下是一些使用 sendKeys 方法来调用按键的示例:

1. 输入文本并按回车键

WebElement searchBox = driver.findElement(By.name("q")); 
searchBox.sendKeys("Selenium WebDriver"); searchBox.sendKeys(Keys.ENTER);
  • 作用:向名为 "q" 的输入框输入 "Selenium WebDriver" 后,模拟按下回车键。

2. 使用 Tab 键导航到下一个元素

WebElement input1 = driver.findElement(By.name("input1")); 
WebElement input2 = driver.findElement(By.name("input2"));
input1.sendKeys("First input"); 
input1.sendKeys(Keys.TAB); // 模拟按下Tab键,焦点将移动到下一个输入框 
input2.sendKeys("Second input");
  • 作用:在第一个输入框输入 "First input" 后,按下 Tab 键,将焦点移动到下一个输入框,然后输入 "Second input"。

3. 组合按键操作(例如复制和粘贴)

WebElement inputField = driver.findElement(By.name("input")); 
inputField.sendKeys("Text to be copied"); 
inputField.sendKeys(Keys.CONTROL + "a"); // 全选文本 
inputField.sendKeys(Keys.CONTROL + "c"); // 复制文本 
inputField.sendKeys(Keys.CONTROL + "v"); // 粘贴文本
  • 作用:在输入框中输入文本 "Text to be copied",然后使用组合键 Ctrl+A 选中所有文本,Ctrl+C 复制文本,最后使用 Ctrl+V 粘贴文本。

4. 使用箭头键进行导航

WebElement dropDown = driver.findElement(By.id("dropdown")); 
dropDown.click(); // 打开下拉菜单 
dropDown.sendKeys(Keys.ARROW_DOWN); // 模拟按下箭头下键 
dropDown.sendKeys(Keys.ARROW_DOWN); // 再次按下箭头下键 
dropDown.sendKeys(Keys.ENTER); // 选择当前选项
  • 作用:点击下拉菜单,使用箭头下键两次选择第三个选项,并按下回车键确认选择。

在Selenium WebDriver中,可以使用 sendKeys 方法和 Keys 枚举来模拟键盘组合键操作,如 Ctrl+C、Ctrl+V、Ctrl+A 等。组合键通常用于选择、复制、粘贴等操作。以下是一些常见的键盘组合键及其示例代码。

常见键盘组合键

操作组合键
全选Keys.CONTROL + "a"
复制Keys.CONTROL + "c"
粘贴Keys.CONTROL + "v"
剪切Keys.CONTROL + "x"
撤销Keys.CONTROL + "z"
重做Keys.CONTROL + "y"
新建窗口Keys.CONTROL + "n"
打开新标签Keys.CONTROL + "t"
关闭当前标签Keys.CONTROL + "w"
查找Keys.CONTROL + "f"
保存Keys.CONTROL + "s"
打开浏览器开发工具Keys.CONTROL + Keys.SHIFT + "i"

示例代码

1. 组合键 Ctrl+A 全选

WebElement inputField = driver.findElement(By.name("input")); 
inputField.sendKeys("Text to be selected"); 
inputField.sendKeys(Keys.CONTROL + "a"); // 全选文本

2. 组合键 Ctrl+C 复制

WebElement inputField = driver.findElement(By.name("input")); 
inputField.sendKeys("Text to be copied"); 
inputField.sendKeys(Keys.CONTROL + "a"); // 全选文本 
inputField.sendKeys(Keys.CONTROL + "c"); // 复制文本

3. 组合键 Ctrl+V 粘贴

WebElement inputField = driver.findElement(By.name("input")); 
inputField.sendKeys(Keys.CONTROL + "v"); // 粘贴文本

4. 组合键 Ctrl+A, Ctrl+C, Ctrl+V 组合操作

WebElement inputField1 = driver.findElement(By.name("input1")); 
WebElement inputField2 = driver.findElement(By.name("input2")); 
inputField1.sendKeys("Text to be copied"); 
inputField1.sendKeys(Keys.CONTROL + "a"); // 全选文本 
inputField1.sendKeys(Keys.CONTROL + "c"); // 复制文本 
inputField2.sendKeys(Keys.CONTROL + "v"); // 粘贴文本到第二个输入框

5. 组合键 Ctrl+F 查找

driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL + "f");

使用 Actions 类进行更复杂的组合键操作

对于一些更复杂的键盘操作,可以使用 Actions 类来实现。

示例:使用 Actions 类执行 Ctrl+A 和 Ctrl+C

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;public class KeyboardCombinationExample {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 初始化WebDriverWebDriver driver = new ChromeDriver();// 打开一个网页driver.get("https://www.example.com");// 找到输入框并输入文本WebElement inputField = driver.findElement(By.name("input"));inputField.sendKeys("Text to be copied");// 使用Actions类执行组合键Ctrl+A(全选)和Ctrl+C(复制)Actions actions = new Actions(driver);actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).perform();actions.keyDown(Keys.CONTROL).sendKeys("c").keyUp(Keys.CONTROL).perform();// 关闭浏览器driver.quit();}
}

三、通过Action类模拟鼠标动作

在Selenium中,鼠标事件是通过Actions类来实现的。这个类提供了模拟各种鼠标动作的方法,例如点击、双击、右键点击、拖放等。下面是一些常用的鼠标事件及其对应的方法:

  1. 点击(Click)

    • 单击(Click): 使用click()方法。
    • 双击(Double Click): 使用doubleClick()方法。
    • 右键点击(Context Click): 使用contextClick()方法。
  2. 移动(Move)

    • 移动到元素(Move to Element): 使用moveToElement(WebElement target)方法,可以将鼠标移动到指定的元素上。
    • 移动并点击(Move to Element and Click): 结合moveToElement()click()方法,可以移动到元素并进行点击。
  3. 拖放(Drag and Drop)

    • 直接拖放(Drag and Drop): 使用dragAndDrop(WebElement source, WebElement target)方法,将元素从一个位置拖到另一个位置。
    • 拖放到偏移位置0t): 使用dragAndDropBy(WebElement source, int xOffset, int yOffset)方法,将元素拖放到指定的偏移位置。
  4. 点击并保持(Click and Hold)

    • 点击并保持(Click and Hold): 使用clickAndHold()方法,在指定元素上点击并保持鼠标按钮不放。
    • 释放(Release): 使用release()方法,释放鼠标按钮。

下面是一个示例代码,演示如何使用Actions类来执行这些鼠标事件:

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.interactions.Actions;public class MouseActionsExample {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 创建WebDriver实例WebDriver driver = new ChromeDriver();// 打开一个网站driver.get("https://example.com");// 创建Actions实例Actions actions = new Actions(driver);// 定位元素WebElement element = driver.findElement(By.id("elementId"));// 单击元素actions.click(element).perform();// 双击元素actions.doubleClick(element).perform();// 右键点击元素actions.contextClick(element).perform();// 移动到元素并点击actions.moveToElement(element).click().perform();// 拖放元素WebElement source = driver.findElement(By.id("sourceElementId"));WebElement target = driver.findElement(By.id("targetElementId"));actions.dragAndDrop(source, target).perform();// 拖放到偏移位置actions.dragAndDropBy(source, 100, 50).perform();// 点击并保持,然后释放actions.clickAndHold(element).release().perform();// 关闭浏览器driver.quit();}
}

perform()方法是一个触发器,用来执行之前定义的所有动作。

四、打印信息

在Selenium中,可以获取并打印许多关于当前网页的信息,如页面标题(title)、当前URL、页面源码、页面的Cookie等。

示例代码

下面是一个综合示例,演示了如何获取并打印这些信息:

import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;import java.util.Set;public class WebPageInfo {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 创建WebDriver实例WebDriver driver = new ChromeDriver();// 打开一个网站driver.get("https://example.com");// 获取并打印页面标题String title = driver.getTitle();System.out.println("Page Title: " + title);// 获取并打印当前URLString currentUrl = driver.getCurrentUrl();System.out.println("Current URL: " + currentUrl);// 获取并打印页面源码String pageSource = driver.getPageSource();System.out.println("Page Source: " + pageSource);// 获取并打印页面的CookieSet<Cookie> cookies = driver.manage().getCookies();for (Cookie cookie : cookies) {System.out.println("Cookie: " + cookie);}// 获取并打印特定元素的文本WebElement element = driver.findElement(By.id("elementId"));String elementText = element.getText();System.out.println("Element Text: " + elementText);// 关闭浏览器driver.quit();}
}

五、多层框架的定位

1. 框架概念

什么是框架(Frame)?

在一个网页上,框架(Frame)是一个网页中嵌套的子网页。想象一下你有一个大盒子(网页),里面装着几个小盒子(框架)。每个小盒子里又可以装着更多的小盒子或内容。框架帮助网页设计者将网页内容分成多个独立的部分,每个部分可以单独加载和操作。

为什么要使用框架?

  1. 组织内容:框架可以帮助将一个复杂的网页分成多个部分,使得每个部分可以独立加载和操作。例如,导航栏可以放在一个框架中,内容区域可以放在另一个框架中。

  2. 提高效率:由于每个框架可以独立加载,所以页面的一部分更新时,其他部分不需要重新加载,提高了网页的效率。

多层框架(Nested Frames)

多层框架是指在一个框架里再嵌套另一个框架,就像一个盒子里放着另一个盒子。这种情况可能会使得操作网页变得复杂,因为你需要告诉浏览器你想在哪个框架里操作。

举个例子

想象你正在操作一个带有导航栏和内容区域的网页:

  • 外层框架:这是整个网页的框架。
  • 内层框架1:在网页的左边有一个导航栏,这是一个独立的框架。
  • 内层框架2:在网页的右边有一个内容区域,这是另一个独立的框架。

当你想点击导航栏中的一个链接时,你需要先告诉浏览器你要操作的是导航栏框架,然后才能点击链接。同样,如果你想操作内容区域的某个按钮,你需要先切换到内容区域的框架,再进行操作。

在Selenium WebDriver中,处理多层框架和窗口定位、层级定位和下拉框处理是非常常见的任务。下面将详细介绍这些概念及其相关API的使用方法。

2. 多层框架的定位

在Web应用中,页面通常嵌套在多个框架(frame)中。为了在这些框架中进行操作,我们需要切换到相应的框架。

  1. 切换到框架: 使用driver.switchTo().frame()方法可以切换到指定的框架。可以通过框架的名字、ID或者WebElement对象来定位框架。

    // 通过框架的名字或ID切换到框架
    driver.switchTo().frame("frameNameOrId");// 通过WebElement对象切换到框架
    WebElement frameElement = driver.findElement(By.xpath("//iframe[@name='frameName']"));
    driver.switchTo().frame(frameElement);
    
  2. 切换回默认内容: 使用driver.switchTo().defaultContent()方法可以从嵌套的框架中跳回到最外层的默认页面。

driver.switchTo().defaultContent();

3. 多层窗口的定位

当页面中嵌套的不是框架而是窗口时,需要使用不同的方法来切换窗口。

  1. 切换到窗口: 使用driver.switchTo().window()方法可以切换到指定的窗口。可以通过窗口的名字或句柄(handle)来定位窗口。

// 获取当前窗口句柄
String currentWindow = driver.getWindowHandle();// 获取所有打开的窗口句柄
Set<String> allWindows = driver.getWindowHandles();// 遍历所有窗口句柄并切换到新窗口
for (String window : allWindows) {driver.switchTo().window(window);// 如果需要,可以在此处添加条件判断,确保切换到正确的窗口
}// 切换回原窗口
driver.switchTo().window(currentWindow);

4. 层级定位

在某些情况下,需要一层层地定位到具体的元素。例如,某些元素只有在特定操作之后才会显示。

// 定位父元素
WebElement parentElement = driver.findElement(By.id("parentElementId"));// 在父元素下定位子元素
WebElement childElement = parentElement.findElement(By.className("childElementClass"));// 进一步定位孙元素
WebElement grandChildElement = childElement.findElement(By.tagName("tag"));

5. 下拉框处理

下拉框是常见的页面元素,需要进行两次定位:一次定位到下拉框,然后定位到下拉框中的选项。

  1. 定位到下拉框并进行操作: 使用Select类来处理下拉框。

import org.openqa.selenium.support.ui.Select;// 定位下拉框元素
WebElement dropdown = driver.findElement(By.id("dropdownId"));// 创建Select对象
Select select = new Select(dropdown);// 通过可见文本选择选项
select.selectByVisibleText("OptionText");// 通过值选择选项
select.selectByValue("optionValue");// 通过索引选择选项
select.selectByIndex(1);

综合示例

package org.example;import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;import java.util.Set;public class BaiduExample {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 创建WebDriver实例WebDriver driver = new ChromeDriver();// 打开百度首页driver.get("https://www.baidu.com");// 获取并打印页面标题和当前URLString title = driver.getTitle();System.out.println("Page Title: " + title);String currentUrl = driver.getCurrentUrl();System.out.println("Current URL: " + currentUrl);// 定位搜索输入框并输入关键词WebElement searchBox = driver.findElement(By.id("kw"));searchBox.sendKeys("Selenium WebDriver");// 定位搜索按钮并点击WebElement searchButton = driver.findElement(By.id("su"));searchButton.click();// 暂停几秒等待搜索结果加载(实际项目中应使用显式等待)try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}// 获取当前窗口句柄String currentWindow = driver.getWindowHandle();// 获取所有打开的窗口句柄Set<String> allWindows = driver.getWindowHandles();// 如果有新窗口,切换到新窗口for (String window : allWindows) {if (!window.equals(currentWindow)) {driver.switchTo().window(window);break;}}// 打印搜索结果页面的标题String resultTitle = driver.getTitle();System.out.println("Result Page Title: " + resultTitle);// 处理可能存在的下拉框选项(这里假设有下拉框,仅为示例)try {WebElement dropdown = driver.findElement(By.id("dropdownId"));Select select = new Select(dropdown);select.selectByVisibleText("OptionText");} catch (Exception e) {System.out.println("No dropdown found or failed to interact with dropdown.");}// 关闭浏览器driver.quit();}
}

六、弹出框(Alert、Confirm、Prompt)的处理

在自动化测试中,处理浏览器弹出框(如 alert、confirm、prompt)是一个常见需求。Selenium WebDriver 提供了相应的方法来处理这些弹出框。

处理 alert、confirm、prompt 弹出框的方法:

1. 获取弹出框中的文字信息:

  • getText() 方法用于获取弹出框中的文字信息。
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
System.out.println(alertText);

2. 接受弹出框:

  • accept() 方法用于点击弹出框中的确认按钮。
alert.accept();

3. 拒绝弹出框:

  • dismiss() 方法用于点击弹出框中的取消按钮(如果有)
alert.dismiss();

4. 在弹出框中输入值:

  • sendKeys() 方法用于在弹出框的输入框中输入值。这仅适用于 prompt 弹出框。
alert.sendKeys("Some text");
alert.accept();

七、处理 DIV 对话框

有时页面上的元素很多,通过属性无法准确定位元素,这时可以先定位元素所在的 div 块,然后再定位这个元素。这种方法有助于提高定位的准确性。

示例:

WebElement divBlock = driver.findElement(By.id("divID"));
WebElement targetElement = divBlock.findElement(By.className("targetClass"));
targetElement.click();

八、上传文件操作

文件上传操作在 web 应用中也很常见。Selenium WebDriver 处理文件上传并不复杂,关键是通过 sendKeys() 方法将文件路径传递给文件上传输入框。

WebElement uploadButton = driver.findElement(By.id("uploadButton"));
uploadButton.sendKeys("C:\\path\\to\\file.txt");

这里有几点需要注意:

  • 文件路径可以是绝对路径或相对路径。
  • 上传的文件必须存在于指定路径中。
  • sendKeys() 方法用于直接输入文件路径。

示例代码

下面是一个综合示例,展示如何处理 alert 弹出框以及文件上传操作:

import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;public class SeleniumExample {public static void main(String[] args) {// 设置ChromeDriver的路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 创建WebDriver实例WebDriver driver = new ChromeDriver();// 打开示例网页driver.get("https://example.com");// 处理 alert 弹出框WebElement alertButton = driver.findElement(By.id("alertButton"));alertButton.click();Alert alert = driver.switchTo().alert();System.out.println(alert.getText());  // 打印弹出框中的文字信息alert.accept();  // 点击确认按钮// 文件上传操作WebElement uploadButton = driver.findElement(By.id("uploadButton"));uploadButton.sendKeys("C:\\path\\to\\file.txt");  // 上传文件// 关闭浏览器driver.quit();}
}

 附录

1. 设置ChromeDriver的路径

在使用Selenium进行自动化测试时,我们需要一个浏览器驱动程序(比如ChromeDriver)来控制浏览器的操作。浏览器驱动程序是与浏览器进行通信的桥梁。我们需要告诉Selenium在哪里可以找到这个驱动程序,这就是 System.setProperty 的作用。

System.setProperty 方法

System.setProperty 方法用于设置系统属性。它接受两个参数:

  • 第一个参数是系统属性的名称。
  • 第二个参数是系统属性的值。

在这个例子中,我们设置的是 webdriver.chrome.driver 系统属性,它的值是ChromeDriver可执行文件的路径。

具体代码解释
// 设置ChromeDriver的路径 
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");

这行代码的含义是告诉Selenium,ChromeDriver可执行文件位于 /path/to/chromedriver。我们需要将 /path/to/chromedriver 替换为本地计算机上ChromeDriver可执行文件的实际路径。

重要提示

  • 确保下载的ChromeDriver版本与Chrome浏览器的版本匹配。
  • 将ChromeDriver放在一个合适的位置,并确保路径正确。

相关文章:

WebDriver API (2)

本文将继续上文对WebDriver API的功能使用进行介绍。 一、浏览器操作 1. 浏览器前进forward与后退back 浏览器前进操作是指导航到前一个页面&#xff0c;在浏览器的历史记录中向前移动一页。 浏览器后退操作是指导航到前一个页面&#xff0c;在浏览器的历史记录中向后移动一…...

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.…...

TensorFlow代码逻辑 vs PyTorch代码逻辑

文章目录 一、TensorFlow&#xff08;一&#xff09;导入必要的库&#xff08;二&#xff09;加载MNIST数据集&#xff08;三&#xff09;数据预处理&#xff08;四&#xff09;构建神经网络模型&#xff08;五&#xff09;编译模型&#xff08;六&#xff09;训练模型&#xf…...

boost asio异步服务器(4)处理粘包

粘包的产生 当客户端发送多个数据包给服务器时&#xff0c;服务器底层的tcp接收缓冲区收到的数据为粘连在一起的。这种情况的产生通常是服务器端处理数据的速率不如客户端的发送速率的情况。比如&#xff1a;客户端1s内连续发送了两个hello world&#xff01;,服务器过了2s才接…...

【QT】常用控件|widget|QPushButton|RadioButton|核心属性

目录 ​编辑 概念 信号与槽机制 控件的多样性和定制性 核心属性 enabled geometry ​编辑 windowTiltle windowIcon toolTip styleSheet PushButton RadioButton 概念 QT 控件是构成图形用户界面&#xff08;GUI&#xff09;的基础组件&#xff0c;它们是实现与…...

【C++ Primer Plus学习记录】函数参数和按值传递

函数可以有多个参数。在调用函数时&#xff0c;只需使用都逗号将这些参数分开即可&#xff1a; n_chars(R,25); 上述函数调用将两个参数传递给函数n_chars()&#xff0c;我们将稍后定义该函数。 同样&#xff0c;在定义函数时&#xff0c;也在函数头中使用由逗号分隔的参数声…...

MySQL:设计数据库与操作

设计数据库 1. 数据建模1.1 概念模型1.2 逻辑模型1.3 实体模型主键外键外键约束 2. 标准化2.1 第一范式2.2 链接表2.3 第二范式2.4 第三范式 3. 数据库模型修改3.1 模型的正向工程3.2 同步数据库模型3.3 模型的逆向工程3.4 实际应用建议 4. 数据库实体模型4.1 创建和删除数据库…...

OBS 免费的录屏软件

一、下载 obs 【OBS】OBS Studio 的安装、参数设置和录屏、摄像头使用教程-CSDN博客 二、使用 obs & 输出无黑屏 【OBS任意指定区域录屏的方法-哔哩哔哩】 https://b23.tv/aM0hj8A OBS任意指定区域录屏的方法_哔哩哔哩_bilibili 步骤&#xff1a; 1&#xff09;获取区域…...

uniapp微信小程序使用xr加载模型

1.在根目录与pages同级创建如下目录结构和文件&#xff1a; // index.js Component({properties: {modelPath: { // vue页面传过来的模型type: String,value: }},data: {},methods: {} }) { // index.json"component": true,"renderer": "xr-frame&q…...

机器人运动范围检测 c++

地上有一个m行n列的方格&#xff0c;一个机器人从坐标&#xff08;0&#xff0c;0&#xff09;的格子开始移动&#xff0c;它每次可以向上下左右移动一个格子&#xff0c;但不能进入行坐标和列坐标的位数之和大于k的格子&#xff0c;请问机器人能够到达多少个格子 #include &l…...

kettle从入门到精通 第七十四课 ETL之kettle kettle调用https接口教程,忽略SSL校验

场景&#xff1a;kettle调用https接口&#xff0c;跳过校验SSL。&#xff08;有些公司内部系统之间的https的接口是没有SSL校验这一说&#xff0c;无需使用用证书的&#xff09; 解决方案&#xff1a;自定义插件或者自定义jar包通过javascript调用https接口。 1、http post 步…...

C++轻量级 线程间异步消息架构(向曾经工作的ROSA-RB以及共事的DOPRA的老兄弟们致敬)

1 啰嗦一番背景 这么多年&#xff0c;换着槽位做牛做马&#xff0c;没有什么钱途 手艺仍然很潮&#xff0c;唯有对于第一线的码农工作&#xff0c;孜孜不倦&#xff0c;其实没有啥进步&#xff0c;就是在不断地重复&#xff0c;刷熟练度&#xff0c;和同期的老兄弟们&#xf…...

Kotlin中的类

类初始化顺序 constructor 里的参数列表是首先被执行的&#xff0c;紧接着是 init 块和属性初始化器&#xff0c;最后是次构造函数的函数体。 主构造函数参数列表firstProperty 初始化第一个 init 块secondProperty 初始化第二个 init 块次构造函数函数体 class Example const…...

VSCode中常用的快捷键

通用操作快捷键 显示命令面板&#xff1a;Ctrl Shift P or F1&#xff0c;用于快速访问VSCode的各种命令。 快速打开&#xff1a;Ctrl P&#xff0c;可以快速打开文件、跳转到某个行号或搜索项目内容。 新建窗口/实例&#xff1a;Ctrl Shift N&#xff0c;用于打开一个新的…...

代码随想录-Day45

198. 打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…...

Rust Eq 和 PartialEq

Eq 和 PartialEq 在 Rust 中&#xff0c;想要重载操作符&#xff0c;你就需要实现对应的特征。 例如 <、<、> 和 > 需要实现 PartialOrd 特征: use std::fmt::Display;struct Pair<T> {x: T,y: T, }impl<T> Pair<T> {fn new(x: T, y: T) ->…...

思考如何学习一门编程语言?

一、什么是编程语言 编程语言是一种用于编写计算机程序的人工语言。通过编程语言&#xff0c;程序员可以向计算机发出指令&#xff0c;控制计算机执行各种任务和操作。编程语言由一组语法规则和语义规则组成&#xff0c;这些规则定义了如何编写代码以及代码的含义。 编程语言…...

顺序串算法库构建

学习贺利坚老师顺序串算法库 数据结构之自建算法库——顺序串_创建顺序串s1,创建顺序串s2-CSDN博客 本人详细解析博客 串的概念及操作_串的基本操作-CSDN博客 版本更新日志 V1.0: 在贺利坚老师算法库指导下, 结合本人详细解析博客思路基础上,进行测试, 加入异常弹出信息 v1.0补…...

[论文阅读笔记33] Matching Anything by Segmenting Anything (CVPR2024 highlight)

这篇文章借助SAM模型强大的泛化性&#xff0c;在任意域上进行任意的多目标跟踪&#xff0c;而无需任何额外的标注。 其核心思想就是在训练的过程中&#xff0c;利用strong augmentation对一张图片进行变换&#xff0c;然后用SAM分割出其中的对象&#xff0c;因此可以找到一组图…...

阿里Nacos下载、安装(保姆篇)

文章目录 Nacos下载版本选择Nacos安装Windows常见问题解决 更多相关内容可查看 Nacos下载 Nacos官方下载地址&#xff1a;https://github.com/alibaba/nacos/releases 码云拉取&#xff08;如果国外较慢或者拉取超时可以试一下国内地址&#xff09; //国外 git clone https:…...

四、golang基础之defer

文章目录 一、定义二、作用三、结果四、recover错误拦截 一、定义 defer语句被用于预定对一个函数的调用。可以把这类被defer语句调用的函数称为延迟函数。 二、作用 释放占用的资源捕捉处理异常输出日志 三、结果 如果一个函数中有多个defer语句&#xff0c;它们会以LIFO…...

机器人----四元素

四元素 四元素的大小 [-1,1] 欧拉角转四元素...

IBM Spectrum LSF Application Center 提供单一界面来管理应用程序、用户、资源和数据

IBM Spectrum LSF Application Center 提供单一界面来管理应用程序、用户、资源和数据 亮点 ● 简化应用程序管理 ● 提高您的工作效率 ● 降低资源管理的复杂性 ● 深入了解流程 IBM Spectrum LSF Application Center 为集群用户和管理员提供了一个灵活的、以应用为中心的界…...

如何选择品牌推广公司?哪家好?收费标准及评价!

不管是什么品牌&#xff0c;推广对公司的成败起了很关键的作用。然而&#xff0c;面对市面上琳琅满目的品牌推广公司&#xff0c;如何选择一家既熟悉又靠谱的公司&#xff0c;成为许多企业主面临的难题。 作为一家手工酸奶品牌的创始人&#xff0c;目前全国也复制了100多家门店…...

JDeveloper 12C 官网下载教程

首先、我们要登录Oracle官网 Oracle 甲骨文中国 | 云应用和云平台 登录进去如果不是中文可以点击右上角带有国旗的图标就行更改&#xff0c;选择一个你能看懂的文字。 然后&#xff0c;点击“资源”—点击“开发人员下载” 然后&#xff0c;点击“开发工具” 这里有很多工具可…...

中英双语介绍美国的州:印第安纳州(Indiana)

中文版 印第安纳州简介 印第安纳州位于美国中西部地区&#xff0c;是一个以其农业、制造业和体育文化而著称的州。以下是对印第安纳州的详细介绍&#xff0c;包括其地理位置、人口、经济、教育、文化和主要城市。 地理位置 印第安纳州东临俄亥俄州&#xff0c;北接密歇根州…...

Flink实现准确和高效流处理的关键问题

时间相关: Watermark 水位线 水位线是插入到数据流中的一个标记,可以认为是一个特殊的数据。水位线主要的内容是一个时间戳,用来表示当前事件时间的进展。水位线是基于数据的时间戳生成的。水位线的时间戳必须单调递增,以确保任务的事件时间时钟一直向前推进,进展。水位线…...

isidentifier()方法——判断字符串是否为合法的Python标识符或变量名

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 isidentifier()方法用于判断字符串是否是有效的Python标识符&#xff0c;还可以用来判断变量名是否合法。isidentifier()方法的语法格式如…...

天猫商品列表数据接口(Tmall.item_search)

天猫平台商品列表数据接口&#xff08;taobao.item_search&#xff09;是天猫开放平台提供的一个API接口&#xff0c;用于获取天猫平台上的商品列表数据。通过该接口&#xff0c;用户可以获取到商品的名称、价格、销量、评价等信息。下面将具体介绍这个接口的各个方面&#xff…...

React+TS前台项目实战(二十一)-- Search业务组件封装实现全局搜索

文章目录 前言一、Search组件封装1. 效果展示2. 功能分析3. 代码详细注释4. 使用方式 二、搜索结果展示组件封装1. 功能分析2. 代码详细注释 三、引用到文件&#xff0c;自行取用总结 前言 今天&#xff0c;我们来封装一个业务灵巧的组件&#xff0c;它集成了全局搜索和展示搜…...

SEO与AI的结合:如何用ChatGPT生成符合搜索引擎优化的内容

在当今数字时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已成为每个网站和内容创作者都必须掌握的一项技能。SEO的主要目标是通过优化内容&#xff0c;使其在搜索引擎结果页面&#xff08;SERP&#xff09;中排名更高&#xff0c;从而吸引更多的流量。然而&#xf…...

【信息系统项目管理师知识点速记】组织通用管理:知识管理

23.3 知识管理 23.3.1 知识管理基础 知识管理是通过利用各种知识和技术手段,帮助组织和个人生产、分享、应用和创新知识,以形成知识优势并在个人、组织、业务目标、经济绩效和社会效益方面产生价值的过程。它能为组织带来知识增值,创造新的价值,提升决策效能和水平,是提…...

CM-UNet: Hybrid CNN-Mamba UNet for Remote Sensing Image Semantic Segmentation

论文&#xff1a;CM-UNet: Hybrid &#xff1a;CNN-Mamba UNet for Remote Sensing Image Semantic Segmentation 代码&#xff1a;https://github.com/XiaoBuL/CM-UNet Abstrcat: 由于大规模图像尺寸和对象变化&#xff0c;当前基于 CNN 和 Transformer 的遥感图像语义分割方…...

DP:子序列问题

文章目录 什么是子序列子序列的特点举例说明常见问题 关于子序列问题的几个例题1.最长递增子序列2.摆动序列3.最长递增子序列的个数4.最长数对链5.最长定差子序列 总结 什么是子序列 在计算机科学和数学中&#xff0c;子序列&#xff08;Subsequence&#xff09;是指从一个序列…...

Spring Data与多数据源配置

Spring Data与多数据源配置 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨如何在Spring Data中配置和使用多个数据源。 在现代应用程序中&…...

【前端vue3】TypeScrip-类型推论和类型别名

类型推论 TypeScript里&#xff0c;在有些没有明确指出类型的地方&#xff0c;类型推论会帮助提供类型。 例如&#xff1a; 变量xiaoc被推断类型为string 如重新给xiaoc赋值数字会报错 let xiaoc "xiaoc"xiaoc 1111111111111如没有给变量指定类型和赋值&#xf…...

javaEE——Servlet

1.web开发概述 所谓web开发,指的是从网页中向后端程序发送请求,与后端程序进行交互 2.java后端开发环境搭建 web后端(javaEE)程序需要运行在服务器中的&#xff0c;这样前端才可以访问得到 3.服务器是什么&#xff1f; ①服务器就是一款软件&#xff0c;可以向其发送请求&#…...

Kotlin扩展函数(also apply run let)和with函数

also apply run let with的使用例子 private fun testOperator() {/*** also*/val person Person("ZhangSan", 18)person.also {// 通常仅仅打印使用, 也可以通过it修改it.name "ZhangSan1"println("also inner name: " it.name)}println(&qu…...

C语言笔记27 •单链表介绍•

1.链表的概念及结构 链表是⼀种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的。 2. 顺序表带来的问题 (1)中间/头部的插⼊删除&#xff0c;时间复杂度为O(N) (2)增容需要申请新空间&#xff0c;拷⻉数据&#xff…...

C++编程(五)单例模式 友元

文章目录 一、单例模式&#xff08;一&#xff09;概念&#xff08;二&#xff09;实现方式1. 饿汉式2. 懒汉式 二、友元&#xff08;一&#xff09;概念&#xff08;二&#xff09;友元函数1.概念2.语法格式3. 使用示例访问静态成员变量访问非静态成员变量 &#xff08;三&…...

012-GeoGebra基础篇-构造圆的切线

前边文章对于基础内容已经悉数覆盖了&#xff0c;这一篇我就不放具体的细节&#xff0c;若有需要可以复刻一下 目录 一、成品展示二、算式内容三、正确性检查五、文章最后 一、成品展示 二、算式内容 A(0,0) B(3,0) c: Circle(A,B) C(5,4) sSegment(A,C) DMidpoint(s) d: Circ…...

数据结构速成--查找

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 目录 …...

SpringMVC的基本使用

SpringMVC简介 SpringMVC是Spring提供的一套建立在Servlet基础上&#xff0c;基于MVC模式的web解决方案 SpringMVC核心组件 DispatcherServlet&#xff1a;前置控制器&#xff0c;来自客户端的所有请求都经由DispatcherServlet进行处理和分发Handler&#xff1a;处理器&…...

【PYG】Cora数据集分类任务计算损失,cross_entropy为什么不能直接替换成mse_loss

cross_entropy计算误差方式&#xff0c;输入向量z为[1,2,3]&#xff0c;预测y为[1]&#xff0c;选择数为2&#xff0c;计算出一大坨e的式子为3.405&#xff0c;再用-23.405计算得到1.405MSE计算误差方式&#xff0c;输入z为[1,2,3]&#xff0c;预测向量应该是[1,0,0]&#xff0…...

MyBatis-plus这么好用,不允许还有人不会

你好呀&#xff0c;我是 javapub. 做 Java 的同学都会用到的三件套&#xff0c;Spring、SpringMV、MyBatis。但是由于使用起来配置较多&#xff0c;依赖冲突频发。所有&#xff0c;各路大佬又在这上边做了包装&#xff0c;像我们常用的 SpringBoot、MyBatisPlus。 基于当前要…...

Linux驱动开发实战宝典:设备模型、模块编程、I2C/SPI/USB外设精讲

摘要: 本文将带你走进 Linux 驱动开发的世界,从设备驱动模型、内核模块开发基础开始,逐步深入 I2C、SPI、USB 等常用外设的驱动编写,结合实际案例,助你掌握 Linux 驱动开发技能。 关键词: Linux 驱动,设备驱动模型,内核模块,I2C,SPI,USB 一、Linux 设备驱动模型 Li…...

安全技术和防火墙

1、安全技术 1.1入侵检测系统 特点是不阻断网络访问&#xff0c;主要提供报警和事后监督。不主动介入&#xff0c;默默的看着你&#xff08;类似于监控&#xff09; 1.2入侵防御系统 透明模式工作&#xff0c; 数据包&#xff0c;网络监控&#xff0c;服务攻击&#xff0c;…...

Webpack: 开发 PWA、Node、Electron 应用

概述 毋庸置疑&#xff0c;对前端开发者而言&#xff0c;当下正是一个日升月恒的美好时代&#xff01;在久远的过去&#xff0c;Web 页面的开发技术链条非常原始而粗糙&#xff0c;那时候的 JavaScript 更多用来点缀 Web 页面交互而不是用来构建一个完整的应用。直到 2009年5月…...

python处理txt文件, 如果第一列和第二列的值在连续的行中重复,则只保留一行

处理txt文件, 如果第一列和第二列的值在连续的行中重复,则只保留一个实例,使用Python的内置函数来读取文件,并逐行检查和处理数据。 一个txt文件,里面的数据是893.554382324,-119.955825806,0.0299997832626,-0.133618548512,28.1155740884,112.876833236,46.7922,19.62582…...

C++17中引入了什么新的重要特性

C17是C标准的一个重要版本&#xff0c;它在语言核心和标准库中引入了许多新特性和改进&#xff0c;使得C编程更加现代化和高效。以下是C17中引入的一些重要新特性&#xff1a; 语言核心新特性 结构化绑定&#xff08;Structured Bindings&#xff09;&#xff1a; 结构化绑定…...