selenium学习笔记(一)

文章目录

前言

1、该文是为了做个笔记,在需要的时候可以方便查找,侵权可删

2、文中的代码均为java

3、selenium学习笔记(二)

一、selenium的简介

java使用selenium

  • 需要 (1)java环境 和 idea;

    (2)引入依赖;

    (3)下载对应的浏览器的webdriver

  • 常用依赖

    xml 复制代码
    <!-- 添加 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

常用的浏览器

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同上

三、selenium内容详解

chrome启动

java 复制代码
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();

java 复制代码
 // 禁用浏览器扩展。
 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");    

元素的定位方式

!!!

java 复制代码
// 使用元素的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】(也叫强制等待)

    java 复制代码
    Thread.sleep(3000);  // 硬等待,等待3秒
  • 隐式等待【Implicit Wait】:等待页面所有元素

    java 复制代码
    driver.manage().timeouts().implicitlywait(10,TimeUint.SECONDS); // 设置隐式等待时间为10秒
  • 显式等待【Explicit Wait】:可以指定等待页面的某一个元素

    • 显式等待使用WebDriverWait和ExpectedConditions来等待特定的条件发生
    • WebDriverWait接收两个参数:一个WebDriver对象和一个秒数(最大等待时间)。如果在指定的时间内条件没有满足,将会抛出一个TimeoutException异常
    java 复制代码
    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、增加重试机制(代码示例如下)

    java 复制代码
    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更新到最新版本,以确保与浏览器的兼容性

浏览器及窗口操作

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

java 复制代码
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)

    1. 回车键: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')

  • 代码示例

    java 复制代码
    //  打开百度网页
    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() 右击
不能发送鼠标滚轮操作

java 复制代码
//  打开百度网页
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()方法关闭浏览器

java 复制代码
webDriver.close(); // close关闭当前页面
webDriver.quit();  // quit关闭整个浏览器并且清空缓存
相关推荐
知识分享小能手2 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
汇能感知4 小时前
摄像头模块在运动相机中的特殊应用
经验分享·笔记·科技
阿巴Jun4 小时前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
茯苓gao4 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾4 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT5 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
aaaweiaaaaaa5 小时前
HTML和CSS学习
前端·css·学习·html
ST.J5 小时前
前端笔记2025
前端·javascript·css·vue.js·笔记
Suckerbin6 小时前
LAMPSecurity: CTF5靶场渗透
笔记·安全·web安全·网络安全
看海天一色听风起雨落6 小时前
Python学习之装饰器
开发语言·python·学习