web driver提供了八种元素定位的方法:

id,  name,  class name,  tag name,

link text,  partial link text,  xpath,  css selector

如百度首页,百度一下按钮的元素信息

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

百度首页新闻的页面的元素信息

<a href="http://news.baidu.com" name="tj_trnews" class="mnav">新闻</a>

1. id定位-->

  id在大多数情况下是唯一的。如百度一下的按钮

 driver.findElement(By.id("su")).click();

2. name定位 -->

  也有元素没有id,和其他同级元素共用一个id,如新闻。此时要通过其他方式去定位。name指定元素的名称,但name在当前页面不一定唯一。

   driver.findElement(By.name("tj_trnews")).click();

3. class name -->没有使用成功

  html规定class来指定元素的类名。没有使用成功

4. tag name -->

  HTML的本质就是通过tag来定义实现不同的功能,每一个元素本质上也是一个tag。tag往往用来定义一类功能,所以通过tag识别某个元素的概率很低。如页面存在大量的<div>,<input>,<a>等tag。

5. link text -->

  link专门用来定位文本链接。

  driver.findElement(By.linkText("地图")).click();

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

  driver.findElement(By.linkText("地图")).click();

6. partial link text -->

  partial link text是对link text的补充,有些文本链接会比较长,此时可以取部分文本进行定位。

  driver.findElement(By.partialLinkText("新闻")).click();

7. xpath -->

  a.绝对路径定位

    driver.findElement(By.xpath("/html/body/div[1]/div[1]/div/div[3]/a[2]")).click();

    注意此处的index下标是从1开始的,不是从0。即div[1]表示当前层级下第1个div标签

  b.利用元素属性定位

    地图有三个属性,href,name,class。

    driver.findElement(By.xpath("//a[@name='tj_trnews']")).click();

    driver.findElement(By.xpath("//a[@href='http://news.baidu.com']")).click()

    driver.findElement(By.xpath("//a[@class='mnav']")).click();

    driver.findElement(By.xpath("//a[contains(@href,\"http://map.baidu.co\")]")).click();

    

    参照2中图会发现,如果定位地图,会发现class属性相同。不加索引,会指向第一个,即新闻;添加索引[3],即可实现对地图的定位。

     WebElement baiduNew= driver.findElement(By.xpath("//a[@class='mnav']"));

     System.out.println(baiduNew.getText()); //新闻

    WebElement baiduMap = driver.findElement(By.xpath("//a[@class='mnav'][3]"));
    System.out.println(baiduMap.getText()); //地图

  c.层级与属性结合

    如果一个元素本身没有可以标识这个元素的属性值,可以找其上一级元素。如果上一级元素有可以唯一标识的值,就可以拿来使用。

    定位百度首页地图。双引号注意转译

    driver.findElement(By.xpath("//*[@id=\"u1\"]/a[1]")).click();

    driver.findElement(By.xpath("//*[@id='u1']/a[3]")).click();

    如果父元素没有可利用的属性,继续向上查找爷爷元素

    driver.findElement(By.xpath("//*[@class='head_wrapper']/div[3]/a[2]")).click();

    尝试省略父元素或用*代替父元素,没有成功。父元素不可省略。

    driver.findElement(By.xpath("//*[@id=\"head\"]//a[contains(@name,\"tj_trmap\")]")).click();

    driver.findElement(By.xpath("//*[@id=\"head\"]//a[@name=\"tj_trmap\"]")).click();

    driver.findElement(By.xpath("//div[@id=\"head\"]//a[@name=\"tj_trmap\"]")).click();

    driver.findElement(By.xpath("//*[@class='head_wrapper']//a[2]")).click();//根据索引,找不到元素。要加属性才可以  

    driver.findElement(By.xpath("//div[@id=\"head\"]//a[@class='mnav'][2]")).click();

  d.使用逻辑运算符

    如果一个元素不能唯一的区分一个元素,也可以使用逻辑运算符使用多个属性来查找元素。如2中图片,class相同,可以添加其他属性来确定元素。

    driver.findElement(By.xpath("//a[@name='tj_trnews' and @class='mnav']")).click();

    findElement(By.xpath("//input[@id='kw' and @class='su']/span/input")) 

    driver.findElement(By.xpath("//*[contains(@name,'tj_trmap') and contains(@class,'mnav')]")).click(); 并且

    driver.findElement(By.xpath("//*[contains(@name,'tj_trmap')][contains(@class,'mnav')]")).click(); //同上

 

  e.使用插件快速生成xpath

     chrome:元素-右键,检查元素-copy-copy xpath

    Firefox:元素-右键,查看元素-复制-复制xpath

  

