java selenium (五) 元素定位大全

news2024/12/23 5:07:39

页面元素定位是自动化中最重要的事情, selenium Webdriver 提供了很多种元素定位的方法。  测试人员应该熟练掌握各种定位方法。 使用最简单,最稳定的定位方法。

自动化测试步骤

在自动化测试过程中, 测试程序通常的操作页面元素步骤

1. 找到Web的页面元素,并赋予到一个存储对象中 (WebElement)

2. 对存储页面元素的对象进行操作, 例如:点击链接,在输入框中输入字符等

3. 验证页面上的元素是否符合预期

通过这三个步骤, 我们可以完成一个页面元素的操作, 找到页面元素是很重要的一个步骤。 找不到页面元素,后面就没法做了

Web页面技术的现实复杂性, 造成大量的页面元素很难定位。  经常有人不知道怎么定位。

 

定位方法大全

使用WebDriver对象的findElement函数定义一个Web页面元素

使用findElements函数可以定位页面的多个元素

定位的页面元素需要使用WebElement对象来存储,以便后续使用

常用的定位页面元素方法如下,   按推荐排序

定位方法

Java语言实现实例

id 定位

driver.findElement(By.id(“id的值”));

name定位

driver.findElement(By.name(“name的值”));

链接的全部文字定位

driver.findElement(By.linkText(“链接的全部文字”));

链接的部分文字定位

driver.findElement(By.partialLinkText(“链接的部分文字”));

css 方式定位

driver.findElement(By.cssSelector(“css表达式”));

xpath 方式定位

driver.findElement(By.xpath(“xpath表达式”));

Class 名称定位

driver.findElement(By.className(“class属性”));

TagName 标签名称定位

driver.findElement(By.tagName(“标签名称”));

Jquery方式

Js.executeScript(“return jQuery.find(“jquery表达式”)”)

 

如何定位

在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回元素句柄来定位元素

findElement() 方法返回一个元素, 如果没有找到,会抛出一个异常 NoElementFindException()

findElements()方法返回多个元素, 如果没有找到,会返回空数组, 不会抛出异常

如何选择 定位方法

策略是, 选择简单,稳定的定位方法。

1. 当页面元素有id属性的时候, 尽量使用id来定位。  没有的话,再选择其他定位方法

2. cssSelector  执行速度快, 推荐使用

3. 定位超链接的时候,可以考虑linkText或partialLinkText: 但是要注意的是 ,  文本经常发生改变, 所以不推荐用

3. xpath 功能最强悍。 当时执行速度慢,因为需要查找整个DOM,  所以尽量少用。  实在没有办法的时候,才使用xpath 

 

通过ID查找元素: By.id()

通过页面元素的ID来查找元素是最为推荐的方式, W3C标准推荐开发人员为每一个页面元素都提供独一无二的ID属性

一旦元素被赋予了唯一的ID属性.,  我们做自动化测试的时候,很容易定位到元素.  元素的ID被作为首选的识别属性, 因为是最快的识别策略.

以百度主页为例,  搜索框的HTML示例代码如下,   它的ID为kw

<input type="text" autocomplete="off" maxlength="100" id="kw" name="wd" class="s_ipt">

"百度一下"搜索按钮元素的HTML示例代码如下,   它ID为su

<input type="submit" class="btn self-btn bg s_btn" id="su" value="百度一下">

在Selenium/WebDriver 中通过ID查找元素的Java示例代码如下

        WebDriver driver  = new FirefoxDriver();
        driver.get("http://www.baidu.com");
         
        WebElement searchBox = driver.findElement(By.id("kw"));
        searchBox.sendKeys("小坦克 博客园");
        WebElement searchButton = driver.findElement(By.id("su"));
        searchButton.submit();
        
        driver.close();

 

通过Name查找元素:By.name()

以豆瓣网的主页搜索框为例, 其搜索框的HTML代码如下,  它name是: q

<input type="text" autocomplete="off" name="q" placeholder="书籍、电影、音乐、小组、小站、成员" size="12" maxlength="60">

WebDriver中通过name查找豆瓣主页上的搜索框的Java代码如下:

        WebDriver driver  = new FirefoxDriver();
        driver.get("http://www.douban.com");
         
        WebElement searchBox = driver.findElement(By.name("q"));
        searchBox.sendKeys("小坦克");
        searchBox.submit();

通过TagName查找元素: By.tagName()

通过tagName来搜索元素的时候,会返回多个元素. 因此需要使用findElements()

        WebDriver driver  = new FirefoxDriver();
        driver.get("http://www.cnblogs.com");
         
        List<WebElement> buttons = driver.findElements(By.tagName("div"));
        System.out.println("Button:" + buttons.size());

注意:  如果使用tagName,  要注意很多HTML元素的tagName是相同的,

