自动化和Selenium

news2024/9/27 12:16:53

作者:~小明学编程  

文章专栏:测试开发

格言:热爱编程的,终将被编程所厚爱。
在这里插入图片描述

目录

什么是自动化,我们为什么需要自动化的测试?

为什么选择selenium来作为我们的web自动化测试的工具?

定位元素

使用cssSelector定位

使用Xpath定位

操作元素

点击

模拟按键输入

清空输入框

获取文本

等待

操作界面

打印操作

窗口

窗口的切换

窗口的大小设置

浏览器的前进和后退

关闭弹窗

鼠标操作

键盘操作

上传文件

屏幕截图


什么是自动化,我们为什么需要自动化的测试?

自动化就是让程序代替手来帮助我们去测试一部分的功能,随着我们软件功能的增加,版本越来越大,版本回归的压力也越来越大,想要都通过手来测试是不现实的这个时候就需要我们借助自动化测试来帮助我们完成一部分的测试。

为什么选择selenium来作为我们的web自动化测试的工具?

  1. 首先selenium是免费开源的。
  2. 支持多浏览器例如,chrome,firefox,edge,ie等。
  3. 支持多系统例如:Linux,windows,macos等。
  4. 支持多语言,例如java,python等。
  5. selenium提供了很多可使用的API。

定位元素

使用cssSelector定位

public class FirstAuto {
    public void test() throws InterruptedException {
        //创建一个驱动对象来打开浏览器
        ChromeDriver chromeDriver = new ChromeDriver();
        Thread.sleep(3000);
        //输入百度的网址
        chromeDriver.get("https://www.baidu.com");
        Thread.sleep(3000);
        //找到百度输入框,并且输入关键字周杰伦
        chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("周杰伦");
        Thread.sleep(3000);
        //找到百度按钮并且点击
        chromeDriver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(3000);
        //释放驱动对象并且关闭浏览器
        chromeDriver.quit();

    }
}

 方法很简单主要就是我们找到css所对应的标签,然后点击标签就行了。

    ChromeDriver driver = new ChromeDriver();
    public void test1() throws InterruptedException {
        driver.get("https://www.baidu.com");
        Thread.sleep(3000);
        //定位标签,并打印标签内容
        String str = driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).getText();
        System.out.println(str);
        close();

    }
    //关闭驱动
    public void close() {
        driver.quit();
    }

使用Xpath定位

    public void xpathTest() throws InterruptedException {
        driver.get("https://www.baidu.com");
        Thread.sleep(3000);
        driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("周杰伦");
        Thread.sleep(3000);
    }

我们需要注意的是当我们定位文本的时候要保证我们定位的路径是唯一的。

操作元素

点击

常规操作包括文本清除、文本输入、单击元素、提交表单、获取元素值等:

public void test1() throws InterruptedException {
    ChromeDriver driver = new ChromeDriver();
    //进入百度网站
    driver.get("https://www.baidu.com");
    //定位输入框,并且输入火锅
    driver.findElement(By.id("kw")).sendKeys("火锅");
    Thread.sleep(2000);
    //定位到 ‘百度一下’ 并单击
    driver.findElement(By.id("su")).click();
    Thread.sleep(3000);
    //定位到 火锅 贴吧
    driver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-tieba_3gnzZ.s-tab-tieba")).click();
    //获取文本
    String text = driver.findElement(By.cssSelector("#pagelet_frs-header\\/pagelet\\/head > div > div.head_content > div.card_top_wrap.clearfix.card_top_theme > div.card_top.clearfix > p")).getText();
    System.out.println(text);
    //隐式等待,等待超过三秒就抛出异常
    driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
    //清除输入框
    driver.findElement(By.id("wd1")).clear();
    Thread.sleep(3000);
    driver.quit();
}

关于点击事件我们要注意一下,当我们百度的时候我们定位到元素然后会使用click()来点击同时我们也可以用submit()的方法来提交,但是我们的click()方法比较万能直接就可以点击我们指定的位置,而submit则不行没有输入框的时候不能submit。

