基于JAVA Seleium 的自动化测试

2023-10-27

目录

1.什么是Seleium

2.Selenium环境引入

3.selenium基本使用

4.框架优化

5.元素其他操作

6.关于获取不到元素


1.什么是Seleium

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。

简单来说,就是可以模拟人工在网页上的操作(如点击、输入等),从而验证网页上的功能,达到自动化测试的效果。

Selenium WebDriver是一个浏览器自动化框架,Selenium 的重要主要部分,它接受命令并将它们发送到浏览器。它是通过特定于浏览器的驱动程序实现的。它直接与浏览器通信并对其进行控制。Selenium WebDriver支持各种编程语言,如Java、C# 、PHP、Python、Perl、Ruby。

下面我们使用的将是java语言下的Selenium。

2.Selenium环境引入

首先,我们需要在springboot项目中导入selenium相关依赖:

		<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
		<dependency>
			<groupId>org.seleniumhq.selenium</groupId>
			<artifactId>selenium-java</artifactId>
			<version>3.141.59</version>
		</dependency>

然后,我们还需要下载对应浏览器的控制器,本次主要是控制谷歌浏览器,使用的是:chromdriver。(ChromeDriver 是 Chrome 驱动,是 selenium 模块用来模拟打开谷歌浏览器所必须的一个文件,能模拟在谷歌浏览器上的操作。)

下载好浏览器版本对应的chromdriver后,解压到文件夹即可。

 然后,我们就可以使用selenium了。

3.selenium基本使用

下面是selenium的一个基本使用案例,实现登录gitee首页为目的:

package com.seven.buy;

import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

public class UpfileDemo{
    public static void main(String[] args) {
        //你的chromedriver存放地址
        System.setProperty("webdriver.chrome.driver", "E:\\java_tools\\chromedriver.exe");
        ChromeDriver browser = new ChromeDriver();
        
        //窗口最大化
        browser.manage().window().maximize();

        //获取gitee网址
        browser.get("https://gitee.com/help/articles/4120");
        //前往登录页面
        browser.findElement(By.linkText("登录")).click();
        //输入用户名密码
        browser.findElement(By.id("user_login")).sendKeys("your username");
        browser.findElement(By.id("user_password")).sendKeys("your password");
        //点击登录
        browser.findElement(By.xpath("//*[@id=\"new_user\"]/div/div/div/div[4]/input")).click();

    }

}

主要逻辑如下:

1.配置Chromedriver程序位置,并获取Chromedriver对象,获得对浏览器操作的能力。

2.获取网址,去玩目的网页进行操作。

3.获取页面上的元素(如通过id,通过xpath获取),从而进行对应的操作(如点击、输入值)等。

4.框架优化

selenium的核心在于获取到对应的元素,进行对应的操作。selenium框架为我们提供了多种获取元素的方式,下面主要讲述4种:

1.通过class获取,即通过标签的class名称获取对应的元素:

WebElement element = browser.findElement(By.className("icon-qrcode"));

 2.通过a标签获取,即对应超链接元素,可以通过其标签文字内容来获取:

WebElement element = browser.findElement(By.linkText("亲,请登录"));

3.通过id获取,即通过标签的id名称获取对应的元素:

WebElement user_login = browser.findElement(By.id("user_login"));

4.通过xpatrh获取:

WebElement element = browser.findElement(By.xpath("//*[@id=\"J_Order_s_2214696073021_1\"]/div[1]/div/div/label"));

什么是xpath?

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言,可以通过谷歌浏览器,检查的方式,获取对应元素的xpath:

(1)f12点开开发这么模式,点击左上角这个小箭头,然后点击页面中你需要的那个元素,即可定位到该元素:

(2)然后在选中标签上右键,复制,复制xpath即可。

(3)关于xpath:

xpath一般使用相等路径,一般格式为://标签名称[contains(text(),"文字")]。标签名称可以是a、input、button、span、td等。或者使用//标签名称[contains(@属性名称,'属性值')]