8.css selector -->

  如百度首页,百度一下的信息

选择器 例子 描述
.class .mnav class选择器,选择class="mnav"的所有元素
#id #su id选择器,选择id='su'的所有元素
* * 选择所有元素
element input 选择所有<input>元素
element>element div>input 选择父元素为div的所有input元素
element+element div+input 选择紧接在div后所有的input元素
[attribute==value] [name='tj_trnews'] 选择name="tj_trnews"的所有元素

  a.使用class属性定位

    driver.findElement(By.cssSelector(".mnav")).click();

    默认查找第一个元素,如果要查找其他的元素,需要使用nth-child(index)

    driver.findElement(By.cssSelector(".mnav:nth-child(3)")).click();

  b.使用id属性定位

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

    driver.findElement(By.cssSelector("#u1>a")).click();

    driver.findElement(By.cssSelector("#u1>a:nth-child(3)")).click();

  c.通过tag ame定位

    driver.findElement(By.cssSelector("span>input")).sendKeys("hello");

    driver.findElement(By.cssSelector("span+input")).sendKeys("hello");

  d.通过属性定位

    driver.findElement(By.cssSelector("[name='tj_trnews']")).click();

  e.组合定位

    driver.findElement(By.cssSelector("div>a.mnav")).click(); //定位到新闻

    driver.findElement(By.cssSelector("#u1 > a:nth-child(3)")).click(); //定位到地图

    driver.findElement(By.cssSelector("a[name='tj_trmap'][class='mnav']")).click(); //class为mnav并且name为tj_trmap的a节点

    driver.findElement(By.cssSelector("a.mnav[name='tj_trmap']")).click();//同上,class为mnav name为tj_trmap的a节点

    driver.findElement(By.cssSelector("div#passwd-id>input")).click(); //id为passwd-id的div下的所有input子节点

    driver.findElement(By.cssSelector("div#passwd-id input")).click();//id为passwd-id的div下的所有input子孙节点

  f.使用插件生成css路径

    chrome:元素-copy-copy selector

    firefox: 元素-复制-复制CSS路径

  xpath与CSS类似功能对比

<a href="http://news.ifeng.com/a/20180616/58747157_0.shtml?_zbs_firefox" title="特朗普竞选团队前竞选经理被令入狱候审">特朗普竞选团队前竞选经理被令入狱候审</a>

定位方式 XPath CSS
tag name //a a
By id //a[@id='u1'] a#u1

By class

//a[@class='mnav'] a.mnav
By link text //a[@title='特朗普竞选团队前竞选经理被令入狱候审']

a[title=特朗普竞选团队前竞选经理被令入狱候审]

a[title^=特朗普]

a[title$=入狱候审]

a[title*=竞选经理]

定位子元素 //div/a[@class='mnav'] div>a.mnav
使用index //*[@id='u1']/a[3] #u1 > a:nth-child(3)
并且 //*[@class='mnav' and @name="tj_trmap"] a[class='mnav'][name='tj_trmap']

原文:https://www.cnblogs.com/csj2018/p/9194618.html