模拟按键输入

        driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("周杰伦");

就像我们上面的这段语句,sendKeys方法可以模拟我们用户的按键输入。

清空输入框

我们的clear()方法可以将我们定位到的输入框里面的东西清理完毕。

    public void test2() throws InterruptedException {
        driver.findElement(By.cssSelector("#kw")).sendKeys("周杰伦");
        Thread.sleep(3000);
        driver.findElement(By.cssSelector("#kw")).clear();

    }

获取文本

getText()方法用于获取到我们定位的位置的文本。

        String str = driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).getText();

我们在自动化测试的时候我们不知道我们的这块文本正不正确所以有时候我们需要对齐进行一个打印。

注意:我们这里获取的是文本值当我们想要获取属性值的时候要用getAttribute()来进行获取。

等待

先看一段程序:

    public void waitTest() throws InterruptedException {
        driver.findElement(By.cssSelector("#kw")).sendKeys("周杰伦");
        driver.findElement(By.cssSelector("#su")).click();
//        Thread.sleep(3000);
        driver.findElement(By.cssSelector("#\\34  > div > div:nth-child(1) > h3"));
    }

这里直接给我们报错了,然后下面我们把sleep()给放开。

 报错奇迹般的就没了,这是因为我们刚刚没有让我们的线程暂停的时候我们的程序执行的速度非常的快,我们的下一个界面还没有渲染好呢我们就开始定位元素了,所以最后没有点位到我们指定的元素导致最后就报错了,在我们给加上一个线程休眠之后我们的前端页面就渲染好了。

但是这样的方式会浪费很多的时间,我们的下面的这种方式会更好。

隐式等待:

    public void waitTest() throws InterruptedException {
        driver.findElement(By.cssSelector("#kw")).sendKeys("周杰伦");
        driver.findElement(By.cssSelector("#su")).click();
//        Thread.sleep(3000);
        driver.manage().timeouts().implicitlyWait(Duration.ofMillis(3000));
        driver.findElement(By.cssSelector("#\\34  > div > div:nth-child(1) > h3"));
    }

 这种等待的方式是在我们限定的时间内如果页面全部加载完毕我们就进行定位,但是需要我们的页面全部加载完毕,后面的页面也许我们就不需要这样又会导致我们浪费一些时间。

显式等待:

强制等待可以针对我们某一个元素进行等待。

    public void waitTest() throws InterruptedException {
        driver.findElement(By.cssSelector("#kw")).sendKeys("周杰伦");
        driver.findElement(By.cssSelector("#su")).click();
//        Thread.sleep(3000);
//        driver.manage().timeouts().implicitlyWait(Duration.ofMillis(3000));
        //传入驱动和等待的时间
        WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(3));
        //等待的条件
        wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#\\34  > div > div:nth-child(1) > h3")));
//        driver.findElement(By.cssSelector("#\\34  > div > div:nth-child(1) > h3"));
        close();

    }

操作界面

打印操作

    public void printTest() {
        String title = driver.getTitle();//打印标题
        System.out.println("title:"+title);//title:百度一下,你就知道
        String url = driver.getCurrentUrl();//获取当前的url
        System.out.println("url:"+url);//https://www.baidu.com/

    }

我们可以根据一些方法来打印我们当前页面的一些信息。

窗口

窗口的切换

    public void printTest() {
        String title = driver.getTitle();//打印标题
        System.out.println("title:"+title);//title:百度一下,你就知道
        String url = driver.getCurrentUrl();//获取当前的url
        System.out.println("url:"+url);//https://www.baidu.com/
        driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        String title1 = driver.getTitle();//打印标题
        System.out.println("title:"+title1);//title:百度一下,你就知道
        String curWindow = driver.getWindowHandle();//获取当前的句柄
        Set<String> windows = driver.getWindowHandles();//获取所有的句柄
        for (String window:windows) {
            if (window!=curWindow) {
                driver.switchTo().window(window);//切换到点击后的句柄
            }
        }
        String title2 = driver.getTitle();//打印标题
        System.out.println("title:"+title2);//title:百度一下,你就知道

    }

 我们每一个窗口都有属于自己的一个句柄,我们的程序在点击之后是不能自己去切换句柄的,需要我们调用相关的方法然后去切换句柄。