注意:该写法会定位到第一个匹配的元素,如果存在多个,需要注意匹配文字的精确性。

编写之后,我们可以ctrl+f在页面搜索该xpath,来确定其有效性:

 (如上图,通过文字描述,编写xpath,此类写法主要用于无法用id、className或是a标签定位到元素的情况,根据元素其内部各种属性来获取)

而除了常规的使用 findElement() 方法来获取元素,我们还可以结合lombok注解,将需要的元素作为一个实体类获取,以实现CSDN首页进行搜索为例:

编写一个基础Page类,获取dirver,否则使用@FindBy注解时,获取的元素会为空:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.pagefactory.AjaxElementLocatorFactory;

public class BasePage {
    public WebDriver driver;

    public BasePage(WebDriver driver) {
        this.driver = driver;
        PageFactory
                .initElements(new AjaxElementLocatorFactory(driver, 5), this);
    }
}

 编写一个Page实体类,继承该basePage:

import lombok.Getter;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;

@Getter
public class CSDNPage extends BasePage{
    //搜索框
    @FindBy(id = "toolbar-search-input")
    private WebElement searchInput;
    //搜索按钮
    @FindBy(xpath = "//*[@id=\"toolbar-search-button\"]")
    private WebElement searchBtn;

    public CSDNPage(WebDriver driver) {
        super(driver);
    }
}

 然后编写一个业务类,进行业务上的操作:

package com.seven.buy.service;

import com.seven.buy.page.CSDNPage;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;

@Service
public class CSDNService implements InitializingBean {

    private WebDriver driver;
    private CSDNPage page;

    public void search(String content){
        page.getSearchInput().sendKeys(content);
        page.getSearchBtn().click();
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.setProperty("webdriver.chrome.driver", "E:\\java_tools\\chromedriver.exe");
        this.driver = new ChromeDriver();
        driver.get("https://www.csdn.net/?spm=1001.2101.3001.4476");
        driver.manage().window().maximize();
        this.page = new CSDNPage(driver);
    }
}

然后编写junit测试类,测试方法:

import com.seven.buy.service.CSDNService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
public class serviceTest {
    @Resource
    private CSDNService csdnService;

    @Test
    public void search(){
        csdnService.search("java");
    }
}

即可实现自动化测试。

5.元素其他操作

除了基础的赋值和点击,我们还可能碰见下拉框等元素,需要进行操作:

Select select = new Select(driver.findElement(By.xpath("//input[contains(text(),\"请输入你的性别\")]")));
select.selectByValue("男");

可以通过select类来获取对应的值,selectByValue中的值为页面中元素对应的value值。

 如果需要对一些元素进行处理(如去除disable、去除readonly等),可以通过编写JS语句然后执行的方式进行;

	//根据id去除disable元素
	public static void removeElementDisable(WebDriver driver,String id) {
		JavascriptExecutor executor = (JavascriptExecutor) driver;
		String js = "document.getElementById('"+id +"').removeAttribute('disabled', '')";
		executor.executeScript(js);
	}


	//根据xpath去除disable元素
	public static void removeByXpath(WebDriver driver,String xpath) {
		JavascriptExecutor executor = (JavascriptExecutor) driver;
		String js = "document.evaluate(" + "\""+xpath+"\"" + ",document).iterateNext().removeAttribute('disabled', '');";
		executor.executeScript(js);
	}

6.关于获取不到元素

有时候由于网速,页面等原因,会导致页面未加载完成,就调用了对应的获取方法,从而报无法获取元素的错误,这时,我们需要对线程阻塞等待一下,再进行获取。

