Selenium java自动化

news2024/10/6 10:39:15

文章目录

    • 1. Selenium的安装
    • 2. 了解自动化和selenium
      • 2.1 什么是自动化以及为什么要做
      • 2.2为什么选择selenium作为我们的文本自动化工具
      • 2.3 环境部署
      • 2.4什么驱动,驱动的工作原理。
      • 2.5一个简单的自动化演示
    • 3. 掌握selenium的基础语法
      • 3.1)元素的定位
      • 3.2) 元素的操作
      • 3.3)等待
      • 3.4) 信息的打印
      • 3.5) 窗口切换
      • 3.6) 窗口大小的设置
      • 3.7) 执行JavaScript代码
      • 3.8 导航栏
      • 3.9 弹窗
      • 3.10 鼠标 键盘 操作
      • 3.11 选择框
      • 3.12 上传文件

1. Selenium的安装

2. 了解自动化和selenium

2.1 什么是自动化以及为什么要做

自动化测试能够代替一部分的手工测试。自动化测试能够提高测试效率。
随着功能的增加,版本越来越多,版本回归的压力也越来越大,所以仅仅通过人工测试来回归所有的版本肯定是不现实的,所以我们需要借助自动化来进行回归

2.2为什么选择selenium作为我们的文本自动化工具

选择它肯定是有原因的.

  • 1开源免费
    1. 支持多浏览器。如Chrome、Firefox、IE、edge、Safari…
  • 3)支持多系统。如Linux、Windows、MacOS
  • 4)支持多语言。如java、python…
    1. selenium包底层有很多可使用的API

2.3 环境部署

  • selenium工具包
  • Chrome浏览器
  • Chromedriver谷歌驱动
  • java版本最低要求8

2.4什么驱动,驱动的工作原理。

汽车有驱动,两轮驱动、四轮驱动 可以让汽车跑起来计算机里也有驱动程序,可以驱动计算机和设备工作起来打开浏览器也需要驱动。
人工测试情况下(人工手动的驱动打开浏览器)自动化来说 ,代码不能够直接打开浏览器,需要借助驱动程序来协助打开浏览器。
代码可以驱使驱动来打开浏览器。
selenium 驱动 浏览器三者之间的关系,如下图:

在这里插入图片描述
如下图,浏览器驱动本质上是一个服务器

在这里插入图片描述

2.5一个简单的自动化演示

需求:打开百度搜索"scdn"提交

    // 
    public void dilireba() throws InterruptedException {
        Thread.sleep(3000);
        driver.get("https://www.baidu.com");
        driver.findElement(By.cssSelector("#kw")).sendKeys("csdn");
        Thread.sleep(3000);
        driver.findElement(By.cssSelector("#su")).submit();
        //driver.findElement(By.cssSelector("#su")).click();
    }

3. 掌握selenium的基础语法

3.1)元素的定位

    // 需求: 测试定位元素的 方式
    public void findElement()
    {
        // 方式一:
        // 定位元素并打印文本信息
        String xpath = driver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[1]/a/span[2]")).getText();
        System.out.println(xpath);

        // 方式二:
        String css = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")).getText();
        System.out.println(css);

    }

3.2) 元素的操作

    // 元素的操作
    // 点击:click
    // 提交:submit
    // 模拟按键输入:send_keys
    // 清楚对象输入的文本内容 : clear()
    // 获取文本: gettext
    // 获取元素属性: getAttribute() 
    public void sendkeys_test() throws InterruptedException {

        driver.findElement(By.cssSelector("#kw")).sendKeys("" +
                "今天天气好啊");
        driver.findElement(By.cssSelector("#kw")).click();
        Thread.sleep(3000);
        driver.findElement(By.cssSelector("#kw")).clear();
        Thread.sleep(3000);
        driver.findElement(By.cssSelector("#kw")).sendKeys("" +
                "明天天气也会好的");
        Thread.sleep(2000);
    }

