selenium学习笔记(一)

news2025/2/26 2:21:43

文章目录

  • 前言
  • 一、selenium的简介
    • java使用selenium
    • Python使用selenium
    • 常用的浏览器
    • selenium的功能
  • 二、chromeDriver的安装
    • 查看本机的chrome版本?
    • 匹配对应的chromedriver并下载
    • 在服务器上例如Centos如何安装Chrome
  • 三、selenium内容详解
    • chrome启动
    • chrome启动参数
    • 元素的定位方式
    • 等待机制
      • 三种等待
      • 总结
      • 等待超时处理方法
    • 浏览器及窗口操作
    • 键盘和鼠标操作
      • 键盘事件
      • 鼠标事件
    • 浏览器关闭

前言

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

一、selenium的简介

java使用selenium

  • 需要

    (1)java环境 和 idea;
    (2)引入依赖;
    (3)下载对应的浏览器的webdriver

  • 常用依赖
    <!-- 添加 Selenium WebDriver 依赖 -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.10.0</version>
    </dependency>
    
    <!-- 如果需要使用特定的浏览器引擎,还需添加对应的驱动依赖 -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-chrome-driver</artifactId>
        <version>4.9.0</version>
    </dependency>
    <!-- TestNG测试依赖 -->
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>7.4.0</version>
        <scope>test</scope>
    </dependency>
    

Python使用selenium

  • 需要:

    (1)安装python;(2)安装selenium库;(3)下载对应的浏览器的webdriver

  • 安装方法

    pip install selenium

常用的浏览器

  • Chrome:ChromeDriver下载地址
  • Firefox:GeckoDriver下载地址
  • Edge:Microsoft WebDriver下载地址
  • Internet Explorer:IEDriverServer

    ie浏览器设置方法

selenium的功能

  • (1)主要被用于自动化测试
  • (2)爬虫和数据抓取
  • (3)网站监控

    定期检查网站是否在线,以及页面元素是否按预期显示,可以用来监控网站的健康状态

  • (4)视觉测试:结合图像识别技术,检查网页的视觉元素是否符合设计
  • (5)浏览器兼容性测试
  • (6)性能测试:模拟用户行为来评估网站的性能
  • (7)api测试
  • (8)用户旅程映射
  • (9)自动化报告生成

二、chromeDriver的安装

查看本机的chrome版本?

打开chrome浏览器,地址栏输入"chrome://version/",可以看到版本为:126.0.6478.57
在这里插入图片描述

匹配对应的chromedriver并下载

Selenium 3.0及以上版本中,Firefox浏览器驱动独立了,需要下载和设置浏览器驱动。
对于Chrome,也需要下载对应的ChromeDriver

  • 方法一:访问 谷歌的chromedriver官方下载站 如果没有,可以选择离当前版本最近的次版本

  • 方法二:访问地址 https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json 选择离自己最近的版本号
    在这里插入图片描述

    记住放置的路径,我这里是:D:\Drivers\chromedriver-win64在这里插入图片描述

    在服务器上例如Centos如何安装Chrome

    安装chrome:
    curl https://intoli.com/install-google-chrome.sh | bash

    查看chrome版本:
    google-chrome --version

下载chromedriver同上

三、selenium内容详解

chrome启动

public static void main(String[] args) {
    // 设置系统属性,指定chromeDriver的路径
    System.setProperty("webdriver.chrome.driver","D:\\Drivers\\chromedriver-win64");
    // 创建webdriver对象
    WebDriver driver = new ChromeDriver();
    // 创建chromeOptions对象,可以设置Chrome的启动参数
    ChromeOptions options = new ChromeOptions();
    // 打开百度首页
    driver.get("https://www.baidu.com"); 
}

注:后续不再重复webdriver的设置和创建了,均会以 driver 直接替代

chrome启动参数