比如单选框,复选框, 文本框,密码框.这些元素标签都是input.  此时单靠tagName无法精确获取我们想要的元素, 还需要结合type属性,才能过滤出我们要的元素

        WebDriver driver  = new FirefoxDriver();
        driver.get("http://www.cnblogs.com");
         
        List<WebElement> buttons = driver.findElements(By.tagName("input"));
        for (WebElement webElement : buttons) {
            if (webElement.getAttribute("type").equals("text")) {
                System.out.println("input text is :" + webElement.getText());
            }
        }

 

通过ClassName 查找元素 By.className

以淘宝网的主页搜索为例, 其搜索框的HTML代码如下:   class="search-combobox-input"

<input autocomplete="off" autofocus="true" accesskey="s" aria-label="请输入搜索文字" name="q" id="q" class="search-combobox-input" aria-haspopup="true" aria-combobox="list" role="combobox" x-webkit-grammar="builtin:translate" tabindex="0">

Java 示例代码如下

        WebDriver driver  = new FirefoxDriver();
        driver.get("http://www.taobao.com");
        Thread.sleep(15000);
        WebElement searchBox = driver.findElement(By.className("search-combobox-input"));

        searchBox.sendKeys("羽绒服");
        searchBox.submit();

注意:使用className 来进行元素定位时, 有时会碰到一个

 

通过LinkText查找元素 By.linkText();

 直接通过超链接上的文字信息来定位元素:例如

<a href="https://passport.baidu.com/v2/?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2F" name="tj_login" class="lb" οnclick="return false;">登录</a>

HTML 代码如下

        WebDriver driver  = new FirefoxDriver();
        driver.get("http://www.baidu.com");
        WebElement loginLink = driver.findElement(By.linkText("登录"));
        loginLink.click();

 

通过PartialLinkText 查找元素 By.partialLinkText()

此方法是上一个方法的加强版, 单你只想用一些关键字匹配的时候,可以使用这个方法,通过部分超链接文字来定位元素

HTML 代码如下

        WebDriver driver  = new FirefoxDriver();
        driver.get("http://www.baidu.com");
        WebElement loginLink = driver.findElement(By.partialLinkText("登"));
        loginLink.click();

注意:用这种方法定位时, 可能会引起的问题是, 当你的页面中不知一个超链接包含“等”时, findElement方法只会返回第一个查找到的元素,而不会返回所有符合条件的元素

如果你想要获得所有符合条件的元素,还是只能用findElements方法

 

通过CSS选择器查找元素、

通过Xpath 查找元素。

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

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

相关文章

【快速上手系列】内网穿透(natapp)的快速上手和简单使用教程

【快速上手系列】内网穿透&#xff08;natapp&#xff09;的快速上手和简单使用教程 使用 1、natapp配置 网址 https://natapp.cn/ 官方文档 https://natapp.cn/article/natapp_newbie &#xff08;这个也挺言简意赅的&#x1f60e;&#xff09; 点击下载或向下划到客户端…

读写算杂志社读写算编辑部读写算杂志2022年第30期目录

课程改革 新课程理念下学生自主学习能力培养策略探究 陈璟; 1-3 新课改下初中语文教学中名著阅读教学策略探究 赵璇; 4-6 教育创新《读写算》投稿&#xff1a;cn7kantougao163.com 多媒体辅助下初中物理教学方法改革策略分析 张鹤贵; 7-9 关于互联网环境下小学美术课堂教学模式…

LVGL | 1.LVGL PC模拟器之CodeBlocks

LVGL的学习与使用 LVGL | 1.LVGL PC模拟器之CodeBlocks 1.资源 1-1.主页&#xff1a;https://lvgl.io/ 1-2.LVGL | LVGL简介之中文文档 1-3.LVGL | LVGL快速概述之中文文档 1-4.问题反馈&#xff1a;https://forum.lvgl.io/ 1-5.LVGL开源GUI零基础入门课程(韦东山监制) 教程基…

【附源码】计算机毕业设计JAVA沙县小吃点餐系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

通信电源专业技术交流

UPS电源 •UPS为交流不间断供电电源系统的英文缩写。• UPS系统原理&#xff1a;UPS系统由整流模块、逆变器、蓄电池、静态开关等组成。整流模块&#xff08;AC/DC&#xff09;和逆变器&#xff08;DC/AC&#xff09;都为能量变换装置&#xff0c;蓄电池为储能装置。除此还有间…

docker部署Jenkins与任务创建【七千字超详细指南】

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 文章目录什么是jenkins&#xff1f;jenkins的功能依赖环境使用docker快速搭建查看版本下载jenkins镜像使用d…

搞个网站需要多少钱【网站费用】

想搞一个网站&#xff0c;我们先了解一下搞个网站需要多少钱&#xff1f;网站建设费用主要包括&#xff1a;网站搭建、服务器费用&#xff08;有些是免费的&#xff09;、域名费用以及其他杂费。对于刚成立网站我们可以选择用自助建站方案来进行搭建网站&#xff0c;因为我们自…

【freeRTOS】操作系统之五.-内存管理