3.3)等待

    // 需求: 代码的执行速度比较快,而前端页面渲染的速度相比慢一点,可能导致的结果是: 代码已经提交执行到下一步了,页面还没渲染出来,元素找不到.
    // 等待元素被渲染的三种方式:
    // 1. 强制等待
    //           让程序多等一会, 优点:语法简单 缺点:固定时间,测试时间较长.
    // 2. 隐式等待
    //           在规定的时间内,轮询等待元素出现之后就立即执行下一步,如果在规定时间内未能完成等待,则会抛出一个 NoSuchElemenExcetion 异常.
    //           优点: 节省了大量测试时间,执行效率高.  缺点: 需要等待所有的元素都展开才会执行下一步,仍然会有时间消耗.
    // 3. 显示等待
    //            强制等待可以针对某一个元素来进行测试.
    //            优点: 针对一个元素来进行等待,极大降低自动化测试时间.
    //            缺点: 写法较为复杂.
    public void wait_test() throws InterruptedException {
        // 1. 强制等待
        Thread.sleep(3000);
        // 2. 隐式等待
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        // 3. 显示等待
        WebDriverWait foo = new WebDriverWait(driver,Duration.ofSeconds(3));
        foo.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#su")));
    }

3.4) 信息的打印

    public void getContent_test()
    {
        String title = driver.getTitle();
        System.out.println(title);
        String url = driver.getCurrentUrl();
        System.out.println(url);
    }

3.5) 窗口切换

     public void windows_test() throws InterruptedException {
         System.out.println("----第一个窗口------");
         String curWinHandle = driver.getWindowHandle();
         System.out.println(curWinHandle);
         String title = driver.getTitle();
         System.out.println(title);
         String url = driver.getCurrentUrl();
         System.out.println(url);
         System.out.println("----第二个窗口------");
         // 1.跳转到一个页面
         driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")).click();
         Thread.sleep(3000);
         // 2.driver不会自动切换,需要我们切换窗口
         //  句柄是一个String类型, 获取句柄
         Set<String> windows = driver.getWindowHandles();
         String window = "";
         for(String win : windows)
         {
             System.out.println(win);
             if(win != curWinHandle)
             {
                 window=win;
             }
         }
         driver.switchTo().window(window);
          curWinHandle = driver.getWindowHandle();
         System.out.println(curWinHandle);
          title = driver.getTitle();
         System.out.println(title);
          url = driver.getCurrentUrl();
         System.out.println(url);
     }

3.6) 窗口大小的设置

    public void windowSize_test()
    {
        driver.manage().window().maximize();
        driver.manage().window().minimize();
        driver.manage().window().setSize(new Dimension(800,100));
    }


3.7) 执行JavaScript代码

    public void executeScript_test()
    {
        driver.executeScript("alert(\"hellow world\")");
    }

3.8 导航栏

selenium里提供了navigate接口来实现页面的导航

    public void navigate_test() throws InterruptedException {
        WebElement webEle = driver.findElement(By.cssSelector("#nav > div > div > ul > li:nth-child(1) > a"));
        webEle.click();
        Thread.sleep(3000);
        // 后退
        driver.navigate().back();
        Thread.sleep(3000);
        // 前进
        driver.navigate().forward();
        Thread.sleep(3000);
        
    }

注意: driver 的窗口并没有切换.

在这里插入图片描述

3.9 弹窗

    // 用于不能定位到元素时使用
    public void alert_test()
    {
        Alert alert = driver.switchTo().alert(); // 切换到提示弹窗
        alert.sendKeys("are you ok");// 输入
        alert.accept(); // 接收
        alert.dismiss();// 取消
    }

3.10 鼠标 键盘 操作

唯一区别就是,能够看到鼠标在移动,有时候没反应的,需要perform()执行一下才有效果.

    public void mouseKeysboard_test() throws InterruptedException {
        WebElement ele = driver.findElement(By.cssSelector("#xxx"));
        Actions actions = new Actions(driver);
        actions.clickAndHold(ele).perform();
        Thread.sleep(3000);
        
        ele.sendKeys("hhhhhh");
    }