前提:ChromeOptions options = new ChromeOptions();

 // 禁用浏览器扩展。
 options.addArguments("--disable-extensions"); 
 // 启用无头模式(不显示浏览器界面)
 options.addArguments("--headless");  
 // 指定浏览器分辨率
 options.addArguments("window-size=1920x3000");    
 // 启动时最大化浏览器窗口
 options.addArguments("start-maximized"); 
 // 禁用GPU硬件加速   
 options.addArguments("--disable-gpu");    
 // 指定用户数据目录,用于自定义Chrome的用户配置文件
 options.addArguments("--user-data-dir");    
 // 禁用弹出窗口拦截器
 options.addArguments("--disable-popup-blocking");    
 // 彻底停用沙箱,这在非桌面环境中运行Chrome时非常有用
 options.addArguments("--no-sandbox");    
 // 禁用网页安全性功能,用于解决跨域问题
 options.addArguments("--disable-web-security");   
 // 忽略SSL证书错误 
 options.addArguments("--ignore-certificate-errors");    
 // 以隐身模式启动浏览器
 options.addArguments("--incognito");   
 // 设置代理服务器地址和端口,例如 --proxy-server=127.0.0.1:8087 
 options.addArguments("--proxy-server");  
 // 设置浏览器窗口的位置
 options.addArguments("--window-position");   
 // 设置浏览器窗口的大小 
 options.addArguments("--window-size");    
 // 禁用JavaScript
 options.addArguments("--disable-javascript"); 
 // 禁用插件   
 options.addArguments("--disable-plugins");   
 // 禁用图像 
 options.addArguments("--disable-images");    

元素的定位方式

!!! 不管哪种方式都应该保证定位要操作的对象是唯一的 !!!

// 使用元素的ID属性来定位元素,这是最快且最准确的方式
driver.findElement(By.id("id值"));
// 使用CSS选择器来定位元素
driver.findElement(By.cssSelector("input[type='submit']"));
//使用元素的class属性来定位元素
driver.findElement(By.className("xxxx"));
//通过元素的标签名来定位元素
driver.findElement(By.tagName("xxxx"));
//通过元素的name属性来定位元素
driver.findElement(By.name("xxxx"));
//通过链接的完整文本内容来定位 <a> 标签元素
driver.findElement(By.linkText("xxxx"));
//通过链接文本的部分内容来定位 <a> 标签元素
driver.findElement(By.partialLinkText("xxxx"));
//通过包含指定文本的class属性来定位元素
driver.findElement(By.classNameContaining("xxxx"));
//通过包含指定文本的标签名来定位元素
driver.findElement(By.tagNameContaining("xxxx"));
//通过包含指定文本的CSS选择器来定位元素
driver.findElement(By.cssSelectorContaining("xxxx"));
//通过包含指定文本的XPath表达式来定位元素
driver.findElement(By.xpathContaining("//input[contains(@class,'partialClass')]"));
//使用XPath表达式来定位多个元素,返回一个元素列表
List<WebElement> elements = driver.findElements(By.xpath("//input"));
//使用XPath表达式来定位元素,XPath是一种在XML文档中查找信息的语言,也适用于HTML
driver.findElement(By.xpath("//input[@type='submit']"));

多说两句:

  • 1、优先使用ID定位;

    ID是元素在HTML中的唯一标识符,使用ID进行定位是最直接、最快速的方式。如果元素有唯一的ID,应该优先使用ID进行定位,因为它的效率最高

  • 2、Selenium官方推荐使用CSS选择器进行元素定位

    因为CSS选择器的效率通常高于XPath,并且语法更加简洁。
    CSS的获取可以用chrome的F12开发者模式中Element-右键-copy-copy selector来获取

  • 3、避免使用xpath的绝对路径

    绝对路径对页面结构要求比较严格,不建议使用绝对路径,因为页面结构的微小变化都可能导致定位失败
    XPATH的获取可以用chrome的F12开发者模式中Element-右键-copy-copy xpath来获取

  • 4、使用逻辑运算符组合定位:使用XPath的逻辑运算符and、or来组合更多元素特征,以提高定位的准确性。
  • 5、避免使用过于通用的选择器:如find_element_by_tag_name,因为这种方法可能会返回多个元素,需要进一步使用下标来定位特定的元素
  • 6、考虑元素的可访问性:选择那些在DOM结构中相对稳定且不太可能变化的元素属性进行定位
  • 7、动态元素的处理:对于动态生成的元素,可以考虑使用显式等待(Explicit Wait),等待元素可见或可操作后再进行定位
  • 8、框架和iframe的处理:当元素位于iframe或不同的框架中时,需要先切换到相应的框架中再进行元素定位。
  • 9、异常处理:在定位元素时,应该添加异常处理逻辑,以便在元素未找到时能够给出清晰的错误信息。

等待机制

