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

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

http://www.kler.cn/a/450145.html

相关文章:

  • 动态规划<四> 回文串问题(含对应LeetcodeOJ题)
  • 【JetPack】Navigation知识点总结
  • 信号仿真高级工程师面试题
  • 数据结构---------二叉树前序遍历中序遍历后序遍历
  • 【已解决】黑马点评项目Redis版本替换过程中误删数据库后前端显示出现的问题
  • 重温设计模式--组合模式
  • 软件测试之非功能测试设计
  • 自然语言编写的prompt为啥比不上编程语言prompt高效?
  • LeetCode 209. 长度最小的子数组 (C++实现)
  • 编译libtorch时报错:NvToolsExt Could not open input file ***nvToolsExt64_1.lib
  • javaScript中slice()和splice()的用法与区别
  • 重温设计模式--职责链模式
  • Android基于Path的addRoundRect,Canvas剪切clipPath简洁的圆角矩形实现,Kotlin(1)
  • CS!GO
  • 灰度测试是什么
  • 【NLP 17、NLP的基础——分词】
  • 用套接字的UDP,TCP知道什么是HTTP吗?
  • Apache解析漏洞(apache_parsing_vulnerability靶场攻略CVE-2017-15715靶场攻略)
  • 服务平滑发布与线上验证
  • CNN、RNN、LSTM和Transformer之间的区别和联系
  • 安装CPU版的torch(清华源)
  • 经典案例PPT | 大型水果连锁集团新零售数字化建设方案
  • Ubuntu下C语言操作kafka示例
  • 基于GRU门控循环神经网络的多分类预测【MATLAB】
  • npm error code ETIMEDOUT
  • 【Prometheus】【实战篇(七)】在 Grafana 中配置数据源并使用 Prometheus Node Exporter