3.11 选择框

在这里插入图片描述

    public void select_test() throws InterruptedException {
        WebElement ele = driver.findElement(By.cssSelector("#ShippingMethod"));
        Select select = new Select(ele);
        select.selectByIndex(1); // 通过下标选择
        Thread.sleep(3000);
        select.selectByValue("10.69"); // 通过元素属性 value来选择
        Thread.sleep(3000);
        select.selectByVisibleText("UPS 2nd Day Air ==> $9.03");
        Thread.sleep(3000);
    }

3.12 上传文件

    public void fileUpload_test() throws InterruptedException {
        WebElement ele = driver.findElement(By.cssSelector("#选择上传文件"));
        ele.sendKeys("本地文件地址");
        Thread.sleep(3000);
    }

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

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

相关文章

Java解析String类的使用及String a = b + “c“面试题

1.概述 String:字符串&#xff0c;使用一对""引起来表示。 1.String声明为final的&#xff0c;不可被继承 2.String实现了Serializable接口&#xff1a;表示字符串是支持序列化的。 实现了Comparable接口&#xff1a;表示String可以比较大小 3.String内部定义了fina…

作用域问题

全局作用域 作用范围:在全局能够访问到的全局变量 代码实例: var num 10;function fn1() {console.log(num, "全局作用域");}fn1() 打印的结果: 函数作用域 作用范围:只在函数里面能够进行访问 代码实例: function fn1() {var num 10;}console.log(num); …

【Mysql】Explain详解与实践

演示所用user表在上一节有表结构和数据 【Mysql索引数据结构与算法】 脑图链接 一、EXPLAIN简介 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。 作用 通过EXPLAIN&#xff0…

Ubunt20.04 安装 Gramine

文章目录 参考资料Gramine安装运行helloworld升级kernel到5.15 参考资料 Gramine Quick start Gramine安装 Gramine安装要求&#xff1a; Linux 内核版本至少为 5.11&#xff08;启用 SGX 驱动程序&#xff09; 如果是5.4.0-150-generic版本&#xff0c;则可以参考《Install …

神秘的临时对象

下面的程序输出什么&#xff1f;为什么&#xff1f; 程序意图&#xff1a; 在 Test() 中以 0 作为参数调用 Test(int i) 将成员变量 mi 的初始值设置为 0 运行结果&#xff1a; 成员变量 mi 的值为随机值 构造函数是一个特殊的函数 是否可以直接调用&#xff1f; 是否可以…

濮阳社工百站千室暖万家 | “品味端午,传承文明”儿童活动

端午节是我国传统的民俗节日&#xff0c;也是中华民族的重要节日之一&#xff0c;为了让幼儿了解和感受这一节日的文化内涵&#xff0c;让孩子们在愉快的氛围中感受中华传统文化的魅力。2023年6月20日&#xff0c;范县城关镇社工站于范县未来双语幼儿园开展了“品味端午&#x…

哪些方法可以帮助你更有效地管理时间和提高工作效率?

如何更有效地管理时间和提高工作效率&#xff1f; 在现代社会&#xff0c;时间是最宝贵的资源之一。每个人都希望能够更好地管理时间&#xff0c;提高工作效率&#xff0c;从而更好地完成工作和生活。以下是一些方法&#xff0c;可以帮助您更有效地管理时间和提高工作效率。 …

H3C IRF基本内容概述

IRF IRF&#xff1a;Intelligent Resilient Framework&#xff0c;即智能弹性架构&#xff0c;是H3C专有的设备虚拟化技术&#xff0c;将实际物理设备虚拟化为逻辑设备供用户使用。 核心思想&#xff1a;将多台设备通过IRF物理端口连接在一起&#xff0c;进行必要的配置后&am…