三种等待

  • 硬等待【Hard Wait】(也叫强制等待)
    Thread.sleep(3000);  // 硬等待,等待3秒
    
  • 隐式等待【Implicit Wait】:等待页面所有元素
    driver.manage().timeouts().implicitlywait(10,TimeUint.SECONDS); // 设置隐式等待时间为10秒
    
  • 显式等待【Explicit Wait】:可以指定等待页面的某一个元素
    • 显式等待使用WebDriverWait和ExpectedConditions来等待特定的条件发生
    • WebDriverWait接收两个参数:一个WebDriver对象和一个秒数(最大等待时间)。如果在指定的时间内条件没有满足,将会抛出一个TimeoutException异常
    WebDriverWait wait = new WebDriverWait(driver, 10);
    // 显式等待,等待一个元素可见,最多等待10秒
    WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("xxxid值")));
    // 等待元素可点击
    WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("elementId")));
    //等待元素存在
    WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("elementId")));
    //等待页面标题:会等待直到页面的标题完全匹配“预期的标题”
    WebElement element = wait.until(ExpectedConditions.titleIs("预期的标题"));
    

总结

  • 【硬等待】

    如果等待时间是三天,那么强制等待会一直等待直到三天结束;
    通常不推荐使用,因为它会无条件的阻塞进程,效率低;

  • 【隐式等待】

    是等待页面所有的元素加载完成后才执行下面代码,如果加载过程中超过等待时间就会报错

  • 【显示等待】

    显示等待最长等待时间为设置的时间,在期间如果满足等待结束条件(until()方法中)就会结束等待

  • 隐式等待和显示显式等待是常用的等待方式,只能等待可以根据项目需求自定义实现

