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关闭整个浏览器并且清空缓存
相关推荐
eybk3 小时前
Pytorch+Mumu模拟器+萤石摄像头实现对小孩学习的监控
学习
6.943 小时前
Scala学习记录 递归调用 练习
开发语言·学习·scala
Aileen_0v03 小时前
【AI驱动的数据结构:包装类的艺术与科学】
linux·数据结构·人工智能·笔记·网络协议·tcp/ip·whisper
守护者1704 小时前
JAVA学习-练习试用Java实现“使用Arrays.toString方法将数组转换为字符串并打印出来”
java·学习
学会沉淀。4 小时前
Docker学习
java·开发语言·学习
Rinai_R5 小时前
计算机组成原理的学习笔记(7)-- 存储器·其二 容量扩展/多模块存储系统/外存/Cache/虚拟存储器
笔记·物联网·学习
吃着火锅x唱着歌5 小时前
PHP7内核剖析 学习笔记 第四章 内存管理(1)
android·笔记·学习
ragnwang5 小时前
C++ Eigen常见的高级用法 [学习笔记]
c++·笔记·学习
一条测试老狗5 小时前
【UI自动化】从WebDriver看Selenium与Appium的底层关联
selenium·appium·自动化
胡西风_foxww5 小时前
【es6复习笔记】rest参数(7)
前端·笔记·es6·参数·rest