热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Selenium_WebDriver_定位元素

版权声明:本文为博主原创文章,转载请注明出处。定位单个元素WebDriver提供了八种元素定位方法,Java中定位语句形如:

版权声明:本文为博主原创文章,转载请注明出处。


定位单个元素

       WebDriver提供了八种元素定位方法,Java中定位语句形如:driver.findElement(By.id());

  何为元素定位?当我们使用百度进行信息搜索时,打开网址后,我们的眼睛会聚焦到搜索栏,然后在搜索栏中输入我们需要搜索的关键,然后点击“百度一下”按钮,从上面的描述中我们可以看到,要完成搜索我们必须找到“搜索栏 && 百度一下按钮”,我们有眼睛可以浏览页面去定位“搜索栏 && 百度一下按钮”的位置,那脚本怎么知道“搜索栏 && 百度一下按钮”在哪里呢,这就要用到元素定位方法,通过元素定位,相当于给浏览器驱动器安装了一双眼睛,这样就可以找到“搜索栏 && 百度一下按钮”的“位置”了;

元素定位方式

描述

示例及场景

id

HTML规定id属性在HTML文档中必须是唯一的,这就类似于公民的身份证号,具有很强的唯一性

示例:定位"百度一下"按钮,并点击;

语法: driver.findElement(By.id("su")).click();

场景: id="su" class="btn self-btn bg s_btn">

name

HTML规定name来指定元素的名称,因此它的作用更像是人的姓名。name的属性值,在当前页而中可以不唯一。

示例:定位"百度搜索首页”的输入框,并输入"Selenium";

语法:driver.findElement(By.name("wd")).sendKeys("Selenium");

场景:name="wd" id="kw" maxlength="100" autocomplete="off">

class name

HTML规定class来指定元素的类名。

其用法与id、name类似。

示例:定位"百度一下"按钮,并点击;

语法:driver.findElement(By.className("btn self-btn bg s_btn")).click();

场景: class="btn self-btn bg s_btn">

tag name

HTML的本质就是通过tag来定义实现不同的功能,每一个元素本质上也是一个tag。因为一个tag往往用来定义一类功能,所以通过tag识别某个元素的概率很低。

语法1:driver.findElement(By.tagName("input"));

示例2:查找页面上有多少个input,就可以用input这个tagName来进行查找

语法2:List inputs = driver.findElements(By.tagName("input"));

             System.out.println(inputs.size());

link text

专门用来定位文本链接

示例:定位"百度搜索主页"右上角的"新闻"文本链接,并点击;

语法:driver.findElement(By.linkText("新闻")).click();

场景:新闻

partial link text

[ˈpɑ:ʃl]

parial link定位是对link定位的一种补充,有些文本链接会比较长,这个时候我们可以取文本链接的一部分定位,只要这一部分信息可以唯一地标识这个链接即可。

示例:定位"百度搜索主页"右上角的"更多产品"文本链接,并点击;

语法:driver.findElement(By.partialLinkText("更多产")).click();

场景: 更多产品

xpath

XPath是一种在XML文档中定位元素的语言。

这种方法几乎可以定位到页面上的任意元素。

还可直接使用find_element_by_xpath()方法来定位元素。

 

①绝对路径

XPath主要用标签名的层级关系来定位元素的绝对路径,最外层为html语言。有body文本内,一级一级往下查找,如果一个层级下有多个相同的标签名,那么就按上下顺序确定是第几个,例如div[2]表示当前层级下的第二个div标签。

②相对路径

(需要学习Xpath定位语法)

示例:定位"百度一下"按钮,并点击;

语法:driver.findElement(By.xpath("//*[@id='su']")).click();

场景:利用谷歌F12中自带的“Copy XPath”,获取到“百度一下”按钮的XPath路径;

css selector

CSS使用选择器来为页面元素绑定属性。

CSS可以较为灵活地选择控件的任意属性,一般情况下定位速度要比XPath快。

 