等待超时处理方法

  • 1、增加等待时间 : 针对页面加载缓慢 或 网络延迟引起的异常

  • 2、优化元素定位: 确保使用的XPath或CSS选择器准确且唯一,避免因定位不当导致的超时

  • 3、使用Try-Catch块来捕获和处理TimeoutException,可以防止脚本因超时而突然失败,并允许执行其他操作或记录错误

  • 4、增加重试机制(代码示例如下)

    for (int i = 0; i < maxAttempts; i++) {
        try {
            element = WebDriverWait(driver, 5).until(ExpectedConditions.presence_of_element_located((By.ID, "elementID")));
            // 执行元素上的操作
            break; // 如果成功,退出循环
        } catch (TimeoutException e) {
            if (i < maxAttempts - 1) {continue; // 如果还有尝试次数,继续重试} 
            else {throw e; // 如果已达最大尝试次数,抛出异常}
        }
    }
    
  • 5、 检查网络连接 : 确保测试环境的网络连接稳定,因为不稳定的网络连接可能会导致WebDriver与网站交互时超时

  • 6、更新Selenium和WebDriver : 保持Selenium和对应的WebDriver更新到最新版本,以确保与浏览器的兼容性

浏览器及窗口操作

包含浏览器的:前进、后退、滚动条操作、最大化、全屏、宽高设置、获取窗口位置和大小、设置窗口位置和大小

driver.navigate().back();           //浏览器后退
driver.navigate().refresh();        //刷新
driver.navigate().forward();        //浏览器前进
//浏览器滚动条操作,此时需要将webDriver强制转换
//executeScript()中是js代码,scrollTop方法是向上滚动多少个像素
((JavascriptExecutor)driver).executeScript("document.documentElement.scrollTop=10000");
//浏览器最大化
driver.manage().window().maximize();        
//浏览器全屏
driver.manage().window().fullscreen();        
//设置浏览器宽高
driver.manage().window().setSize(new Dimension(600,1000));        
// 获取窗口大小:size.getWidth() 、size.getHeight()
Dimension size = driver.manage().window().getSize();  
// 设置窗口大小
driver.manage().window().setSize(new Dimension(800, 600));   
// 获取窗口位置:position.getX()、position.getY()
Point position = webDriver.manage().window().getPosition();  
// 设置窗口位置
driver.manage().window().setPosition(new Point(100, 100));  

键盘和鼠标操作

利用Actions和Keys类来模拟键盘操作,包括文本输入、按键和组合键序列
增强自动化脚本的用户交互能力

键盘事件

  • 单个使用

    1.TAB键:sendKeys(Keys.TAB)
    2. 回车键:sendKeys(Keys.ENTER)
    3.空格键:sendKeys(Keys.SPACE)
    4.回退键:sendKeys(Keys.ESCAPE)

  • 组合使用

    1.全选(Ctrl+A):sendKeys(Keys.CONTROL,‘a’)
    2.复制(Ctrl+C):sendKeys(Keys.CONTROL,‘c’)
    3.剪贴(Ctrl+X):sendKeys(Keys.CONTROL,‘x’)
    4.粘贴(Ctrl+V):sendKeys(Keys.CONTROL,‘v’)

  • 代码示例

    //  打开百度网页
    driver.get("https://www.baidu.com");
    //control+a
    driver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");
    //control+x
    driver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X");
    //control+v
    driver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");
    
    

鼠标事件

通过ActionChains 类实现鼠标执行的操作:
1、contextClick() 单击
2、doubleClick() 双击
3、dragAndDrop() 拖动
4、moveToElement() 移动
5、perform() 右击

不能发送鼠标滚轮操作

//  打开百度网页
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
webDriver.findElement(By.cssSelector("#su")).click();
//找到图片按钮
WebElement webElement = driver.findElement(By.cssSelector("#\\32  > div > div > div > div > div.list-scroll_7E1go > div > div:nth-child(1) > div.avatar-wrapper_622F1 > a:nth-child(1) > div > div._capsule_1e0bo_35.capsule_GwMlS.cu-line-clamp-1"));
//鼠标右击操作
Actions actions = new Actions(driver);
//鼠标移动到图片,右击,执行
actions.moveToElement(webElement).contextClick().perform();

浏览器关闭

可以通过quit()和close()方法关闭浏览器

webDriver.close(); // close关闭当前页面
webDriver.quit();  // quit关闭整个浏览器并且清空缓存

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

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

相关文章

MDS-NPV/NPIV

在存储区域网络&#xff08;SAN&#xff09;中&#xff0c;域ID&#xff08;Domain ID&#xff09;是一个用于区分不同存储区域的关键参数。域ID允许SAN环境中的不同部分独立操作&#xff0c;从而提高效率和安全性。以下是关于域ID的一些关键信息&#xff1a; 域ID的作用&…

一篇文章学会HTML

目录 页面结构 网页基本标签 图像标签 超链接标签 文本链接 图像链接 锚链接 功能链接 列表 有序列表 无序列表 自定义列表 表格 跨列/跨行 表头 媒体元素 视频 音频 网站的嵌套 表单 表单元素 文本框 单选框 多选框 按钮 下拉框 文本域和文件域 表…

畅捷通-条件竞争

反编译dll 逻辑上很清晰了。取得上传数据然后直接写入Templates目录里去&#xff0c;且写入路径直接拼接文件名&#xff0c;说明写入路径可控。然后马上又调用Delete方法删除文件。看起来貌似很正常的样子&#xff0c;但实际上这里已经出现了严重的安全问题。首先是未限制上传…

web三、 window对象,延时器,定时器,时间戳,location对象(地址),本地存储-localStorage,数组去重new Set

一、window对象 window对象 是一个全局对象&#xff0c;也可以说是JavaScript中的 顶级对象 像document、alert()、console.log()这些都是window的属性&#xff0c;基本BOM的属性和方法都是window的 所有通过 var定义 在全局作用域中的 变量 、 函数 都会变成window对象的属…

VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

RK356x-11:在win11的WSL中开发SDK

我拿到的SDK建议开发的系统是Ubuntu22.04&#xff08;在SDK-docs中的文档有说明&#xff09;&#xff0c;因此&#xff0c;WSL中要先安装好它。由于PC机上WSL本身不支持aarch64架构&#xff0c;所以&#xff0c;进行ARM64的RK356X开发&#xff0c;需要手动加入支持。用到的支持…

Java日志框架:log4j、log4j2、logback

文章目录 配置文件相关1. properties测试 2. XMl使用Dom4j解析XML Log4j与Log4j2日志门面 一、Log4j1.1 Logges1.2 Appenders1.3 Layouts1.4 使用1.5 配置文件详解1.5.1 配置根目录1.5.2 配置日志信息输出目的地Appender1.5.3 输出格式设置 二、Log4j22.1 XML配置文件解析2.2 使…

C语言(一)——初识C语言

目录 简单认识一段代码 数据类型 变量和常量 变量的作用域和变量的生命周期 常量 字符串 转义字符 注释 函数 数组 操作符 关键字 结构体 结构的声明 结构成员的类型 结构体变量的初始化 结构体传参 简单认识一段代码 main()函数是程序的入口&#xff0c;所以…

创新领先+效率领先,助力中国九牧加速品牌全球化

2024年&#xff0c;在全球市场经济和国家政策的双重驱动下&#xff0c;中国企业正在加速出海。 从早期粗放式的贴牌代工&#xff0c;到凝聚技术、产品、营销力的自主品牌出海&#xff0c;中国企业在国内市场对国际品牌上演过的追赶-超越戏码&#xff0c;如今正在海外市场上演。…

基于单片机的噪音检测系统(论文+源码)

1整体方案设计 2.2.1功能设计 本课题为噪音分贝仪&#xff0c;在功能上设计如下&#xff1a; 1.可以准确的识别周围环境的噪声大小。 2.检测的噪声大小可以通过液晶进行显示&#xff0c;并直观的给出当前噪声的程度大小&#xff1b; 3.可以通过按键设定报警阈值&#xff0…

十四、从0开始卷出一个新项目之瑞萨RZN2L之栈回溯(Default_Handler/hartfault)

目录 一、概述 二、参考资料 三、代码 四、日志 五、定位函数调用 六、README和工具 一、概述 软件开发中常见的比较棘手的问题就是hartfault/Default_Handler/dump&#xff0c;俗称跑飞了。 参考cmbacktrace&#xff0c;在瑞萨RZN2L/T2M实现栈回溯&#xff0c;串口打印…

OpenAI推出“深思熟虑对齐(Deliberative Alignment)”:为大语言模型建立更可靠的安全与伦理框架

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

GitCode 光引计划投稿 | GoIoT:开源分布式物联网开发平台

GoIoT 是基于Gin 的开源分布式物联网&#xff08;IoT&#xff09;开发平台&#xff0c;用于快速开发&#xff0c;部署物联设备接入项目&#xff0c;是一套涵盖数据生产、数据使用和数据展示的解决方案。 GoIoT 开发平台&#xff0c;它是一个企业级物联网平台解决方案&#xff…

【鸿蒙(HarmonyOS)性能优化指南】启动分析工具Launch Profiler

Launch Profiler概述 DevEco Studio内置Profiler分析调优工具。其中Launch主要用于分析应用或服务的启动耗时&#xff0c;分析启动周期各阶段的耗时情况、核心线程的运行情况等&#xff0c;协助开发者识别启动缓慢的原因。此外&#xff0c;Launch任务窗口还集成了Time、CPU、F…

微博用户消费趋势报告,多个领域增速明显,年轻一代成消费主力军

文 | 魏力 发布 | 大力财经 站在岁末回首这一年&#xff0c;在信息浪潮的汹涌翻涌之下&#xff0c;社交媒体平台犹如社会经济的晴雨表&#xff0c;精准地折射出大众生活与消费的万千景象。近日&#xff0c;大力财经看到一份报告&#xff0c;微博发布了《2024微博用户消费趋势…

智能公文写作一体机,开箱即用快速部署超便捷

在繁忙的政企事业单位中&#xff0c;时间就是生产力。公文撰写作为各类组织日常工作的核心环节&#xff0c;却常常因为传统的公文处理流程繁琐耗时而成为效率的瓶颈。如何打破这一瓶颈&#xff0c;实现高效的公文撰写&#xff0c;成为了众多单位关注的焦点。 一款即开即用的公文…

重温设计模式--中介者模式

中介者模式介绍 定义&#xff1a;中介者模式是一种行为设计模式&#xff0c;它通过引入一个中介者对象来封装一系列对象之间的交互。中介者使得各个对象之间不需要显式地相互引用&#xff0c;从而降低了它们之间的耦合度&#xff0c;并且可以更方便地对它们的交互进行管理和协调…

无人机双目视觉鲁棒定位方法!

无人机双目视觉鲁棒定位方法是一种先进的定位技术&#xff0c;它利用两个摄像头&#xff08;即双目相机&#xff09;模拟人的视觉系统&#xff0c;通过视差来确定物体的位置。这种方法在无人机定位领域具有广泛的应用前景&#xff0c;特别是在GPS信号拒止或弱纹理环境中&#x…

【R语言遥感技术】“R+遥感”的水环境综合评价方法

R语言在遥感领域中是一个强大的工具&#xff0c;它提供了一系列的功能和优势&#xff0c;使得遥感数据的分析和应用更加高效和灵活。以下是R语言在遥感中的具体应用&#xff1a; 数据处理&#xff1a;R语言可以处理和清洗遥感数据&#xff0c;包括数据转换、滤波处理、去噪和数…

vue预览和下载 pdf、ppt、word、excel文档,文件类型为链接或者base64格式或者文件流,

** 方法1&#xff1a;word、xls、ppt、pdf 这些文件&#xff0c; 如果预览的文件是链接可以直接打开&#xff0c;可用微软官方的预览地址 ** <iframe width"100%" :src"textVisibleURl " id"myFramePPT" style"border: none;backgroun…