窗口的大小设置

    public void window() throws InterruptedException {
        driver.manage().window().maximize();//将窗口设置为最大
        Thread.sleep(2000);
        driver.manage().window().minimize();//将窗口设置为最小
        Thread.sleep(2000);
        driver.manage().window().setSize(new Dimension(500,500));//自定义大小
    }

我们可以同上上面的一些方法来设置我们的窗口的大小。

浏览器的前进和后退

public void test1() throws InterruptedException {
    ChromeDriver driver = new ChromeDriver();
    //进入百度网站
    driver.get("https://www.baidu.com");
    driver.findElement(By.id("kw")).sendKeys("火锅");
    driver.findElement(By.id("su")).click();
    Thread.sleep(3000);
    //后退
    driver.navigate().back();
    Thread.sleep(3000);
    //前进
    driver.navigate().forward();
    Thread.sleep(3000);
    driver.quit();
}

我们可以通过navigate().来选择我们的前进和后退意味着我们前进到下一个页面后者后退到前一个页面。

关闭弹窗

常见的弹窗有两种:一种是我们可以定位的弹窗,一种是我们不能定位的弹窗。

 这种弹窗就是我们可以定位的弹窗我们只需要定位到指定位置然后触发点击时间就乐意解决了,还有一种就是我们无法定位的弹窗,也就是警告弹窗。

 对于这种弹窗我们要想关闭就不能那么简单了。

    public void alert() throws InterruptedException {
        driver.findElement(By.cssSelector("#tooltip")).click();
        Thread.sleep(2000);
        Alert alert = driver.switchTo().alert();//跳转到弹窗
        alert.accept();//点击确认,如果有取消按钮就用dismiss()方法
        Thread.sleep(2000);
    }

鼠标操作

这里提供了一些关于鼠标的操作用来模拟我们鼠标的移动双击右键等一系列的操作。

键盘操作

selenium 中的 org.openqa.selenium.Keys 类提供了键盘上几乎所有按键的方法。 sendKeys() 方法可以用来模拟键盘输入,可以用它来输入键盘上的按键, 组合键。

public void test1() throws InterruptedException {
    ChromeDriver driver = new ChromeDriver();
    //进入百度网站
    driver.get("https://www.baidu.com");
    WebElement element = driver.findElement(By.cssSelector("#kw"));
    //输入框输入内容
    element.sendKeys("周杰伦");
    Thread.sleep(2000);
    //删除最后一个文字
    element.sendKeys(Keys.BACK_SPACE);
    Thread.sleep(2000);
    //输入空格键
    element.sendKeys(Keys.SPACE);
    Thread.sleep(2000);
    //ctrl+a 全选输入框内容
    element.sendKeys(Keys.CONTROL, "a");
    Thread.sleep(2000);
    //通过回车键盘来代替点击操作
    element.sendKeys(Keys.ENTER);
    Thread.sleep(2000);
    //F5按键刷新页面
    Actions action=new Actions(driver);
    action.sendKeys(Keys.F5);
    Thread.sleep(3000);
    driver.quit();
}

这里简单的给大家介绍几个操作。

上传文件

public void test1() throws InterruptedException {
    ChromeDriver driver = new ChromeDriver();
    //进入百度网站
    driver.get("https://www.baidu.com");
    driver.findElement(By.xpath("//span[@class='soutu-btn']")).click();
    //上传按钮为input标签,定位上传按钮
    WebElement element = driver.findElement(By.xpath("//input[@class='upload-pic']"));
    Thread.sleep(2000);
    //输入文件路径,上传文件
    element.sendKeys("D:\\download\\test.jpg");
    Thread.sleep(3000);
    driver.quit();
}