selenium定位元素的八种方法的更多相关文章

  1. selenium java-3 定位元素的八种方法

    web driver提供了八种元素定位的方法: id name class name tag name link text partial link text xpath css selector 如 ...

  2. selenium定位元素的8种方法

    By.id,By.name,By.tagName,By.className,By.linkText,By.partialLinkText,By.xpath,By.cssSelector <a h ...

  3. Python+Selenium自动化-定位页面元素的八种方法

    Python+Selenium自动化-定位页面元素的八种方法   本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子. 0.元素定位方法主要有: id定位:find_elemen ...

  4. JS获取DOM元素的八种方法

    JS获取DOM元素的方法(8种) 通过ID获取(getElementById) 通过name属性(getElementsByName) 通过标签名(getElementsByTagName) 通过类名 ...

  5. Selenium定位元素-Xpath的使用方法

    工具 Xpath的练习建议下载火狐浏览器,下载插件Firebug.Firepath. 由于最新版火狐不支持Firebug等扩展工具了,所以需要下载49版以下的版本安装https://ftp.mozil ...

  6. selenium定位元素(本内容从https://my.oschina.net/flashsword/blog/147334处转载)

    注明:本内容从https://my.oschina.net/flashsword/blog/147334处转载. 在使用selenium webdriver进行元素定位时,通常使用findElemen ...

  7. Web自动化基础(一)使用Selenium定位元素

    什么是元素?我们知道网页上有什么内容显示出来,比如一个按钮,一个输入框,一张图片,都可以理解成元素,这些元素是由html代码构成的,比如图片可以用<img>标签来展示,一个输入框可以用&l ...

  8. 用css隐藏元素的5种方法

    .green { width: 100px; height: 100px; background-color: #a0ee00; text-align: center; float: left; ma ...

  9. 解析Jquery取得iframe中元素的几种方法

    iframe在复合文档中经常用到,利用jquery操作iframe可以大幅提高效率,这里收集一些基本操作,需要的朋友可以参考下   DOM方法:父窗口操作IFRAME:window.frames[&q ...

随机推荐

  1. @ConfigurationProperties(pref="")加载局部配置文件

    刚开始@ConfigurationProperties(文件名)直接在参数里加文件名,其实是配置前缀pref="前缀".加载局部配置文件是@PropertySource(value ...

  2. Day4- Python基础4 深浅拷贝、三目运算、列表生成式,迭代器&生成器、装饰器

    本节内容: 1.深浅拷贝 2.三目运算 3.迭代器和生成器 4.装饰器 1.深浅拷贝 拷贝意味着对数据重新复制一份,深浅拷贝的含义就是:对于修改复制的数据是否会影响到源数据,拷贝操作对于基本数据结构需 ...

  3. day_93_11_25爬虫一requests,项目框架

    总结 nginx反向代理与正向代理. 正向带里就是,客户端通过中转服务器,访问其它他服务器的数据. 反向代理就是用户访问中转服务器,看起来就像和这台服务器交互一样. nginx动静分离. 当客户端访问 ...

  4. OpenFOAM——过渡管中的湍流

    本算例来自<ANSYS Fluid Dynamics Verification Manual>中的VMFL016:Turbulent Flow in a Transition Duct 一 ...

  5. MySQL数字类型学习笔记

    数字类型 最近在看<MySQL技术内幕:SQL编程>并做了笔记,所以本博客是一篇笔记类型博客,分享出来方便自己复习,也可以帮助他人 整型 类型 占用空间 最小值(SIGNED) 最大值(S ...

  6. 企业如何做好B2C电商平台

    导语本文主要讲了两个方面:1.企业如何定位B2C电商平台:2.企业做B2C遇到的问题. 一.企业如何定位B2C电商平台传统企业做B2C电子商务一般选用品牌.渠道.平台模式这三种,品牌模式是在网上建立一 ...

  7. java基础(23):字节流、字符流

    1. 字节流 在前面的学习过程中,我们一直都是在操作文件或者文件夹,并没有给文件中写任何数据.现在我们就要开始给文件中写数据,或者读取文件中的数据. 1.1 字节输出流OutputStream Out ...

  8. VMWare虚拟机应用介绍

    目录 一:VMWare简介 二:VMWare启动第一个虚拟机 一:VMWare简介   VMWare虚拟机软件是一个"虚拟PC"软件,它使你可以在一台机器上同时运行二个或更多Win ...

  9. ojdbc.jar在maven中报错(下载不了)

    一.问题 由于oracle的版权问题,java连接oracle的jar(ojdbc.jar)在maven的中央仓库下载不到,然后导致maven项目报错. 二.解决 第一步:下载ojdbc.jar 由于 ...

  10. XCode保存问题

    1. 确认下证书是不是开发证书,如果是发布证书就会出现这样的提示. 2. 证书失效了,去开发者中心重新生成一个. 3. 包标识符不与描述文件包含的包标识符不一致,按照它的提示换一下就好了,最好不要点 ...