选择器(利用谷歌F12中自带的“Copy Selector”)

#id

 id 选择器,选择id="***'的所有元素;

示例:定位"百度一下"按钮,并点击;

语法:driver.findElement(By.cssSelector("#su")).click();

场景:

.class

 class 选择器,选择class="***"的所有元素;

示例:定位"百度一下"按钮,并点击;

语法:driver.findElement(By.cssSelector(".btn self-btn bg s_btn")).click();

场景:

*

选择所有元素

element

选择所有元素

element1 > element2

选择父元素为的所有元素

element1 + element2

选择同一级中紧接在元素之后的所有元素

[attribute=value]

选择target = value的所有元素

 

定位一组元素

   定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词 element 后面多了一个 s 表示复数。定位一组元素一般用于以下场景:

  ①批量操作元素,例如勾选页面上所有的复选框

  ②先获取一组元素,再从这组对象中过滤出需要操作的元素。例如定位出页面上所有的 checkbox,然后选择其中的一个进行操作。

  注:对获取到的获取到的元素进行操作时,操作页面不能有跳转,否则会出现页面失效错误“stale element reference: element is not attached to the page document”

findElements()

原型

java.util.List findElements(By by)

参数

和findElement的可取的参数是一样的;

返回值

返回一个装有WebElement的List容器;

因此,可以使用Java中关于List相关的方法,如:size()获取webelement的个数;

示例

示例说明:登录cnblog,并为"精华"页面的前2篇博文点击"推荐";

关键语法:

①List elements = driver.findElements(By.className("diggit"));   //定位所有的“推荐”按钮;

②element = elements.get(i);//获取单个博文的“推荐”按钮,用到了Java循环For语句,List的get()方法;

③element.click();             //点击“推荐”按钮;

 

附上测试代码:

测试环境:

①Eclipse:jee-mars-4.5.2

②Selenium:selenium-java-3.5.3

③GoogleChrome:60

④chromedriver:2.30;     

