selenium学习笔记(一)

文章目录

  • 前言
  • 一、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关闭整个浏览器并且清空缓存

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何利用Java爬虫按关键字搜索苏宁易购商品

在信息技术飞速发展的今天&#xff0c;数据的获取和分析对于企业决策、市场研究和用户行为分析至关重要。本文将介绍如何使用Java编写爬虫程序&#xff0c;通过关键字搜索苏宁易购的商品&#xff0c;并获取搜索结果。 1. 爬虫简介 爬虫是一种自动化程序&#xff0c;用于从互联…

网页生成鸿蒙App

如何网页生成鸿蒙App 纯鸿蒙发布后&#xff0c;鸿蒙App需求上升。如何快速生成鸿蒙App。变色龙云(http://www.appbsl.cn)推出了鸿蒙App打包服务。可以在线自动打包鸿蒙App。 第一步 创建应用 输入网站网址&#xff0c;上传图标。 第二步 生成鸿蒙证书 打开华为开发者管理中…

【Linux进程】进程间通信(共享内存、消息队列、信号量)

目录 前言 1. System V IPC 2. 共享内存 系统调用接口 shmget ftok shmat shmdt shmctl 共享内存的读写 共享内存的描述对象 3. 消息队列 msgget msgsnd msgctl 消息队列描述对象 4. 信号量 系统调用接口 semget semctl 信号量描述对象 5. 系统层面IPC资源 6.…

endnote插参考文献【毕业论文设置】

一、GBT7714下载 https://endnote.com/downloads/styles/ 二、最新过滤器下载 Import filters - EndNote 三、设置修改 Conference Proceedings Author. Title[C]//Conference Name|. Conference Location|: Publisher|, Year of Conference|: Pages|. Thesis Author. Ti…

Temu怎么入驻:全面解析入驻流程

Temu是拼多多旗下的跨境电商平台&#xff0c;随着海外市场的不断拓展&#xff0c;该平台也吸引了许多商家的关注。一些新手商家想要入驻Temu来销售自己的产品。那Temu怎么入驻&#xff1f;下面将带来详细的入驻流程。 一、Temu入驻流程 1、注册Temu账户 首先&#xff0c;登录…

aioice里面candidate固定UDP端口测试

环境&#xff1a; aioice0.9.0 问题描述&#xff1a; aioice里面candidate固定UDP端口测试 解决方案&#xff1a; /miniconda3/envs/nerfstream/lib/python3.10/site-packages/aioice import hashlib import ipaddress import random from typing import Optional import…

【电商搜索】文档的信息论生成聚类

【电商搜索】文档的信息论生成聚类 目录 文章目录 【电商搜索】文档的信息论生成聚类目录文章信息概览研究背景技术挑战如何破局技术应用主要相关工作与参考文献后续优化方向 后记 文章信息 https://arxiv.org/pdf/2412.13534 概览 本文提出了一种基于信息论的生成聚类&#…

车载网关性能 --- GW ECU报文(message)处理机制的技术解析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…

FPGA(一)verilog语句基础

Verilog 是一种硬件描述语言&#xff08;HDL&#xff09;&#xff0c;常用于数字电路的设计、模拟和验证&#xff0c;特别是用于 FPGA 和 ASIC 的设计。Verilog 让设计者能够描述和模拟硬件系统的行为和结构&#xff0c;最终将其转化为硬件电路。 一、模块结构 Verilog 中的设计…

故障诊断 | 信号降噪算法合集

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 基于FFT CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客 基于FFT CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客 P…

easegen将教材批量生成可控ppt课件方案设计

之前客户提出过一个需求&#xff0c;就是希望可以将一本教材&#xff0c;快速的转换为教学ppt&#xff0c;虽然通过人工程序脚本的方式&#xff0c;已经实现了该功能&#xff0c;但是因为没有做到通用&#xff0c;每次都需要修改脚本&#xff0c;无法让客户自行完成所有流程&am…

AI,cursor快速上手思维导图

https://cursor101.com/zh/tutorial/learn-cursor-tab

Echarts实现大屏可视化

一、效果展示 二、简介 该项目涉及到的图表有&#xff1a; 渐变堆叠面积图中国地图涟漪特效散点图饼图横向柱状图竖向柱状图圆环饼图 该项目主要展示的是使用Echarts制作的大屏可视化&#xff0c;所用到的技术有&#xff1a; 2.1 前端&#xff1a; vue3、vite、echarts、pi…

ECharts关系图-关系图11,附视频讲解与代码下载

引言&#xff1a; 关系图&#xff08;或称网络图、关系网络图&#xff09;在数据可视化中扮演着至关重要的角色。它们通过节点&#xff08;代表实体&#xff0c;如人、物体、概念等&#xff09;和边&#xff08;代表实体之间的关系或连接&#xff09;的形式&#xff0c;直观地…

javaEE--计算机是如何工作的-1

目录 一.计算机的组成: 各组件的功能: 衡量cpu好坏的标准: 二.指令(instruction) 三.操作系统Operating System 四.进程/任务process/tesk 五.进程在系统中如何管理 1.进程在系统中的管理,从两个角度来分类: 2.进程控制块PCB&#xff08;Process Control Block)) 3.P…

目标检测-R-CNN

R-CNN在2014年被提出&#xff0c;算法流程可以概括如下&#xff1a; 候选区域生成&#xff1a;利用选择性搜索(selective search)方法找出图片中可能存在目标的候选区域(region proposal) CNN网络提取特征&#xff1a;对候选区域进行特征提取(可以使用AlexNet、VGG等网络) 目…

Blender 中投影仪的配置与使用

Blender 中投影仪的配置与使用 Blenderdownloadbasic Projectordownloadinstallconfigure 利用Blender中的投影仪搭建一个简单的结构光仿真系统&#xff0c;通过调整被测对象的材质和投影仪位姿以及投影来获得不同的渲染图像。 Blender download 在官网中下载相应安装包&…

MYSQL慢查询日志(开启慢查询配置、explain执行计划SQL优化、各个字段详解、索引失效)

大家好&#xff0c;我是此林。 今天来分享一下MYSQL慢查询日志记录。 目录 1. 定义 2. 开启慢查询 方法一&#xff1a;命令行 方法二&#xff1a;修改配置文件 3. explain性能分析 4. 索引失效 1. 最左前缀法则 2. 对字段做运算、字段类型不匹配 3. 模糊匹配 4. OR…

Leetcode打卡:考场就坐

执行结果&#xff1a;通过 题目&#xff1a; 855 考场就坐 在考场里&#xff0c;有 n 个座位排成一行&#xff0c;编号为 0 到 n - 1。 当学生进入考场后&#xff0c;他必须坐在离最近的人最远的座位上。如果有多个这样的座位&#xff0c;他会坐在编号最小的座位上。(另外&am…

2024.2 ACM Explainability for Large Language Models: A Survey

Explainability for Large Language Models: A Survey | ACM Transactions on Intelligent Systems and Technology 问题 可解释性问题&#xff1a;大语言模型&#xff08;LLMs&#xff09;内部机制不透明&#xff0c;难以理解其决策过程&#xff0c;如在自然语言处理任务中&…