\FreeRTOS\Source\portable\MemMang下提供了5中内存分配机制的实现 一、配置FreeRTOS内存大小 在FreeRTOSConfig.h头文件中宏configTOTAL_HEAP_SIZE用于配置内核可用的RAM大小。 在heap1.c, heap2.c, heap4.c源文件中&#xff0c;分配的内存实际上是用一个静态数组ucHeap来表…

阿里后端优化这么恐怖?看完这20W字Java性能实战经验手册,最少P7

学习是一种基础性的能力。然而&#xff0c;“吾生也有涯&#xff0c;而知也无涯。”&#xff0c;如果学习不注意方法&#xff0c;则会“以有涯随无涯&#xff0c;殆矣”。 学习就像吃饭睡觉一样&#xff0c;是人的一种本能&#xff0c;人人都有学习的能力。我们在刚出生的时候…

通过rpm安装MySQL8.0

前文 下载虚拟机&#xff0c;安装Linux&#xff08;Centos7发行版&#xff09;关闭SELinux服务 &#xff08;安全模块&#xff0c;容易跟其他程序冲突&#xff0c;建议关闭&#xff09;替换yum源 &#xff08;加快下载依赖速度&#xff09;安装MySQL 关闭SELinux 进入vi /ec…

代码随想录——冗余连接(并查集)

题目 树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1&#xff5e;n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间&#xff0c;且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges &#xff0c;edges[…

(C语言)成绩统计

[#4练习赛]成绩统计 题目描述 传智专修学院的“Java程序设计”班有 N(1≤100)N(1 \le 100)N(1≤100) 个学生&#xff0c;知道他们的个人信息和成绩&#xff1a; 姓名&#xff08;长度不超过 202020 的仅由小写字母组成的字符串&#xff09;平时分成绩&#xff08;000 到 100…

网格窗帘布能符合NFP92-503法国M2级别要求吗?

NFP 92-503是针对建筑材料类产品的阻燃性能测试&#xff0c;主要分为M1-M4四个级别&#xff0c;M1为最高级别&#xff0c;以此类推&#xff0c;故而M2对阻燃要求还是比较严格的&#xff0c;布料要申请M2要求的话&#xff0c;前提至少要有阻燃处理了。 NFP 92-503 建筑材料阻燃测…

振弦采集模块主动上传测量数据( UART)

振弦采集模块主动上传测量数据&#xff08; UART&#xff09; 默认情况下 VMXXX 模块总是以从机身份与主机完成数据交互&#xff0c; 在这种主从结构中&#xff0c; VMXXX 从不主动上传数据&#xff0c; 可通过修改自动上传寄存器&#xff08; ATSD_SEL&#xff09;来实现模块主…

论文阅读笔记 | 三维目标检测——MV3D算法

如有错误&#xff0c;恳请指出。 文章目录1. 背景2. 网络结构2.1 提案投影网络2.2 区域融合网络3. 实验结果paper&#xff1a;《Multi-View 3D Object Detection Network for Autonomous Driving》 1. 背景 激光雷达可以提供物体的深度信息&#xff0c;而摄像头可以提供物体的…

麦子-linux字符设备驱动初探

字符驱动的联系 框架 软件支持&#xff1a;驱动 驱动类型 1、字符驱动&#xff08;每次读取一个字节&#xff09; 2、块驱动&#xff08;每次读取多个字节&#xff09; 3、网络设备驱动&#xff08;协议栈&#xff09; 设备号dev_t 内核中使用类型dev_t来描述设备号&…

【Unity3D】Unity 脚本 ④ ( 游戏物体 GameObject 的坐标 | 修改 游戏物体 GameObject 的本地坐标 )

文章目录一、 游戏物体 GameObject 的坐标二、 修改 游戏物体 GameObject 的本地坐标一、 游戏物体 GameObject 的坐标 游戏物体 GameObject 的坐标 有 2 种 : 世界坐标 : 调用 Transform#position 属性 获得 ;本地坐标 : 调用 Transform#localPosition 属性 获得 ,本地坐标 就…

这份Java大厂常见面试题解析,你的闭关修练宝典!

纵观今年的技术招聘市场&#xff0c; Java依旧是当仁不让的霸主 &#xff01;即便遭受 Go等新兴语言不断冲击&#xff0c;依旧岿然不动。究其原因&#xff1a; Java有着极其成熟的生态&#xff0c;这个不用我多说&#xff1b; Java在 运维、可观测性、可监 控性方面都有着非常…

Materials Studio8.0

centos7.9 检查主机名&#xff1a; 检查环境&#xff1a; [rootmaster conf]# rpm -qa|grep glibc; rpm -qa|grep libgcc; rpm -qa|grep libstdc ;rpm -qa|grep redhat-lsb Materials Studio8.0软件包 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;fomg 软件…

【LeetCode每日一题:891. 子序列宽度之和~~~排序+数学推导】

题目描述 一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums &#xff0c;返回 nums 的所有非空 子序列 的 宽度之和 。由于答案可能非常大&#xff0c;请返回对 109 7 取余 后的结果。 子序列 定义为从一个数组里删除一些&#xff08;或者…