首先定位到我们指定的位置,然后我们通过sendKeys()的方式来进行上传文件。

屏幕截图

    public void picture() throws IOException {
        driver.findElement(By.cssSelector("#kw")).sendKeys("周杰伦");
        driver.findElement(By.cssSelector("#su")).click();
        //屏幕截图
        File file = driver.getScreenshotAs(OutputType.FILE);
        File file1 = new File("D:\\.1学习资料\\1.jpg");
        FileUtils.copyFile(file,file1);
        driver.findElement(By.cssSelector("#\\31  > div > section > div.container_EBGt2.fold_2kZgh > div:nth-child(2) > div > section:nth-child(1) > div > div.title_1v7d9 > a"));
    }

这里报错了,我们可以看到原因是我们的页面还没加载好呢

 我们只需要在新页面加载之前停一下就可以解决问题了。

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

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

相关文章

【C进阶】找单身狗

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C语言进阶 ⭐代码仓库&#xff1a;C Advanced 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们…

Spring事务(事务的实现、隔离级别、传播机制)

目录 一、事务的定义和意义 二、事务的实现 1、MySQL事务的回顾 2、Spring声明式事务&#xff08;利⽤注解⾃动开启和提交事务&#xff09; 前置知识及概念 实例分析&#xff1a;事务的回滚 &#x1f514;特殊情况&#xff08;无自动回滚&#xff09; &#x1f514;事务…

VueJs中如何使用provide与inject

前言在vue2.0里面provide与inject是以选项式(配置)API的方式在组件中进行使用的,解决的是跨组件(祖孙)间通信的一种方式也就是父子组件间的通信,父组件上通过自定义属性,而子组件间通过props这种方式接收,如果想要一层一层的传递,这种方式就会比较麻烦,不灵活provide与inject就…

Linux下的进程信号

目录 信号背景&#xff1a; 信号产生前 Core Dump 信号产生中 信号产生后 其他概念 不可重入函数 volatile关键字 SIGCHLD 17号信号 信号背景&#xff1a; 在生活中处处都存在的信号&#xff0c;比如信号灯&#xff0c;要想处理信号&#xff0c;我们就必须具备两种…

day26-XML/枚举/注解

1.xml 1.1概述【理解】 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年&#xff0c;又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者&#xff1a; Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为…

AWS - IAM

AWS IAM 自用笔记。 Terms IAM - Identity and Access Management, a global service it gives: Centralized control of AWS accountShared access to AWS accountGranular permissionsIdentity Federation, i.e., Facebook, LinkedIn etc. it allows: Multi-Factor Authe…

20230121解决AIO-3568J开发板无法刷机以及串口异常的问题

20230121解决AIO-3568J开发板无法刷机以及串口异常的问题 2023/1/21 22:31 一片比较旧的AIO-3568J开发板&#xff0c;症状&#xff1a; 1、无法刷机&启动。【Loader模式 & MASKROM模式】 2、串口输出乱码&#xff01; &#xff08;一&#xff09;刷机问题的解决&#x…

一起自学SLAM算法:7.3 估计理论

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 不管是用贝叶斯网络还是因子图&#xff0c;一旦SLAM问题用概率图模型得到表示后&#xff0c;接下来就是利用可观测量&#xff08;和&#xff09;推理不可观测量&#xff08;和&#xff09;&#xff0c;也就是说S…

初识C语言(上)

写在前面 我们正式开始接触到C语言,这是我在学习过C语言后重新写的博客,我把之前的稍微优化了一下,希望能用更加朴素的语言和大家分享,我希望给大家带来一个可以看的懂,理论和实践并行的内容.当然里面也会存在一些错误和不恰当的地方,还请诸位指正. 为何学习C语言 我想从两个…

mac 疑难问题汇总