或者我们可以通过try catch捕获异常,等待一段时间后再次获取:

    public void search(String content){
        boolean judgingElement = isJudgingElement(driver, By.xpath("//input[contains(text(),\"请输入你的性别\")]"));
        while (!judgingElement){
            try {
                Thread.sleep(2000);
                judgingElement = isJudgingElement(driver, By.xpath("//input[contains(text(),\"请输入你的性别\")]"));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    //判断某个元素是否存在
    public boolean isJudgingElement(WebDriver webDriver, By by) {
        try {
            webDriver.findElement(by);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于JAVA Seleium 的自动化测试 的相关文章

  • 抽象超类的默认接口方法

    可以说我有以下结构 abstract class A abstract boolean foo interface B default boolean foo return doBlah class C extends A implemen
  • 在 MongoDB Java 驱动程序中如何使用 $filter

    我有一个适用于 MQL 的查询 我需要将其翻译成Java MQL 中的查询如下所示 db
  • Java,将 null 分配给对象和仅声明之间有什么区别

    之间有什么区别 Object o null and Object o 仅声明 有人可以回答我吗 这取决于您声明变量的范围 例如 局部变量没有default values在这种情况下你将不得不分配null手动 在这种情况下实例变量分配 nul
  • 隐藏类的 System.out.print 调用

    我正在使用 java 库 jar 文件 该文件的作者放入了一堆System out print and System out printlns 有没有办法隐藏特定对象的这些消息 编辑 看起来jar文件似乎正在创建一堆线程 并且每个线程都有它
  • 在java.util中获取错误ArrayList不带参数[重复]

    这个问题在这里已经有答案了 我已经创建了一个类 Student 现在我尝试将我的 Student 对象存储在 ArrayList 中 但在编译 ArrayList 不接受参数时出现错误 我已经检查了我的代码很多次 但找不到问题所在 我的学生
  • Ant 无法启动,给出主类错误

    我正在运行 Elementary OS 基于 Ubuntu 12 并且在运行 apache ant 时遇到问题 它在重新启动之前就可以正常工作 所以我不确定会发生什么变化 我在 etc environment 中定义了环境变量 如下所示 P
  • 在 JavaFX 中拖动未装饰的舞台

    我希望将舞台设置为 未装饰 使其可拖动且可最小化 问题是我找不到这样做的方法 因为我遇到的示例是通过插入到主方法中的方法来实现的 我想通过控制器类中声明的方法来完成此操作 就像我如何使用下面的 WindowClose 方法来完成此操作 这是
  • 使用 CrudRepository 进行自定义查询

    我想使用 CrudRepository 自定义查询 这是我的代码 Repository public interface CustomerRepository extends CrudRepository
  • perl 和 java 正则表达式功能之间有什么区别?

    perl 和 java 在支持哪些正则表达式术语方面有什么区别 这个问题仅涉及正则表达式 并且特别排除了how可以使用正则表达式 即使用正则表达式的可用函数 方法 以及语言之间的语法差异 例如java要求转义反斜杠等 特别令人感兴趣的是 j
  • 我们必须将 .class 文件放在 Tomcat 目录中的位置

    我必须把我的 class文件在 Tomcat 目录中 在我的 Java Complete Reference 书中 他们告诉将其放入C Program Files Apache Tomcat 4 0 webapps examples WEB
  • java.lang.IllegalArgumentException:addChild:子名称“/”不唯一

    java lang IllegalArgumentException addChild 子名称 不唯一 通过在 tomcat webapps 文件夹中启用和禁用 saml 单点登录来替换现有 war 文件时遇到此问题 我正在使用 apach
  • 使用 Java 通过 HTTP 下载未知长度的文件

    我想用java下载一个HTTP查询 但是我下载的文件在下载时有一个未确定的长度 我认为这将是相当标准的 所以我搜索并找到了它的代码片段 http snipplr com view 33805 http snipplr com view 33
  • 使用 include 进行 JAXB 剧集编译不起作用

    我有 2 个模式 A B 我在 B 中重用了一些 A 元素 我不使用命名空间 我在用着
  • Akka 和 spring 配置

    我正在尝试将 akka 与 spring 结合起来 但没有成功 基本上 我的应用程序似乎不习惯读取 akka 模式 具有架构的 service context xml 的一部分
  • wsdl 没有服务元素

    我必须使用 WCF Web 服务并获得 WSDL 外部的 因此无法控制 WSDL 在 WSDL 定义中 我没有找到包含服务 端口和地址元素的服务元素 WSDL 中不存在这种情况正常吗 这对于 WCF WSDL 来说很常见吗 我正在尝试使用轴
  • 单击 selenium 中的链接时循环遍历表格的行(python)

    示例页面源代码如下所示 div class div1 table class foot market tbody td class today name td tbody tbody td class today name td tbody
  • Drools:为什么是无状态会话?

    Drools 使用会话来存储运行时数据 为此 有两种会话 无状态和有状态 与无状态会话相比 有状态会话允许迭代调用 并且似乎比无状态会话具有所有优势 那么为什么会有无状态会话呢 他们服务的目的是什么 与有状态会话相比 它们的优势是什么 谢谢
  • 如何隐藏或删除 Android HoneyComb 中的状态栏?

    如何隐藏或删除 Android HoneyComb 中的状态栏 每次运行应用程序时 我都会发现某些内容必须被状态栏覆盖 我尝试改变AndroidManifest xml 但没有任何改变 你不知道 它被认为是永久的屏幕装饰 就像电容式主页 菜
  • 如何在 Servlet 中打开弹出窗口,然后重定向页面

    我想在调用 servlet 时打开一个弹出窗口 然后想将 servlet 重定向到某个 jsp page 这就是我所做的 protected void doGet HttpServletRequest request HttpServlet
  • 安卓框架?

    是否有任何框架比构建 Android 应用程序更容易 您会对其中一个感兴趣吗 很快就会有 我正在开发 DroidFu 一个 Android 共享库 它将为您提供 活动 和服务 中直接提供大量实用功能 例如生成列表和错误对话框 检查 Inte

随机推荐

  • RSA算法多种生成公私钥的方式

    前言 在实际项目开发中常常需要用到非对称性加密算法生成公私钥应用于加密与认证 服务器间ssh免密等 关于非对称性加密算法生成公私钥等笔者之前有发表过一篇有趣的文章 感兴趣的朋友可以去了解下 生成公私钥的方式有很多 本文以RSA算法为例来讨论
  • 基于Matlab的跨孔CT胖射线追踪算法(二)

    基于Matlab的跨孔CT胖射线追踪算法 二 CT技术是一种无损的工程物探检测技术 因其方法简单 分辨率高 理论上更可靠 结果更直观 被广泛的应用于各种工程 胖射线追踪是CT技术的一种正演算法 本文的代码和示意图 供学习借鉴 1 文章目录
  • Java——JavaDoc生成文档

    JavaDoc javadoc命令是用来生成自己的APi文档 参数信息 author 作者名 version 版本号 since 致命需要最早使用的jdk版本 param 参数名 return 返回值情况 throws 异常抛出情况 用一段
  • pyecharts折线图上symbol(小圆圈)颜色的修改方法

    本人刚接触pyecharts 尝试做k线与指标图 但遇到不少困难 虽然pyecharts虽在展现上令人舒畅 但使用起来并不能像echarts那么完善 比如k线的颜色目前就改不了 我是在尝试了各种方法后 才在GitHub上找到了作者的回答 此
  • 截图 识别指定位置文字

    def tu browser get screenshot as file 1 png img Image open 1 png bo 图片左边到元素左边的距离 图片上面到元素上边的距离 图片左边到元素最右边的距离 图片上面到元素最下边的距
  • Keras—embedding嵌入层的使用

    最近在工作中进行了NLP的内容 使用的还是Keras中embedding的词嵌入来做的 Keras中embedding层做一下介绍 中文文档地址 https keras io zh layers embeddings 参数如下 其中参数重点
  • Flask 物联网局部应用情景

    实践 Raspberry Pi 托管 Flask 网络服务器控制设备 云托管 Flask 和 SQLite 网络服务器使用Web API 处理 ESP8266 数据 Raspberry Pi 托管 Flask 网络服务器使用SQLite存储
  • ChatGPT有哪些作用?

    ChatGPT有哪些作用 介绍 在当今信息技术飞速发展的时代 自然语言处理和人工智能已经成为许多领域的关键技术 ChatGPT是一种先进的语言生成模型 通过人工智能技术为用户提供了许多有用的功能和应用 本文将探讨ChatGPT的作用及其在不
  • 【ASP.NET Core】MVC模型绑定:自定义InputFormatter读取CSV内容

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 在上一篇文章中
  • 【浅学Java】Servlet详解

    Servlet详解 1 什么是Servlet 2 创建一个Servlet程序 1 创建项目 Maven 2 引入依赖 3 创建一些新目录 4 编写代码 5 打包 6 部署 7 验证程序 3 简化创建Servlet的步骤 1 安装plugin
  • .NET Desktop程序员:互联网大环境下软件生产力的创造者

    目录 引言 桌面软件如何适配今天的互联网 让 NET桌面软件工程拥有互联网基因 WebRuntime是什么 具体案例 让应用适配不同的应用场景 基于应用的Web页面 Cloud WinForm 强大的Web生产力 总结 引言 对每个 NET
  • 征服数据宇宙,新华三存储护卫队早有准备?

    999 往期 精 选
  • 【C++】STL—— unordered_map的介绍和使用、 unordered_map的构造函数和迭代器、 unordered_map的增删查改函数

    文章目录 1 unordered map的介绍 2 unordered map的使用 2 1unordered map的构造函数 2 2unordered map的迭代器 2 3unordered map的容量和访问函数 2 4unorde
  • 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

    程序分析 用情况语句比较好 如果第一个字母一样 则判断用情况语句或if语句判断第二个字母 Monday Tuesday Wednesday Thursday Friday Saturday Sunday T 2 S 2 public cla
  • 计算机刚开始学什么时候,新手如何开始学电脑 新手学电脑从何入门

    虽然现在手机已经占据了互联网的半壁江山 但是生活中免不了需要接触电脑 用U盘拷贝份文件 用打印机打印份文档 在电脑上下载一首歌 电影 图片等 都离不开电脑 很多人觉得电脑跟自己无关 也许当你需要用的时候 才会觉得 书到用时方恨少 那么对于一
  • U-Boot 图形化配置及其原理

    目录 U Boot 图形化配置体验 如何使能dns 命令 menuconfig 图形化配置原理 make menuconfig 过程分析 Kconfig 语法简介 1 mainmenu 2 调用其他目录下的Kconfig 文件 3 menu
  • TypeError: buildURL is not a function

    报错图 uni app 使用axios发请求 运行到微信开发者工具报错 使用了网络上axios适配器方案 没有效果 问题没有解决 请求没发出去 这个问题已经解决uni app和微信开发者工具兼容axios 主页文章有仔细查看
  • java中的注释及其快捷键

    1 单行注释 快捷键 Ctrl 再次点击取消注释 2 多行注释 快捷键 Ctrl Shift 要取消注释只能手动删除 3 文档注释 内容 内容 内容 作用 为类或方法添加说明 快捷键 enter
  • sigmod 函数与softmax 函数对比

    sigmod 函数与softmax 函数之间既有类似 又有差异 是两种典型的深度神经网络的activation functions 通俗而言 sigmod 函数常用于二分类 softmax 函数常用于多分类 两者都起到了压缩的作用 sigm
  • 基于JAVA Seleium 的自动化测试

    目录 1 什么是Seleium 2 Selenium环境引入 3 selenium基本使用 4 框架优化 5 元素其他操作 6 关于获取不到元素 1 什么是Seleium Selenium是一个用于Web应用程序测试的工具 Selenium