Android 实现在图片上画标注框

之前是用glide加载然后在图片上画标注框是有问题的所以换了另外一种方式 思路&#xff1a;1.先把网络图片下载到本地之后画标注框 最后再压缩图片 及展示 上代码&#xff1a; 下载图片&#xff1a; public class NetWorkUtils {public static InputStream getImageInputStr…

LeetCode - #84 柱状图中最大的矩形(Top 100)

文章目录 前言1. 描述2. 示例3. 答案题解 1题解 2 关于我们 前言 本题为 LeetCode 前 100 高频题 本题由于没有合适答案为以往遗留问题&#xff0c;最近有时间将以往遗留问题一一完善。 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&am…

机器学习(三)线性回归原理

上述考虑的问题&#xff0c;我们会得到一个式子&#xff0c;即&#xff1a;Yθ1X1θ2X2。但该线性公式没办法拟合所有的数据点&#xff0c;如下图。 这里“θ0”作为偏置项&#xff0c;在二维平面里&#xff0c;即为截距。因此&#xff0c;上述公式“Yθ1X1θ2X2”即可修改为“…

深入源码解析 ReentrantLock、AQS:掌握 Java 并发编程关键技术

前言Lock重入锁synchronizedReentrantLock ReentrantReadWriteLock 读写锁ReentrantLock 实现原理AQSAQS 内部实现Node 内部结构Node 变更过程添加节点释放节点 ReentrantLock 类源码分析时序图锁竞争核心方法NonfairSync#lockAQS#acquireReentrantLock.NonfairSync#tryAcquire…

js的 Babel原理

简介 babel是一个JavaScript编译器,可以将ES2015 转换为向后兼容的JavaScript代码, Babel的原理是将JavaScript代码分为三个阶段: 解析, 转换和输出 1. 解析阶段 Babel首先会使用 Babylon 解析器将输出的 ES2015diamagnetic解析成抽象语法树(AST), 抽象语法树是 一种JSON形式…

端午节,不能只知道吃吃吃.....玩玩玩......

系列文章目录 作者&#xff1a;i阿极 作者简介&#xff1a;数据分析领域优质创作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1;评论&#x1f4d2;…

FWI 地震数据的认识

目录 1、数据来源。 1&#xff09;SEG 系列。 2&#xff09;OpenFWI 系列。 2、数据量&#xff0c;尺寸。 1&#xff09; SEG 包含两个数据集&#xff1a;SEGSaltData 和 SimulateData。 2&#xff09;OpenFWI 包含12个数据集&#xff1a; 3、地震数据对应的观测系统。…

Redis原理 - IO详解

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis原理 - IO详解 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-IO.html 用户空间与内核空间 任何Linux 系统的发行版&#xff0c;其系统内核都是 Linux 。我们的应用都需要通过 Linux 内核与硬…

02py游戏开发基础

版本 pygame 2.4.0 (SDL 2.26.4, Python 3.8.2) Hello from the pygame community. https://www.pygame.org/contribute.html Python开发基础 Pygame常用模块 background_image_filename "bg.jpg"#设置图像文件名称 mouse_image_filename "ship.bmp"# 将…

JVM优化00

JVM优化 0.目标 了解下我们为什么要学习JVM优化掌握jvm的运行参数以及参数的设置掌握jvm的内存模型&#xff08;堆内存&#xff09;掌握jmap命令的使用以及通过MAT工具进行分析掌握定位分析内存溢出的方法掌握jstack命令的使用掌握VisualJVM工具的使用 1.为什么学习JVM优化 …

LeetCode - #82 删除排序链表中的重复元素 II

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

异常的介绍与处理

目录 第七章 异常 1.异常 2.处理方法 2.1.try-catch 2.2.多重catch块 2.3.finally 2.4.throw 与 throws 2.5.程序分析 3.自定义异常 内容仅供学习交流&#xff0c;如有问题请留言或私信&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 有空您就点点赞…