macos 更改zsh到bash查看当前系统有哪些bash命令行&#xff1a;cat /etc/shells切换成bash命令行&#xff1a;chsh -s /bin/bashmac触摸屏轻点设置Mac通过crontab设置定时任务报错Operation not permitted1、系统偏好设置->安全性和隐私->完全磁盘访问权限2、解除锁定允许…

【双向链表】java代码实现

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#x1f353;&#x1f353;&#x1f353;&#xff0c;上一篇文章我和大家一起去探索了单链表的知识世界&#xff0c;今天我们去接触双向链表&#xff0c;什么&#xff1f;没听错&#xff0c;就是双向链表&#xff0c;比单链表更…

UE INI文件操作 INI File Operation [ Read / Write ] 插件说明

在 Windows 平台上的 INI 文件读写操作 1. Write INI String 输入&#xff1a; Directory&#xff1a; 选择保存目录 Project Directory &#xff1a; 当前项目目录Project Content Directory&#xff1a;当前项目 Content 目录Project Config Directory&#xff1a;当前项目…

JVM内存区域的划分

根据 JVM 规范&#xff0c;JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 程序计数器&#xff08;线程私有&#xff09;&#xff1a; 是当前线程所执行的字节码的行号指示器&#xff0c;每条线程都要有一个独立的程序计数器&#xff0c;这类内存也称为…

Java基础08:面向对象进阶(上)

Java基础08&#xff1a;面向对象进阶&#xff08;上&#xff09;一、static1. 静态变量2. 静态方法3. 工具类4. static注意事项5. 重新认识main方法二、继承1. 继承的概念2. 继承的特点3. 继承中访问成员变量4. 继承中访问成员方法&#xff08;方法重写&#xff09;5. 继承中访…

给大家准备了程序员专属红包封面,审核通过后我哭了,太心酸了(┬_┬)

大家好&#xff0c;我是小悟 今天就是除夕了&#xff0c;也就是大年三十&#xff0c;小伙伴们应该都回家了吧&#xff0c;小悟祝大家新年快乐&#xff0c;身体健康&#xff0c;万事如意&#xff0c;兔飞猛进哦。 春节临近&#xff0c;收到微信定制红包封面并送了四千个名额的…

【深度学习】详解 MoCo

目录 摘要 一、引言 二、相关工作 三、方法 3.1 Contrastive Learning as Dictionary Look-up 3.2 Momentum Contrast 3.3 Pretext Task 四、实验 4.1 Linear Classification Protocol 总结 ☆ 实现 参考资料 Title&#xff1a;Momentum Contrast for Unsupervised…

AlmaLinux 9 安装Kasm Workspaces

今天尝试一下AlmaLinux 9 安装Kasm Workspaces。 前提条件 安装了Docker和Docker Compose&#xff0c;已经最新版本要求&#xff0c; docker 18.06 docker compose 2.1.1 创建一个Swap分区 下面的步骤将创建一个2千兆字节&#xff08;2048MB&#xff09;的交换分区。请根据…

我的创作纪念日——“永远相信美好的事情即将发生”

作者&#xff1a;非妃是公主 专栏&#xff1a;《程序人生》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录序与CSDN的往事机缘收获憧憬碎碎念序 第一次写创作纪念日的文章&#xff01;哈哈哈哈&#xff0c;今…

一起自学SLAM算法:7.5 基于因子图的状态估计

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 虽然式&#xff08;7-90&#xff09;所示的完全SLAM系统可以用滤波方法求解&#xff0c;比如著名的Fast-SLAM实现框架。但是&#xff0c;贝叶斯网络表示下的完全SLAM系统能很方面地转换成因子图表示&#xff0c;…

字符串匹配: BF与KMP算法

文章目录一. BF算法1. 算法思想2. 代码实现二. KMP算法1. 算法思想概述2. 理解基于最长相等前后缀进行匹配3. 代码中如何实现next数组5. 代码实现6. next数组的优化一. BF算法 1. 算法思想 BF 算法, 即暴力(Brute Force)算法, 是普通的模式匹配算法, 假设现在我们面临这样一个…