package com.SeleniumLib.jase;
import java.util.List;import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;public class FindElement_s{public static void main(String[]args) throws InterruptedException{System.out.println("start selenium");WebDriver driver; System.setProperty("webdriver.chrome.driver","D:/selenium-java-3.5.3/chromedriver.exe"); //chromedriver驱动的本地存放路径 driver &#61; new ChromeDriver(); driver.get("https://www.baidu.com/"); //id/*driver.findElement(By.id("kw")).sendKeys("Selenium");driver.findElement(By.id("su")).click();*///name/*driver.findElement(By.name("wd")).sendKeys("Selenium");driver.findElement(By.id("su")).click();*///className/*driver.findElement(By.className("s_ipt")).sendKeys("Selenium");driver.findElement(By.className("btn self-btn bg s_btn")).click();*///tagName/*List inputs &#61; driver.findElements(By.tagName("input"));System.out.println(inputs.size()); driver.findElement(By.tagName("input"));*///linkText/*driver.findElement(By.linkText("新闻")).click();*///partialLinkText/*driver.findElement(By.partialLinkText("更多产")).click();*/ //XPath //绝对路径 //如下的绝对路径不正确&#xff0c;已放弃T_T//driver.findElement(By.xpath("/html/body/div[2]/div[1]/div[5]/div[1]/div[1]/form/span/input")).sendKeys("Selenium"); //driver.findElement(By.xpath("/html/body/div[2]/div/div[5]/div/div/form/span[2]/input")).click(); //XPath //相对路径&#xff1a;利用谷歌F12中自带的“Copy XPath”,获取到XPath路径,需要对其中的双引号做处理&#xff1a;换为单引号、或者使用\对双引号进行转义&#xff1b;/*driver.findElement(By.xpath("//*[&#64;id&#61;&#39;kw&#39;]")).sendKeys("Selenium"); //获取到的XPath&#xff1a;//*[&#64;id&#61;"su"] 将双引号换为单引号;driver.findElement(By.xpath("//*[&#64;id&#61;\"su\"]")).click(); //获取到的XPath&#xff1a;使用\对双引号进行转义*/ //cssSelector .class/*driver.findElement(By.cssSelector(".s_ipt")).sendKeys("Selenium");driver.findElement(By.cssSelector(".btn self-btn bg s_btn")).click();*///cssSelector #id/*driver.findElement(By.cssSelector("#kw")).sendKeys("Selenium");driver.findElement(By.cssSelector("#su")).click();*///cssSelector */*List inputs2 &#61; driver.findElements(By.cssSelector("*"));System.out.println(inputs2.size());*///cssSelector element1 > element2/*List inputs3 &#61; driver.findElements(By.cssSelector("html > body"));System.out.println(inputs3.size()); *///cssSelector element1 &#43; element2/*List inputs4 &#61; driver.findElements(By.cssSelector("span &#43; input"));System.out.println(inputs4.size()); */// [attribute&#61;value]/*List inputs5 &#61; driver.findElements(By.cssSelector("[type&#61;submit]"));System.out.println(inputs5.size()); *///多个元素1————//登录cnblog&#xff0c;并为"精华"页面的前2篇博文点击"推荐"&#xff1b;driver.get("https://passport.cnblogs.com/user/signin?ReturnUrl&#61;https%3A%2F%2Fwww.cnblogs.com%2F"); driver.findElement(By.id("input1")).sendKeys("天使未必在场");driver.findElement(By.id("input2")).sendKeys("******"); //个人密码driver.findElement(By.id("signin")).click();Thread.sleep(2000); //需要等待几s&#xff0c;否则程序还未正确跳转到cnblog登录主页,元素查找的个数为0&#xff1b; //抛出异常InterruptedExceptionSystem.out.println("CurrentUrl"&#43;driver.getCurrentUrl()); driver.get("https://www.cnblogs.com/pick/"); //跳转到"精华"页面&#xff1b;List elements &#61; driver.findElements(By.className("diggit"));int listsize &#61; elements.size();System.out.println("“精华”页首页共有【 "&#43; listsize &#43;"】个className&#61;diggit的元素"); for(int i &#61; 0;i <2;&#43;&#43;i) //控制只为前两篇点赞&#xff1b;{WebElement element;System.out.println(i);element &#61; elements.get(i); //本打算依次从elements列表中获取每一个element元素&#xff0c;但获取完第一个元素"新闻"后&#xff0c;因为页面跳转导致第二个元素失效&#xff1b;element.click(); //点击“推荐”按钮&#xff1b;Thread.sleep(1000); }//driver.navigate().refresh(); //多个元素2——页面元素失效测试&#xff1a;定位“百度搜索”首页右上角的超文本链接“新闻、hao123、地图、视频、贴吧、学术&#xff0c;共6个”,再模拟点击这6个元素&#xff1b;/*List elements2 &#61; driver.findElements(By.className("mnav"));int listsize2 &#61; elements2.size(); //使用list迭代器的方法size()获取element的个数&#xff1b;System.out.println("共有【 "&#43; listsize2 &#43;"】个className&#61;mnav的元素"); for(int i &#61; 0;i */System.out.println("end selenium");///driver.close(); //测试时为了更直观直接注释掉了&#xff0c;也可使用延时
}
}

 

转:https://www.cnblogs.com/xpp142857/p/7551490.html



推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • position属性absolute与relative的区别和用法详解
    本文详细解读了CSS中的position属性absolute和relative的区别和用法。通过解释绝对定位和相对定位的含义,以及配合TOP、RIGHT、BOTTOM、LEFT进行定位的方式,说明了它们的特性和能够实现的效果。同时指出了在网页居中时使用Absolute可能会出错的原因,即以浏览器左上角为原始点进行定位,不会随着分辨率的变化而变化位置。最后总结了一些使用这两个属性的技巧。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
author-avatar
酷的带_201
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有