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

selenium学习笔记(二)

文章目录

  • 前言
  • 设计模式POM
    • POM概念
    • POM优势
    • POM设计原则
    • POM的实现
  • selenium的常用操作
    • 处理动态元素
    • 截图操作
    • 勾选复选框
    • 多层框架/窗口定位
    • 操作下拉框
    • 上传文件操作
    • 处理弹窗
    • 切换窗口
    • 拖拽操作
  • 如何处理浏览器驱动更新导致的问题
  • selenium与网站监控
    • 监听网页内容变化
    • 监控网络请求
  • selenium 与性能测试
    • 代码示例
    • 常见的性能指标
  • selenium与TestNG
  • 常见面试题
    • 原理相关
    • 定位元素相关
    • 操作相关
    • 脚本稳定与优化类相关

前言

1、该文是为了做个笔记,在需要的时候可以方便查找,侵权可删
2、文中的代码均为java
3、回顾前文 selenium学习笔记(一)

设计模式POM

Page Object Model (POM)
将页面分解成独立的对象,每个对象代表一个页面或页面的一部分,有助于组织测试代码和提高可维护性

POM概念

页面对象模型是一种设计模式,它提倡将UI元素抽象成对象,并围绕这些对象组织测试代码。这一模式不仅提升了测试脚本的可读性和可维护性,还促进了代码的重用

POM优势

  • 分离关注点:将测试逻辑与页面元素分离,使测试脚本更加清晰。
  • 易于维护:页面变化时,只需修改对应的页面对象类,无需改动所有测试案例。
  • 代码复用:页面对象可以在多个测试案例中重复使用,减少冗余代码。
  • 提高可读性:通过将操作封装成方法,使得测试代码更加易于理解。
  • 提高可维护性:减少测试脚本对页面结构变化的敏感度,提高测试代码的可维护性

POM设计原则

  • 抽象每一个页面:为每个页面创建一个对应的页面对象类。
  • 页面中元素不暴露:仅暴露操作元素的方法,隐藏元素的具体定位细节。
  • 页面不应该有繁琐的继承关系:避免页面对象之间的复杂继承结构。
  • 页面中不是所有元素都需要涉及到:只对核心业务元素进行建模。
  • 把页面划分功能模块:在Page中实现这些功能方法

POM的实现

  • 创建页面类:为每个页面创建一个类,该类包含页面的所有元素定位器和操作方法。
  • 封装元素操作:在页面类中封装对元素的所有操作,如点击、输入文本等。
  • 使用Page Factory:Selenium提供了Page Factory模式,可以进一步简化页面对象的创建和管理

selenium的常用操作

处理动态元素

