WebDriver元素查找方法摘录与总结
WebDriver元素查找方法摘录与总结
整理By:果冻迪迪
selenium-webdriver提供了强大的元素定位方法,支持以下三种方法。
• 单个对象的定位方法
• 多个对象的定位方法
• 层级定位
定位单个元素
在定位单个元素时,selenium-webdriver提示了如下一些方法对元素进行定位。
- By.className(className))
- By.cssSelector(selector)
- By.id(id)
- By.linkText(linkText)
- By.name(name)
- By.partialLinkText(linkText)
- By.tagName(name)
- By.xpath(xpathExpression)
注意:selenium-webdriver通过findElement()\findElements()等find方法调用"By"对象来定位和查询元素。
By类只是提供查询的方式进行分类。findElement返回一个元素对象否则抛出异常,findElements返回符合条
件的元素List,如果不存在符合条件的就返回一个空的list。
使用className进行定位
当所定位的元素具有class属性的时候我们可以通过classname来定位该元素。
下面的例子定位了51.com首页上class为"username"的li。
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.WebElement;
- import org.openqa.selenium.By;
- public
class ByClassName { - public
static
void main(String[] args) {- WebDriver driver = new FirefoxDriver();
- driver.get("http://www.51.com");
- WebElement element = driver.findElement(By.className("username"));
- System.out.println(element.getTagName());
- }
- }
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.WebElement;
- import org.openqa.selenium.By;
- public
class ByClassName { - public
static
void main(String[] args) { - WebDriver driver = new FirefoxDriver();
- driver.get("http://www.51.com");
- WebElement element = driver.findElement(By.className("username"));
- System.out.println(element.getTagName());
- }
- }
输出结果:
li
使用id属性定位
51.com首页的帐号输入框的html代码如下:
<input id="passport_51_user" type="text" value="" tabindex="1" title="用户名/彩虹号/邮箱"
name="passport_51_user">
在下面的例子中我们用id定位这个输入框,并输出其title,借此也可以验证代码是否工作正常。
- import org.openqa.selenium.By;
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.WebElement;
- import org.openqa.selenium.firefox.FirefoxDriver;
- public
class ByUserId { - /**第 13 / 80 页
- * @param args
- */
- public
static
void main(String[] args) { - // TODO Auto-generated method stub
- WebDriver dr = new FirefoxDriver();
- dr.get("http://www.51.com");
- WebElement element = dr.findElement(By.id("passport_51_user"));
- System.out.println(element.getAttribute("title"));
- }
- }
输出结果:
用户名/彩虹号/邮箱
使用name属性定位
51.com首页的帐号输入框的html代码如下:
<input id="passport_51_user" type="text" value="" tabindex="1" title="用户名/彩虹号/邮箱"
name="passport_51_user">
使用name定位
WebElement e = dr.findElement(By.name("passport_51_user"));
使用css属性定位
51.com首页的帐号输入框的html代码如下:
<input id="passport_51_user" type="text" value="" tabindex="1" title="用户名/彩虹号/邮箱"
name="passport_51_user">
使用css定位
WebElement e1 = dr.findElement(By.cssSelector("#passport_51_user"));
使用其他方式定位
在定位link元素的时候,可以使用link和link_text属性;
另外还可以使用tag_name属性定位任意元素;
定位多个元素
上面提到findElements()方法可以返回一个符合条件的元素List组。看下面例子。
- import java.io.File;
- import java.util.List;
- import org.openqa.selenium.By;
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.WebElement;
- import org.openqa.selenium.firefox.FirefoxBinary;
- import org.openqa.selenium.firefox.FirefoxDriver;
- public
class FindElementsStudy { - /**
- * @author gongjf
- */
- public
static
void main(String[] args) { - WebDriver driver = new FirefoxDriver();
- driver.get("http://www.51.com");
- //定位到所有<input>标签的元素,然后输出他们的id
- List<WebElement> element = driver.findElements(By.tagName("input"));
- for (WebElement e : element){
- System.out.println(e.getAttribute("id"));
- }
- driver.quit();
- }
- }
- 输出结果:
- passport_cookie_login
- gourl
- passport_login_from
- passport_51_user
- passport_51_password
- passport_qq_login_2
- btn_reg
- passport_51_ishidden
- passport_auto_login
上面的代码返回页面上所有input对象。很简单,没什么可说的。
层级定位
层级定位的思想是先定位父元素,然后再从父元素中精确定位出其我们需要选取的子元素。
层级定位一般的应用场景是无法直接定位到需要选取的元素,但是其父元素比较容易定位,通过定位父元素再
遍历其子元素选择需要的目标元素,或者需要定位某个元素下所有的子元素。
下面的代码演示了如何使用层级定位class为"login"的div,然后再取得它下面的所有label,并打印出他们的文
本
- import java.io.File;
- import java.util.List;
- import org.openqa.selenium.By;
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.WebElement;
- import org.openqa.selenium.firefox.FirefoxBinary;
- import org.openqa.selenium.firefox.FirefoxDriver;
- public
class LayerLocator { - /**
- * @author gongjf
- */
- public
static
void main(String[] args) { - WebDriver driver = new FirefoxDriver();
- driver.get("http://www.51.com");
- //定位class为"login"的div,然后再取得它下面的所有label,并打印出他们的值
- WebElement element = driver.findElement(By.className("login"));
- List<WebElement> el = element.findElements(By.tagName("label"));
- for(WebElement e : el)
- System.out.println(e.getText());
- }
- }
- 输出结果:
- 帐号:
- 密码:
- 隐身
- 下次自动登录
********************************************************************************************************************************************************************以下总结来自博客园(园主:qileilove)**************************************
webdriver提供了丰富的API,有多种定位策略:id,name,css选择器,xpath等,其中css选择器定位元素效率相比xpath要高些,使用id,name属性定位元素是最可靠,效率最高的一种办法。
1、工具选择:在我们开发测试脚本的过程中各个浏览器给我们也提供了方便定位元素的工具,我比较喜欢使用firefox的firebug工具,也是目前很多开发测试人员比较热衷的选择,原因是firefox是唯一能够集成selenium IDE的浏览器,并且firebug给用户提供了丰富的扩展组件,我们可以根据自己的需要来选择,一般情况下,使用firebug+firefinder就足够使用了,firefinder支持xpath以及css选择器定位元素的功能,很方便帮助我们调试测试脚本
2、元素定位的方法:findElement() 与 findElements()
findElement() 该方法返回基于指定查询条件的webElement对象,或抛出不符合条件的异常 eg:driver.findElement(By.id("userID"));
findElements() 该方法返回指定查询条件的WebElement的对象集合,或返回null
3、WebElement对象提供的各种定位元素策略
ID:driver.findElement(By.id(<elementID>)) Name:driver.findElement(By.name(<elementName>)) className:driver.findElement(By.className(<elementClassName>)) tagName:driver.findElement(By.tagName(<htmlTagName>)) linkText:driver.findElement(By.linkText(<linkText>)) partialLinkText:driver.findElement(By.partialLinkText(<partialLinkText>)) css:driver.findElement(By.cssSelector(<cssSelector>)) xpath:driver.findElement(By.xpath(<xpathQuery>)) |
4、webelement类提供了诸多方法,在我们开发脚本过程中如何选择最可靠,效率最高的方法,使用id,name
是首选,因为他们在html标签中是唯一的,所以是最可靠的
ID定位:driver.findElement(By.id("username"))
name定位:driver.findElement(By.name("username"))
class定位:driver.findElement(By.className("username"))
多学一招:WebElement类支持查询子类元素,如果页面中存在重复元素,但在不同div中,我们可以先定位到其父元素,然后定位其子元素,方法如下:
WebElement hello = driver.findElement(By.id("div1")).findElement(By.lindText("hello"));
5、使用WebElements定位多个相似的元素,比如页面中存在五个单选按钮,他们有相同的class属性,值为:myRadio,我们想对五个按钮循环操作,我们可以把它们全部取出来放到集合中,然后做循环操作,如下:
List<WebElement> radios = driver.findElements(By.className("myRadio")); for(int i = 0;i<radios.size();i++){ radios.get(i).click(); } |
其他定位方法与操作id,name类似,这里不再赘述,接下来我着重对css选择器与Xpath描述下
一、WebDriver 的By类中提供了cssSelector()方法,该方法使用有以下几种形式:
1、使用相对路径定位元素
如,我们要定为DOM中的input元素,我们可以这样操作,不考虑其在DOM中的位置,但这样做存在一定弊端,当DOM中存在多个input元素时,该方法总返回DOM中的第一个元素,这并不是我们所期待的
eg:WebElement username = driver.findElement(By.cssSelector("input"));
另外,为了使用这种方法更准确的定位元素,我们可以结合该元素的其他属性来实现精确定位的目的
a、结合id来定位,driver.findElement(By.cssSelector("input#username")); 在标签与id之间使用#连接,如果对css了解的朋友一看就知道为什么会这样写了,不了解也没关系,只要记住这种写法就OK了
另外该方法也可简写为driver.findElement(By.cssSelector("#username")); 有点儿类似于id选择器
b、使用元素的任何属性来定位元素
driver.findElement(By.cssSelector("标签名[属性名='属性值']"));
c、匹配部分属性值
^= driver.findElement(By.cssSelector("标签名[属性名^='xxx']")); 匹配属性值以xxx开头的元素 $= driver.findElement(By.cssSelector("标签名[属性名$='xxx']")); 匹配属性值以xxx结尾的元素 *= driver.findElement(By.cssSelector("标签名[属性名^='xxx']")); 匹配属性值包含xxx的元素 |
2、使用相对+绝对路径方法,这里是我自己定义的方法,方便记忆,的确也是这样来实现的
driver.findElement(By.cssSelector("div#login>input")) 该方法中"div#login>input" 首先通过相对路径定位到id为login的div元素,然后查找其子元素input(绝对路径)
二、使用xpath定位元素,相比cssSelector,xpath是我比较常用的一种定位元素的方式,因为它很方便,缺点是,消耗系统性能
1、使用绝对路径定位元素
driver.findElement(By.xpath("/html/body/div/form/input"))
2、使用相对路径定位元素
driver.findElement(By.xpath("//input")) 返回查找到的第一个符合条件的元素
3、使用索引定位元素,索引的初始值为1,注意与数组等区分开
driver.findElement(By.xpath("//input[2]")) 返回查找到的第二个符合条件的元素
4、结合属性值来定位元素
driver.findElement(By.xpath("//input[@id='username']"));
driver.findElement(By.xpath("//img[@alt='flowr']"));
5、使用逻辑运算符,结合属性值定位元素,and与or
driver.findElement(By.xpath("//input[@id='username' and @name='userID']"));
6、使用属性名来定位元素
driver.findElement(By.xpath("//input[@button]"))
7、类似于cssSlector,使用部分属性值匹配元素
starts-with() driver.findElement(By.xpath("//input[stars-with(@id,'user')]")) ends-with driver.findElement(By.xpath("//input[ends-with(@id,'name')]")) contains() driver.findElement(By.xpath("//input[contains(@id,"ernam")]")) |
8、使用任意属性值匹配元素
driver.findElement(By.xpath("//input[@*='username']"))
9、使用xpath轴来定位元素
这里略了,详见w3school.com
三、使用innerText定位元素
1、使用cssSelector查找innerText定位元素
driver.findElement(By.cssSelector("span[textContent='新闻']"));
2、使用xpath的text函数
driver.findElement(By.xpath("//span[contains(text(),'hello')]")) 包含匹配
driver.findElement(By.xpath("//span[text()='新闻']")) 绝对匹配
WebDriver元素查找方法摘录与总结的更多相关文章
- jQuery 的选择器常用的元素查找方法
jQuery 的选择器常用的元素查找方法 基本选择器: $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myE ...
- 浅析jQuery中常用的元素查找方法总结
本篇文章是对jQuery中常用的元素查找方法进行了详细的总结和介绍,需要的朋友参考下 $("#myELement") 选择id值等于myElement的元素,id值不能重复在文 ...
- jquery元素查找方法集锦
jQuery常用的元素查找方法总结 $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到 ...
- jQuery选择器总结 jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法
新年第一编文章 jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $("#myELement") 选择id值等于myElement的元素,id值 ...
- Selenium之WebDriver元素定位方法
Selenium WebDriver 只是 Python 的一个第三方框架, 和 Djangoweb 开发框架属于一个性质. webdriver 提供了八种元素定位方法,python语言中也有对应的方 ...
- jQuery常用的元素查找方法总结
$("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("di ...
- jQuery中常用的元素查找方法
$("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("div&q ...
- jquery元素查找方法
$("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("div&q ...
- jq上下级元素查找方法
1.parent([expr]) 获取指定元素的所有父级元素 2.next([expr]) 获取指定元素的下一个同级元素 3.nextAll([expr]) 获取指定元素后面的所有同级元素 4.and ...
随机推荐
- Linux sqlite3基本命令
简介sqlite3一款主要用于嵌入式的轻量级数据库,本文旨在为熟悉sqlite3基本命令提供技术文档. 备注:本文所有操作均在root用户下进行. 1.安装sqlite3 ubuntu下安装sqlit ...
- easyui datagrid 去掉 全选checkbox
在加载 表格的时候添加事件:onLoadSuccess 在事件中写入下面句,用空代替原有HTML 达到取消效果. $(".datagrid-header-check").html( ...
- LNMP结合discuz的配置
一.安装discuz 配置参照LAMP结合discuz的第一部分 不要忘记了 添加hosts~!!!! ===============我是分割线.========================== ...
- 在flask中返回requests响应
在flask服务端,有时候需要使用requests请求其他url,并将响应返回回去.查阅了flask文档,About Responses,可以直接构造响应结果进行返回. If a tuple is r ...
- git clone的
git clone git@e.coding.net:wudi360/*******.git
- bzoj 1483 链表 + 启发式合并
思路:将颜色相同的建成一个链表, 变颜色的时候进行链表的启发式合并.. 因为需要将小的接到大的上边,所以要用个f数组. #include<bits/stdc++.h> #define LL ...
- thinkphp5.0配置加载
ThinkPHP支持多种格式的配置格式,但最终都是解析为PHP数组的方式. PHP数组定义 返回PHP数组的方式是默认的配置定义格式,例如: //项目配置文件 return [ // 默认模块名 'd ...
- 编译PHP并与Ngnix整合
nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端. nginx一般是把请求发fastcgi管理进程处理,fascgi管 ...
- ref:phpstorm配置远程调试(xdebug)(docker中)
ref:https://www.cnblogs.com/yjken/p/6555438.html readme:本文设置远程调试ubuntu中的php代码. 在docker中也可以,经过测试phpin ...
- heartbeat与keepalived的区别
Heartbeat与Keepalived的区别 Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP):H ...