使用显式等待 和 隐式等待来处理动态元素

  • 1、使用WebDriverWait和Expected Conditions

    动态元素往往是在页面加载完成后通过JavaScript动态生成的。使用WebDriverWait结合Expected Conditions可以等待元素在页面上可见或可点击后再进行操作

    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("dynamicElement")));
    
  • 2、根据部分属性值定位

    如果元素的ID或class是动态生成的,可以使用XPath中的contains()、starts-with()和ends-with()函数来根据部分属性值定位元素
    // 这样可以匹配ID中包含"auto-id"的元素,即使ID是动态生成的
    driver.findElement(By.xpath(“//div[contains(@id, ‘auto-id’)]”));

  • 3、根据相对关系定位

    如果动态元素与其附近的父节点、子节点或兄弟节点有固定的相对关系,可以根据这些固定元素来定位动态元素

  • 4、根据DOM顺序index定位

    找到元素在DOM中的顺序索引,然后根据索引进行定位。这种方法可能不够稳定,如果可以,还是推荐使用其他方法

  • 5、使用CSS选择器

    CSS选择器提供了一种灵活的方式来定位元素,尤其是当元素的ID或class是动态生成时。例如,可以使用CSS属性选择器来定位元素
    driver.findElement(By.cssSelector(“input[type=‘text’]”));

  • 6、结合使用多种定位方法

    在某些情况下,可以结合使用多种定位方法来提高定位的准确性和成功率。例如,可以先通过CSS选择器定位到一个父元素,然后再通过相对路径定位到其子元素

  • 7、优化等待时间

    动态元素的加载可能需要时间,因此合理设置等待时间是提高脚本稳定性的关键。避免使用硬编码的等待时间(如Thread.sleep),而是使用WebDriverWait来动态等待元素加载完成

截图操作

需要导入依赖包,如Commons IO,进行截图操作

<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.8.0</version>
</dependency>
//浏览器截图private static void test11() 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://测试.png"));}

勾选复选框

private static void page01() {// 创建一个浏览器驱动WebDriver webDriver = new ChromeDriver();// 打开网页webDriver.get("http://localhost:63342/Test/src/main/page/teste01.html?_ijt=bbsd02k86b9564t8p03vfmeff1&_ij_reload=RELOAD_ON_SAVE");// 获取到所有的input标签对应的元素List<WebElement> webElements = webDriver.findElements(By.cssSelector("input"));// 判断每一个input标签里面type值是checkbox进行点击,否则不点击for(int i = 0; i < webElements.size(); i++) {if(webElements.get(i).getAttribute("type").equals("checkbox")) {webElements.get(i).click();} }}

多层框架/窗口定位

对于一个web 应用,经常会出现框架(iframe) 或窗口(window)的应用,这样如果我们定位元素就不能直接右击copy他的xpath或者是cssselector来定位;但是可以通过switchTo()方法定位到frame下或者window下,然后通过元素css选择器或者xpath定位

 private static void page02() {// 创建浏览器驱动WebDriver webDriver = new ChromeDriver();// 打开网页webDriver.get("http://www.xxx.com");// 需要先定位到frame下再定位到clickwebDriver.switchTo().frame("f1");webDriver.findElement(By.cssSelector("body > div > div > a")).click();// 目标元素不在iframe,可以直接获取
//        String h3_text = webDriver.findElement(By.cssSelector("body > div > div > h3")).getText();
//        System.out.println(h3_text);}

操作下拉框

下拉框里的内容需要进行两次定位,先定位到下拉框对下拉框进行操作后,再定位到下拉框内里的选项

 private static void page03() {// 创建浏览器驱动WebDriver webDriver = new ChromeDriver();// 打开网页webDriver.get("http://url地址");// 操作下拉框Select select = new Select(webDriver.findElement(By.cssSelector("#ShippingMethod")));
//        select.selectByValue("12.51");select.selectByIndex(2);}

上传文件操作

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

 private static void page05() {WebDriver webDriver = new ChromeDriver();webDriver.get("http://url地址");// 找到按钮(上传文件的按钮),输入一个字符串webDriver.findElement(By.cssSelector("input")).sendKeys("C:\Users\34085\Desktop\hello.txt");}

处理弹窗

使用Alert类来处理弹窗:
1.text 返回alert 中的文字信息。
2.accept 点击确认按钮。
3.dismiss 点击取消按钮,如果有的话。
4.sendKeys 输入值,如果alert 没有对话框就不能用了,不然会报错。

private static void page04() throws InterruptedException {WebDriver webDriver = new ChromeDriver();webDriver.get("http://url地址");webDriver.findElement(By.cssSelector("button")).click();// alert弹窗确定
//        webDriver.switchTo().alert().accept();// alert弹窗取消
//        webDriver.switchTo().alert().dismiss();webDriver.switchTo().alert().sendKeys("你好");webDriver.switchTo().alert().accept();}

切换窗口

获取当前窗口句柄并切换到新窗口

// 进入百度页面然后点击新闻进入新闻页面,此时如果我们需要在新闻页面输入相关内容,是不能直接通过选择器定位实现的
// 我们需要先实现页面切换才能在新闻页面搜索内容
//浏览器切换窗口private static void test10() throws InterruptedException {WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");//点击新闻页面,在新闻面输入相关信息webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();//getWindowHandles获得所有窗口句柄//getWindowHandle获取get打开的窗口句柄// 获取到浏览器所有的窗口句柄Set<String> handles = webDriver.getWindowHandles();//遍历所有的窗口句柄String target_handle = "";for(String handle:handles) {//赋值target_handle = handle;}//System.out.println(target_handle);//在新闻页面搜索新闻联播webDriver.switchTo().window(target_handle);sleep(3000);webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");webDriver.findElement(By.cssSelector("#s_btn_wr")).click();}

拖拽操作

使用Actions类进行复杂的鼠标操作,如拖拽

from selenium.webdriver.common.action_chains import ActionChains
private static void test() {WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.URL地址/");element_to_drag = driver.find_element_by_id("source");target_element = driver.find_element_by_id("target");// 方法一:直接将源元素拖拽到目标元素上actionsA = ActionChains(driver);actionsA.drag_and_drop(element_to_drag, target_element).perform();// 方法二:模拟了更细致的拖拽过程,包括按住源元素(click_and_hold)、移动到目标元素位置(move_to_element)、然后释放(release)actionsB = ActionChains(driver)actionsB.click_and_hold(element_to_drag).move_to_element(target_element).release().perform()}

如何处理浏览器驱动更新导致的问题

  • 1、确保webdriver与浏览器版本匹配
  • 2、手动下载WebDriver并使用Selenium的Service类来加载。这样可以控制WebDriver的版本,避免自动更新带来的问题
  • 3、在代码中添加异常处理逻辑,捕获TimeoutException并提供相应的错误信息和日志,以便进行问题定位和调试
  • 4、定期更新selenium和webdriver
  • 5、避免浏览器自动更新
  • 6、在测试开始之前,确保浏览器是干净的,没有被其他扩展或插件干扰。如果浏览器崩溃或被关闭,可以考虑重启浏览器并重新运行测试

selenium与网站监控

监听网页内容变化

通过定期检查网页上特定元素的内容,可以监控网页内容的变化。例如,可以监控商品价格、库存状态或新闻更新等

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
// 这段代码会在指定的网页上查找价格元素,并检测其内容的变化。如果价格发生变化,它会输出新的价格。
// 我们可以结合邮件报警+定时任务,当价格有变动时,可以发送邮件
public class PriceWatcher {public static void main(String[] args) throws InterruptedException {System.setProperty("webdriver.chrome.driver", "chromedriver的地址");WebDriver driver = new ChromeDriver();driver.get("http://url地址");String previousPrice = "";while (true) {WebElement priceElement = driver.findElement(By.id("price")); // 假设价格的ID是"price"String currentPrice = priceElement.getText();if (!currentPrice.equals(previousPrice)) {System.out.println("价格变动: " + currentPrice);previousPrice = currentPrice;}Thread.sleep(5000); // 每5秒检查一次}}
}

补充:如果是监控价格:
(1)可以将每次检查的价格存储到CSV文件或数据库中,以便进行历史价格分析。这可以通过在上述代码中添加文件写入逻辑来实现;
(2)发送通知,如集成邮件报警;
(3)添加异常处理

监控网络请求

Selenium可以结合BrowserMob Proxy或其他工具来监控网络请求。BrowserMob Proxy是一个开源的代理服务器,可以捕获HTTP请求和响应

import net.lightbody.bmp.BrowserMobProxy;
import net.lightbody.bmp.BrowserMobProxyServer;
import net.lightbody.bmp.client.ClientUtil;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.List;
// 这段代码通过BrowserMob Proxy捕获了浏览器的所有HTTP请求和响应,并打印了请求的URL和响应状态。
// 通过这些方法,Selenium不仅可以用于自动化测试,还可以用于网站监控,帮助开发者和测试人员及时发现和响应网站的变化。
public class MonitorHttpRequests {public static void main(String[] args) {// 启动BrowserMob ProxyBrowserMobProxy proxy = new BrowserMobProxyServer();proxy.start(0);// 获取代理的地址Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);// 设置WebDriver的代理ChromeOptions options = new ChromeOptions();options.setProxy(seleniumProxy);WebDriver driver = new ChromeDriver(options);// 启动请求捕获proxy.newHar("myHar");// 导航到网页driver.get("http://url地址");// 获取请求数据List<HarEntry> entries = proxy.getHar().getLog().getEntries();for (HarEntry entry : entries) {System.out.println("请求网址: " + entry.getRequest().getUrl());System.out.println("响应状态: " + entry.getResponse().getStatus());}// 关闭WebDriver与Proxydriver.quit();proxy.stop();}
}

selenium 与性能测试

代码示例

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
// 配置性能日志记录
public class PerformanceTestSetup {public static void main(String[] args) {// 设置ChromeDriver路径System.setProperty("webdriver.chrome.driver", "chromedriver路径");// 创建ChromeOptions对象ChromeOptions options = new ChromeOptions();// 启用性能日志记录options.setCapability("perfLoggingPrefs", "{\"enableNetwork\": true, \"enablePage\": true}");// 将配置应用于WebDriver对象WebDriver driver = new ChromeDriver(options);// 打开网页driver.get("http://example.com");// 执行操作// 关闭浏览器driver.quit();}
}
import org.openqa.selenium.logging.LogEntries;
import org.openqa.selenium.logging.LogEntry;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
// 获取并分析性能日志
public class PerformanceLogging {public static void main(String[] args) {// 设置WebDriver路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 设置Chrome选项ChromeOptions options = new ChromeOptions();options.addArguments("--auto-open-devtools-for-tabs");// 创建WebDriver实例WebDriver driver = new ChromeDriver(options);// 获取DevTools实例。 注意:以下代码需要Selenium 4及以上版本org.openqa.selenium.devtools.DevTools devTools = ((ChromeDriver) driver).getDevTools();devTools.createSession();// 启动性能监控devTools.send(org.openqa.selenium.devtools.v93.performance.Performance.enable());// 访问目标页面driver.get("http://example.com");// 获取性能指标LogEntries entries = driver.manage().logs().get(org.openqa.selenium.logging.LogType.PERFORMANCE);for (LogEntry entry : entries) {System.out.println(entry.getMessage());}// 关闭驱动driver.quit();}
}

常见的性能指标

  • 响应时间(Response Time):客户端发送请求到接收到服务器响应的时间
  • 吞吐量(Throughput):指系统在单位时间内能处理的事务或请求的数量。高吞吐量表明系统能够处理大量的请求
  • 并发用户数(Concurrent Users):指系统能同时支持的最大用户数量( 这个指标对于理解系统在高负载下的表现非常重要)
  • 事务处理速率(Transaction Rate):系统在单位时间内能完成的事务数量。事务可以是任何用户操作,如登录、查询、更新等
  • 资源利用率(Resource Utilization):系统资源(如CPU/内存/磁盘I/O/网络带宽)的使用情况。高资源利用率可能表明性能瓶颈
  • 错误率(Error Rate):指在一定时间内失败的事务或请求所占的比例。低错误率是系统稳定性的重要指标
  • 页面加载时间(Page Load Time):对于Web应用,指从用户点击链接或输入网址到页面完全加载完成所需的时间
  • 首次内容绘制(Time to First Contentful Paint, TTFCP):指页面开始加载到首次内容(如文本或图像)被渲染到屏幕上的时间
  • 最大内容绘制(Time to Largest Contentful Paint, LTCP):指页面开始加载到最大文本块或图像被渲染到屏幕上的时间
  • 交互时间(Time to Interactive, TTI):指页面加载到主要子资源加载完成,且页面能够快速响应用户输入的时间
  • 总页面加载时间(Total Page Load Time):从用户开始导航到页面完全加载完成的时间
  • 服务器响应时间(Server Response Time):服务器处理请求并返回响应所需的时间
  • 网络时间(Network Time):数据在网络中传输的时间,包括请求和响应的往返时间
  • 数据库响应时间(Database Response Time):数据库处理请求并返回结果所需的时间
  • 系统稳定性(System Stability):在长时间运行或高负载下,系统是否能够保持性能和不出现故障
  • 可扩展性(Scalability):系统在增加负载时,性能如何变化,以及是否能够通过增加资源来提高性能

selenium与TestNG

TestNG是一个测试框架,它支持各种测试场景,包括单元测试、集成测试、端到端测试等

  • 1、添加依赖

    <!-- Selenium -->
    <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version>
    </dependency><!-- TestNG -->
    <dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>7.4.0</version><scope>test</scope>
    </dependency>
    
  • 2、创建测试类,并使用TestNG的注解来定义测试方法和测试套件

    import org.testng.annotations.AfterMethod;
    import org.testng.annotations.BeforeMethod;
    import org.testng.annotations.Test;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    public class SeleniumTestNGExample {private WebDriver driver;@BeforeMethodpublic void setUp() {// 设置WebDriver路径System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");// 初始化WebDriverdriver = new ChromeDriver();}@Testpublic void testGoogleSearch() {// 打开Google首页driver.get("https://www.baidu.com");// 执行测试逻辑}@AfterMethodpublic void tearDown() {// 关闭浏览器driver.quit();}
    }
    
  • 3、运行测试

    在命令行中运行:testng path/to/your/test-class/SeleniumTestNGExample.java

  • 4、TestNG的高级功能

    (1)@BeforeSuite 和 @AfterSuite:在测试套件开始前和结束后执行。
    (2)@BeforeTest 和 @AfterTest:在每个测试类的所有测试方法执行前和执行后执行。
    (3)@BeforeClass 和 @AfterClass:在同一个类中的所有测试方法执行前和执行后执行。
    (4)@BeforeMethod 和 @AfterMethod:在每个测试方法执行前和执行后执行。
    (5)@Test:标记一个方法为测试方法,可以指定测试的优先级、依赖关系等。

常见面试题

原理相关

  • 介绍一下selenium及其工作原理

    Selenium 是一个开源的自动化测试框架,专门用于Web应用程序的测试。它支持多种编程语言,如Java、C#、Python、Ruby等,并提供了不同的工具和库来模拟用户在浏览器中的交互行为

    selenium的原理涉及到3个部分,分别是:浏览器、driver(一般我们都会下载driver)、client(也就是我们写的代码)
    client其实并不知道浏览器是怎么工作的,但是driver知道,在selenium启动以后,driver其实充当了服务器的角色,跟client和浏览器通信,client根据webdriver协议发送请求给driver,driver解析请求,并在浏览器上执行相应的操作,并把执行结果返回给client。这就是selenium工作的大致原理。

  • selenium由哪些组件构成?常见的驱动有哪些

    Selenium WebDriver:核心组件,用于编写浏览器自动化脚本,支持多种浏览器。
    Selenium Grid:用于在不同机器和浏览器上并行运行测试。
    Selenium IDE:Firefox插件,用于记录和回放用户操作,适合创建简单测试。
    Page Object Model (POM):设计模式,用于组织和管理测试代码,提高可维护性

    FireFoxDriver ;InternetExplorerDriver ;ChromeDriver ;SafariDriver ;OperaDriver ;AndroidDriver

  • webdriver的协议是什么

    client与driver之间的约定,无论client是使用java实现还是c#实现,只要通过这个约定,client就可以准确的告诉drier它要做什么以及怎么做。
    webdriver协议本身是http协议,数据传输使用json

  • selenium是如何驱动浏览器做各种操作的呢

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

  • selenium webdriver有什么优点

    1.主流浏览器如Chrome、Firefox、IE、Safari等,可以在不同浏览器上运行和测试应用。
    2.支持大多数语言,如Java,Python,Ruby,C#等。
    3.Selenium提供了丰富的API可以根据测试需求进行扩展,实现定制化的测试用例。
    4.Selenium可以很好地与Jenkins,测试管理工具等集成,实现自动化测试的持续集成和持续交付。

  • POM设计模式和page factory

    page object:简单来说就是用class去表示被测页面。在class中定义页面上的元素和一些该页面上专属的方法。
    Page Factory 实际上是官方给出的java page object的工厂模式实现

  • 什么是Selenium Grid?

    Selenium-Grid允许在不同的机器上针对不同的浏览器并行运行测试。也就是说,在不同的机器、不同的浏览器和操作系统上同时运行多个测试。本质上,Selenium-Grid支持分布式测试执行

  • 举例Selenium中重载的方法

    // 方法一:通过 iframe的索引值,在页面中的位置
    driver.switchTo().frame(index);
    // 方法二:通过 iframe 的name 或者id
    driver.switchTo().frame(nameOrId);
    // 方法三:通过iframe 对应的webElement
    driver.switchTo().frame(frameElement);

  • selenium是否支持桌面应用软件的自动化测试

    不支持。selenium是根据网页元素的属性来确定范围元素的

定位元素相关

  • selenium中如何判断元素是否存在?

    selenium中没有提供原生的方法判断元素是否存在,一般我们可以通过定位元素+异常捕获的方式判断

  • 如何查找元素是否显示在屏幕上?

    WebDriver通过isDisplayed(), isSelected(), isEnabled(),这三种方法判断Web元素的可见性,这类方法将返回结果是布尔类型;Web元素可以是按钮,下拉框,复选框,单选按钮,标签等。

    ①isDisplayed(): boolean b1 = driver.findElement(By.id(“XXX”)).isDisplayed();
    ②isSelected(): boolean b2 = driver.findElement(By.id(“XXX”)).isSelected();
    ③isEnabled(): boolean b3 = driver.findElement(By.id(“XXX”)).isEnabled();

  • selenium中hidden或者是display = none的元素是否可以定位到?

    不可以,selenium不能定位不可见的元素。display=none的元素实际上是不可见元素

  • selenium自动化页面元素找不到存在异常的原因?

    ① 元素定位错误
    ② 页面加载时间过慢,需要查找的元素程序已经完成,单页面还未加载,此时可以加载页面等待时间
    ③ 有可能元素包含在iframe或者frame里面,需要切换。

  • selenium中如何保证操作元素的成功率?即如何保证我点击的元素一定是可以点击的?

    1、当网速不好的情况下,使用合适的等待时间;
    2、被点击的元素一定要占一定的空间,因为selenium默认会去点这个元素的中心点,不占空间的元素算不出来中心点;
    3、被点击的元素不能被其他元素遮挡;
    4、被点击的元素不能在viewport之外,也就是说如果元素必须是可见的或者通过滚动条操作使得元素可见;
    5、判断元素是否是可以被点击的。

  • id,name,clas,xpath,css selector这些定位器,你最偏爱哪一种,为什么?

    xpath和css最为灵活。id、name等需要开发支持
    xpath定位时采用遍历页面的方式,性能指标较差。xpath定位有通过绝对路径定位的,有时会不准确;对于动态元素可以使用xpath
    css选择器定位比较简洁,运行速度更快,通常用于性能要求严格的场景。

  • selenium为什么不推荐使用xpath定位?

    selenium使用xpath定位时采用遍历页面的方式,性能指标较差。另外xpath定位有通过绝对路径定位的,有时会不准确;
    而用css选择器定位比较简洁,运行速度更快,通常用于性能要求严格的场景。

  • 如何判断一个页面上元素是否存在?

    1、用try…except 在代码块加上
    2、用elements定义组元素方法 然后根其元素个数len()<1 存在返回True, 不存在则返回False
    3、结合WebDriverWait和excepted_conditions条件判断(强烈推荐) 显示等待,每间隔1秒判断一次,30秒超时,存在返回True,不存在则返回False

  • 一个元素明明定位了,点击无效(也没报错),如何解决?

    使用js点击,selenium有时候点击元素时会失效
    #js 点击
    js = ‘document.getElementById(‘baidu’).click()’
    driver.execute_script(js)

  • selenium调用js(execute_script),有哪些场景?

    ① 对input执行输入 ② 对富文本框的操作 ③ 滚动到指定位置操作

  • 如何去定位属性动态变化的元素?

    属性动态变化是指该element没有固定的属性值,只能通过相对位置定位。
    第一种方法:用findelements遍历
    第二种方法:通过xpath的轴 parent / following-sibling / precent-sibling

    一个是属性动态,定位时,若id是动态的,就不要用id定位,用其他定位元素方法
    另一个还是这个元素一会在页面上方,一会在下方,飘忽不定,定位方法也是一样,根据元素属性定位(元素的tag name属性是不会变的,动的只是class属性和style属性)

  • 如何通过子元素定位父元素?

    第一种:通过子元素定位父元素,selenium提供了parent方法,但是只能定位到父元素,却不能获取元素属性,也不能操作。
    第二种:通过xpath的语法直接定位。 如.//*[@name=”hello”]/… 两个点代表父级元素。

  • findElement和findElements有什么区别?

    这两个方法都是WebDriver接口的抽象方法,用于在网页中查找元素。
    findElemen():用于查找一个Web元素。它只返回一个WebElement类型。
    findElements():用于查找多个Web元素。它返回WebElements集合。

  • selenium中隐藏元素定位,你该如何做?

    隐藏元素可以正常定位到,只是不能操作(定位元素和操作元素是两码事,操作元素是指click 、clear 、send_keys等这些方法)。我们可以用js来操作隐藏元素。js和selenium不同,只有页面上有的元素(在dom里面的)都能正常操作。

操作相关

  • 如何获取当前页面的url

    driver.getCurrentUrl()

  • 如何在webdriver中调用应用程序?

    driver.get(‘url’) 或者 driver.navigate().to(‘url’)

  • 如何使用WebDriver执行右键单击?

    // contextClick方法用于模拟右键单击操作。perform方法用于执行链中存储的所有操作
    Actions actions = new Actions(driver);
    actions.contextClick(element).perform();

  • 登录按钮除了click之外还有什么方法

    使用submit()方法,但它只能在属性type=submit时使用

  • 如何验证复选框/单选框是否被选中

    driver.findElement(By.xpath(“元素路径”)).isSelected();

  • 如何使用WebDriver执行拖放?

    // dragAndDrop方法用于模拟从源元素拖放到目标元素的操作。perform方法用于执行链中存储的所有操作
    Actions actions = new Actions(driver);
    actions.dragAndDrop(sourceElement, targetElement).perform();

  • selenium如何处理web弹窗?js弹窗?

    使用driver.switch_to.alert()

  • 如何从文本框中获取输入的文本?

    String text = driver.findElement(By.xpath("元素路径 ")).getAttribute(“value”));

  • 如何截取一个元素的图片,不要截取全部图片?

    1、截取当前页面并自定义保存
    2、根据要截取元素图片的属性来获取该元素的坐标和大小 ele.location ele.size
    3、分别left = ele.location[‘x’] top = ele.location[‘y’] right = ele.location[‘x’] + ele.size[‘width’]
    bottom = ele.location[‘y’] + ele.size[‘height’]
    4、获取该元素的图片的坐标大小
    5、再次打开刚开始保存的,通过image类中的crop方法(相当于拷贝该元素的一个矩形区域),然后做保存操作就可以了。

  • 上传图片的几种方式?

    send_keys和AutoIT工具实现.

  • 截图应当怎么操作?

    driver.get_screenshot_as_file(‘C:\test.jpg’)

脚本稳定与优化类相关

  • 单斜杠和双斜杠有什么区别

    /用于标识直接子节点
    //用于在整个结构中查找

  • Assert和Verify有什么区别?

    Assert和Verify都是用于验证结果。如果测试用例失败,那么Assert将停止测试用例的执行,并且不再往下执行后续的测试步骤。
    对于Verify如果测试用例失败,都不会停止当前的程序执行,并且所有测试步骤都将被执行到。

  • 如何提高脚本的稳定性?

    首先只要页面一直没变过,说明定位方法是没问题的。
    优化方向:
    ① 自己写相对路径,多用id为节点查找,少用右键复制xpath,那种不稳定。
    ② 第二个影响因素就是等待了,sleep等待尽量少用(影响执行时间) 尽量使用显式等待
    ③ 定位元素方法重新封装,结合WebDriverWait和excepted_conditions判断元素方法,自己封装一套定位元素方法
    ④ 尽量使用测试专用环境,避免其他类型的测试同时进行,对数据造成干扰

  • 如何提高selenium脚本的执行速度?

    1、使用更高配置的电脑和选择更快的网络环境;
    2、使用效率更高的语言,比如java执行速度就快过python;
    3、优化代码;
    4、不要盲目的加sleep,尽量使用显式等待;
    5、可以考虑分布式执行(如,配置testNG实现多线程)或者使用selenium grid;
    6、对于firefox,考虑使用测试专用的profile,因为每次启动浏览器的时候firefox会创建1个新的profile,对于这个新的profile,所有的静态资源都是从服务器直接下载,而不是从缓存里加载,这就导致网络不好的时候用例运行速度特别慢的问题;
    7、chrome浏览器和safari浏览器的执行速度看上去是最快的。

  • selenium自动化时,在平时遇到过哪些问题?如何解决的

    动态id 、有iframe的情况、没加等待等因素

  • selenium中常见的异常

    NoSuchElementException - 元素未找到异常
    ElementNotVisibleException - 元素不可见异常
    ElementNotSelectableException - 元素不可选择异常
    NoAlertPresentException - 未找到警报异常
    NoSuchAttributeException - 未找到属性异常
    NoSuchWindowException - 未找到窗口异常
    TimeoutException - 超时异常
    WebDriverException - WebDriver异常

相关文章:

selenium学习笔记(二)

文章目录 前言设计模式POMPOM概念POM优势POM设计原则POM的实现 selenium的常用操作处理动态元素截图操作勾选复选框多层框架/窗口定位操作下拉框上传文件操作处理弹窗切换窗口拖拽操作 如何处理浏览器驱动更新导致的问题selenium与网站监控监听网页内容变化监控网络请求 seleni…...

vue和uniapp中,点击按钮 传递当前item对象,并从selectData数组中删除该条item数据

在 Vue 中,可以通过点击按钮传递 item 对象,并从 selectData 数组中删除该条数据。可以使用 Array.prototype.filter() 方法来实现这一点。以下是一个示例: 说明 数据结构:selectData 是一个包含多个对象的数组,每个对象都有 id 和 name 属性。渲染列表:使用 v-for 指令…...

双柱渐变图背景图

option {backgroundColor: #1b2735,tooltip: {//提示框组件trigger: axis,//触发类型 柱状图axisPointer:{type:shadow} //触发效果 移动上去 背景效果}, xAxis: [//x轴{type: category,//坐标轴类型 离散data: [1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月],//数据axisTick:f…...

OpenHarmony怎么修改DPI密度值?RK3566鸿蒙开发板演示

本文介绍在开源鸿蒙OpenHarmony系统下&#xff0c;修改DPI密度值的方法&#xff0c;触觉智能Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566四核处理器&#xff0c;Laval鸿蒙社区推荐开发板&#xff0c;已适配全新开源鸿蒙OpenHarmony5.0 Release系统&#xff0c;适…...

KylinOS V10 SP3下编译openGauss与dolphin插件

编译环境 KylinOS v10 sp3gcc 7.3.0make 4.3opengauss 5.0.0 mkdir -p /data/opengauss cd /data/opengauss git clone https://gitee.com/opengauss/openGauss-server.git git clone https://gitee.com/opengauss/Plugin.git wget -c https://opengauss.obs.cn-south-1.myhu…...

【入门】买杯子

描述 小明去商店买杯子&#xff0c;他想买价格在 10 到 20 元之间的杯子&#xff08;含 10 元和 20 元&#xff09;&#xff0c;他看到货架上有 3 个不同价格的杯子&#xff0c;请问最终他买了几个杯子&#xff0c;总共花了多少钱&#xff1f; 比如&#xff1a;货架上有如下的…...

VIVO C++开发面试题及参考答案

面向过程与面向对象的区别,面向对象后的好处 面向过程编程主要关注的是程序的流程,它将一个问题分解为一系列的步骤,通过函数来实现这些步骤,数据和操作这些数据的函数是分离的。例如,在一个简单的计算学生成绩平均值的程序中,我们可能会有一些函数来输入成绩、计算总和、…...

虚拟化 | Proxmox VE 8.x 开源的虚拟化平台快速上手指南

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 0x00 简介说明 前言简述 描述:作为一个爱折腾的IT打工佬,时刻以学习各类新技术新知识为目标,这不正好有一台部署了VMware vSphere ESXi 虚拟化环境的服务器,由于正好安装其系统的磁盘有坏道,经常导致使用 ESXi 异…...

【原创学习笔记】近期项目中使用的西门子V20变频器总结(下篇)

上一篇我们简单介绍了下现场的变频器&#xff0c;现在我们来聊聊如何用手机控制变频器。 手机控制变频器的前提是变频器上必须安装智能模块&#xff0c;现场并为安装此模块&#xff0c;故不作考虑。 下面介绍一下如何实现手机或者电脑控制变频器 首先如果存在485通信&#x…...

idea 8年使用整理

文章目录 前言idea 8年使用整理1. 覆盖application配置2. 启动的时候设置编辑空间大小&#xff0c;并忽略最大空间3. 查询类的关系4. 查看这个方法的引用关系5. 查看方法的调用关系5.1. 查看被调用关系5.2. 查看调用关系 6. 方法分隔线7. 选择快捷键类型8. 代码预览插件9. JReb…...

Bluetooth Spec【0】蓝牙核心架构

蓝牙核心系统由一个主机、一个主控制器和零个或多个辅助控制器组成蓝牙BR/ EDR核心系统的最小实现包括了由蓝牙规范定义的四个最低层和相关协议&#xff0c;以及一个公共服务层协议&#xff1b;服务发现协议&#xff08;SDP&#xff09;和总体配置文件要求在通用访问配置文件&a…...

PlantUML 入门使用指南

PlantUML 入门使用指南 一、PlantUML介绍二、PlantUML的用途三、PlantUML的语法及示例3.1 用例图&#xff08;Use Case Diagram&#xff09;3.2 类图&#xff08;Class Diagram&#xff09;3.3 对象图&#xff08;Object Diagram&#xff09;3.4 序列图&#xff08;Sequence Di…...

QT:一个TCP客户端自动连接的测试模型

版本 1:没有取消按钮 测试效果&#xff1a; 缺陷&#xff1a; 无法手动停止 测试代码 CMakeLists.txt cmake_minimum_required(VERSION 3.19) project(AutoConnect LANGUAGES CXX)find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets Network)qt_standard_project_setup(…...

IOS safari 播放 mp4 遇到的坎儿

起因 事情的起因是调试 IOS 手机下播放服务器接口返回的 mp4 文件流失败。对于没调试过移动端和 Safari 的我来说着实费了些功夫&#xff0c;网上和AI也没有讲明白。好在最终大概理清楚了&#xff0c;在这里整理出来供有缘人参考。 问题 因为直接用 IOS 手机的浏览器打开页面…...

LLM常见面试题(26-30题)--langchain篇

26&#xff0c;什么是langchain? 一个局域语言模型的框架&#xff0c;用于构建聊天机器人、生成式回答、摘要等功能。 核心思想是将不同的组件“链”在一起&#xff0c;连接大语言模型和外部资源&#xff0c;以创建更高级的语言模型应用。使得开发人员可以快速开发原型系统和…...

【Python运维】构建基于Python的自动化运维平台:用Flask和Celery

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代IT运维中,自动化运维平台扮演着至关重要的角色,它能够显著提高运维效率,减少人为错误,并且增强系统的可维护性。本文将引导读者如…...

socket编程(C++/Windows)

相关文章推荐&#xff1a; Socket 编程基础 面试官&#xff0c;不要再问我三次握手和四次挥手 TCP的三次握手与四次挥手 参考视频&#xff1a; https://www.bilibili.com/video/BV1aW4y1w7Ui/?spm_id_from333.337.search-card.all.click TCP通信流程 服务端 #include<…...

Spring Boot介绍、入门案例、环境准备、POM文件解读

文章目录 1.Spring Boot(脚手架)2.微服务3.环境准备3.1创建SpringBoot项目3.2导入SpringBoot相关依赖3.3编写一个主程序&#xff1b;启动Spring Boot应用3.4编写相关的Controller、Service3.5运行主程序测试3.6简化部署 4.Hello World探究4.1POM文件4.1.1父项目4.1.2父项目的父…...

【hackmyvm】deba靶机wp

tags: HMVnodejs反序列化CVE-2017-5941wine命令定时任务 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集2.1. 端口扫描2.2. 目录扫描 3. nodejs反序列化 (CVE-2017-5941)4. www-data提权low用户5. 定时任务提权6. wine命令 提权root6.1. 利用CS获取root 靶机链接 http…...

新浪微博大数据面试题及参考答案(数据开发和数据分析)

介绍一下你所掌握的计算机网络和操作系统相关知识 计算机网络:计算机网络是将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。我掌握了网络协议…...

去除 el-input 输入框的边框(element-ui@2.15.13)

dgqdgqdeMac-mini spid-admin % yarn list --pattern element-ui yarn list v1.22.22 └─ element-ui2.15.13 ✨ Done in 0.23s.dgqdgqdeMac-mini spid-admin % yarn list vue yarn list v1.22.22 warning Filtering by arguments is deprecated. Please use the pattern opt…...

Qt 应用程序转换为服务

一、在 Windows 上将 Qt 应用程序转换为服务 方法1&#xff1a; 创建一个 Windows 服务应用程序&#xff1a; Windows 服务应用程序是一个没有用户界面的后台进程&#xff0c;通常由 Win32 Service 模板创建&#xff0c;或者直接编写 main() 函数以实现服务逻辑。 修改 Qt 应…...

C/C++ 数据结构与算法【树和森林】 树和森林 详细解析【日常学习,考研必备】带图+详细代码

一、树的存储结构 1&#xff09;双亲表示法实现&#xff1a; 定义结构数组存放树的结点&#xff0c;每个结点含两个域: 数据域&#xff1a;存放结点本身信息。双亲域&#xff1a;指示本结点的双亲结点在数组中的位置。 特点&#xff1a;找双亲简单&#xff0c;找孩子难 C语…...

潇洒郎:部署Dify, 安装Ollama,Ollama下载模型,Dify配置模型

Ollama 1、安装ollama Windows版本下载&#xff1a;2024WindowsOllama最新0.5.4版本资源-CSDN文库, 下载速度超快&#xff0c;官网太慢了 双击安装&#xff0c;安装成功后&#xff0c;托盘区有Ollama图标 右键View logs打开目录 C:\Users\Administrator\AppData\Local\Oll…...

如何在 Linux 中设置 SSH 免密码登录

一般情况下&#xff0c;我们通过一台 Linux 服务器远程另外一台服务器时&#xff0c;每次远程都需要输入对端机器的密码。 ssh root192.168.21.20 有没有这样一种情况&#xff0c;我们不用输入密码就可以远程别的服务器呢&#xff1f; 答案是肯定的&#xff0c;如果我们在 Li…...

网络安全词云图与技术浅谈

网络安全词云图与技术浅谈 一、网络安全词云图生成 为了直观地展示网络安全领域的关键术语&#xff0c;我们可以通过词云图&#xff08;Word Cloud&#xff09;的形式来呈现。词云图是一种数据可视化工具&#xff0c;它通过字体大小和颜色的差异来突出显示文本中出现频率较高…...

Linux | Ubuntu零基础安装学习cURL文件传输工具

目录 介绍 检查安装包 下载安装 手册 介绍 ‌cURL是一个利用URL语法在命令行下工作的文件传输工具&#xff0c;首次发行于1997年‌‌12。cURL支持多种协议&#xff0c;包括FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3…...

重启ubuntu服务器,如何让springboot服务自动运行

文章目录 1. 使用 systemd 服务步骤&#xff1a; 2. 使用 cron 的 reboot 任务步骤&#xff1a; 3. 使用 init.d 脚本&#xff08;适用于较旧版本&#xff09;步骤&#xff1a; 推荐方案 为了确保在重启Ubuntu服务器后&#xff0c;让springboot的服务test.jar象 nohup java -ja…...

MySQL 查询大偏移量(LIMIT)问题分析

大偏移量查询缓慢?LIMIT: 会进行两步操作 性能消耗在哪里了?OFFSET操作问题 2 LIMIT 操作 如何优化? 大偏移量查询缓慢? 示例:(假设age字段有索引) SELECT * FROM test WHERE age>18 LIMIT 10000000 ,10;分析MySQL的 LIMIT 10000000 , 10 LIMIT: 会进行两步操作 OFF…...

深入探究C++pow函数的优势和劣势 原理

优势 功能强大 支持多种数据类型&#xff1a; C 的pow()函数在<cmath>头文件中定义&#xff0c;它能够灵活地处理不同的数据类型。对于整数类型&#xff0c;如int、long long等&#xff0c;它能准确地计算幂次方。以计算棋盘上的麦粒数为例&#xff0c;传说国际象棋棋盘…...

Vue中动态样式绑定+CSS变量实现切换明暗主题功能——从入门到进阶

1.直接借助Vue的动态绑定样式绑定 Vue动态样式绑定 在Vue中&#xff0c;动态样式绑定是一种强大的功能&#xff0c;它允许开发者根据数据的变化动态地更新元素的样式。以下是对Vue动态样式绑定的详细知识梳理与详解&#xff1a; 一、基础知识 Vue的动态样式绑定主要通过v-b…...

Linux 硬盘扩容 分区 挂载

Linux 硬盘扩容 分区 & 挂载 1. 添加分区 1.1. 查看新添加的硬盘 fdisk -l假设当前未挂载的盘符是/dev/sdb&#xff0c;后文中所有操作都按挂载/dev/sdb 操作 1.2. 分区管理 小硬盘 fdisk /dev/sdb大硬盘&#xff08;2TB以上&#xff09; gdisk /dev/sdb1.3. 编辑分…...

Microsoft word@【标题样式】应用不生效(主要表现为在导航窗格不显示)

背景 随笔。Microsoft word 2013基础使用&#xff0c;仅做参考和积累。 问题 Microsoft word 2013&#xff0c;对段落标题文字应用【标题样式】不生效&#xff08;主要表现为在导航窗格不显示&#xff09;。 图1 图2 观察图1和图2&#xff0c;发现图1的文字在应用【标题一】样…...

react中实现拖拽排序

效果图&#xff1a;如下 效果说明&#xff1a; 1. 点击“选择”按钮&#xff0c;打开弹窗 2. 左侧数据是调接口回显来的 3. 点击左侧某条数据&#xff0c;这条被点击的数据就会被添加到右侧 4. 右侧的数据可以上下拖动换位置 5. 右侧有数据时&#xff0c;点击"确定"…...

云效流水线自动化部署web静态网站

云效流水线部署静态网站 背景新建流水线配置流水线运行流水线总结 背景 配置流水线以前&#xff0c;每次更新导航网站都要登进去宝塔后台&#xff0c;删掉旧的目录和文件&#xff0c;再上传最新的文件&#xff0c;太麻烦啦 网上的博客基本都是分享vue项目&#xff0c;这一篇是…...

【Docker命令】如何使用 `docker cp` 命令拷贝容器文件到宿主机

在使用 Docker 时&#xff0c;我们经常需要将容器内的文件或目录复制到宿主机上。下面是使用 docker cp 命令进行操作的简要指南。 步骤一&#xff1a;定位容器内文件或目录 首先&#xff0c;确定你想要从容器中拷贝的文件或目录路径。 步骤二&#xff1a;选择宿主机目标路径…...

leetcode hot 100 二叉搜索

35. 搜索插入位置 已解答 简单 相关标签 相关企业 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solut…...

WebRTC服务质量(09)- Pacer机制(01) 流程概述

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…...

MIGRATE_ISOLATE浅析

在linux内核的migratetype中&#xff0c;有MIGRATE_ISOLATE这样一个内存迁移类型&#xff0c;注释里写着can’t allocate from here&#xff0c;这个是怎么做到的呢&#xff1f;他又有什么作用呢&#xff1f; 本文分析基于linux4.19.195 可以看到内核里&#xff0c;是函数set_…...

[bug]java导出csv用Microsoft Office Excel打开乱码解决

[bug]java导出csv用Microsoft Office Excel打开乱码 ‍ 现象 首先这个csv文件用macbook自带的 "Numbers表格" 软件打开是不乱码的, 但是使用者是Windows系统,他的电脑没有"Numbers表格"工具, ​​ 他用Microsoft Office Excel打开之后出现乱码,如下图…...

Ftrans数据摆渡系统 搭建安全便捷跨网文件传输通道

一、专业数据摆渡系统对企业的意义 专业的数据摆渡系统对企业具有重要意义&#xff0c;主要体现在以下几个方面‌&#xff1a; 1、‌数据安全性‌&#xff1a;数据摆渡系统通过加密传输、访问控制和审计日志等功能&#xff0c;确保数据在传输和存储过程中的安全性。 2、‌高…...

LabVIEW条件配置对话框

条件配置对话框&#xff08;Configure Condition Dialog Box&#xff09; 要求&#xff1a;Base Development System 当右键单击**条件禁用结构&#xff08;Conditional Disable Structure&#xff09;**并选择以下选项时&#xff0c;会显示此对话框&#xff1a; Add Subdiagr…...

【MySQL学习笔记】关于索引

文章目录 【MySQL学习笔记】关于索引1.索引数据结构2.索引存储3.联合索引3.1 联合索引的b树结构3.2 索引覆盖&#xff1f;回表&#xff1f;3.3 联合索引最左匹配原则3.5 索引下推 4.索引失效 【MySQL学习笔记】关于索引 1.索引数据结构 索引是一种能提高查询速度的数据结构。…...

面试经典 150 题——数组/字符串(一)

文章目录 1、合并两个有序数组1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、移除元素2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、删除有序数组中的重复项3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 4、删除有序数组中的重复项 II4.1 题目链接4.2 题…...

Ingress-Nginx Annotations 指南:配置要点全方面解读(下)

文章目录 1.HTTP2 Push Preload2.Server Alias3.Server snippet4.Client Body Buffer Size5.External Authentication6.Global External Authentication7.Rate Limiting8.Global Rate Limiting9.Permanent Redirect10.Permanent Redirect Code11.Temporal Redirect12.SSL Passt…...

Ramfs, rootfs 和 initramfs

什么是ramfs Ramfs 是一个非常简单的文件系统&#xff0c;它将 Linux 的磁盘缓存机制&#xff08;页面缓存和 dentry 缓存&#xff09;导出为可动态调整大小的基于 RAM 的文件系统。 通常&#xff0c;Linux 会将所有文件缓存在内存中。从后备存储&#xff08;通常是文件系统所…...

Xdebug

1、开启xdebug扩展 2、修改一下php.ini文件 xdebug.remote_enable 1 xdebug.remote_autostart 13、vscode安装插件php debug 4、生成launch.json文件&#xff0c;好像啥都不用改 5、vscode没有配置php路径的&#xff0c;需要去配置&#xff1a; 6、发起请求 8、代码断…...

LinkedList类 (链表)

目录 一. LinkedList 基本介绍 二. LinkedList 中的法及其应用 1. 添加元素 (1) add() (2) addAll() (3) addFirst() (4) addLast() 2. 删除元素 (1) remove() (2) removeAll() (3) removeFirst() (4) removeLast() 3. 遍历元素 (1) for 循环遍历 (2) for - each …...

删除拼排序链表中的重复元素(最优解)

题目来源 82. 删除排序链表中的重复元素 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head…...

arm架构 uos操作系统离线安装k8s

目录 操作系统信息 安装文件准备 主机准备 主机配置 配置hosts&#xff08;所有节点&#xff09; 关闭防火墙、selinux、swap、dnsmasq(所有节点) 系统参数设置(所有节点) 配置ipvs功能(所有节点) 安装docker&#xff08;所有节点&#xff09; 卸载老版本 安装docke…...