【定位页面元素】
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。
1.使用className进行定位
当所定位的元素具有class属性的时候我们可以通过classname来定位该元素。
下面的例子定位了51.com首页上class为"username"的li。
Java代码
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());
}
}
输出结果:
Java代码
Li
2.使用id属性定位
51.com首页的帐号输入框的html代码如下:
Java代码
<input id="passport_51_user" type="text" value="" tabindex="1" title="用户名/彩虹号/邮箱"
name="passport_51_user">
在下面的例子中用id定位这个输入框,并输出其title,借此也可以验证代码是否工作正常。
Java代码
public class ByUserId {
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"));
}
}
输出结果:
Java代码
用户名/彩虹号/邮箱
3.使用name属性定位
51.com首页的帐号输入框的html代码如下:
Java代码
<input id="passport_51_user" type="text" value="" tabindex="1" title="用户名/彩虹号/邮箱"
name="passport_51_user">
使用name定位
Java代码
public class ByUserId {
public static void main(String[] args) {
// TODO Auto-generated method stub
WebDriver dr = new FirefoxDriver();
dr.get("http://www.51.com");
WebElement e = dr.findElement(By.name("passport_51_user")); System.out.println(element.getAttribute("title"));
}
}
输出结果:
Java代码
用户名/彩虹号/邮箱
4.使用css属性定位
51.com首页的帐号输入框的html代码如下:
Java代码
<input id="passport_51_user" type="text" value="" tabindex="1" title="用户名/彩虹号/邮箱"
name="passport_51_user">
使用css定位
Java代码
WebElement e1 = dr.findElement(By.cssSelector("#passport_51_user"));
选择器:.class、#id、*、element、element>element、element+element、[attribute=value]
5.使用 XPATH定位
51.com首页的帐号输入框的html代码如下:
Java代码
<input id="passport_51_user" type="text" value="" tabindex="1" title="用户名/彩虹号/邮箱"
name="passport_51_user">
通过xpath查找:
Java代码
WebElement element =driver.findElement(By.xpath("//input[@id=' passport_51_user ']"));
语法:http://www.studyofnet.com/news/466.html
【robot framework的写法】
1;Xpath=//*[@id=”kw”]
//表示某个层级下 *表示某个标签名 @id=kw表示这个元素有个id等于kw
找上级
<form id=”form1” class=”fm” action=”/s” name=”f1” >
<span class=” bg s_ipt_wr”>
<input id=”kw1” class=”s_ipt” type=”text” maxlength=”100” name=”wd” utocpmplete=”off”>
找爸爸:
2;Xpath=//span[@class=”bg s_ipt_wr”]/input
如果爸爸没有唯一的属性值,可以找爷爷
Xpath=//form[@id=””form1]/span/input
一级一级往上找,直到找到html就是绝对路径
布尔值写法:
3;Xpath=//input[@id=”kw” and @name=”wd”]
先定位父级元素,再定位具体子元素:
WebElement类也可以支持查询子类元素。例如,假设页面上有一些重复的元素。但是,他们在不同的<div>中。可以先定位到其父元素<div>然后在定位其子元素,方法如下:
WebElement div = driver.findElement(By.id("div1"));
WebElement topLink = div.findElement(By.linkText("top"));
你也可以将他们缩写成一行:
WebElement topLink = driver.findElement
(By.id("div1")).findElement(By.linkText("top"));
6.使用其他方式定位
在定位link元素的时候,可以使用link和link_text属性;
假设页面元素写成这样:
<ahref="http://www.google.com/search?q=cheese">cheese</a>>
那么可以通过这样查找:
WebElement cheese =driver.findElement(By.linkText("cheese"));
另外还可以使用tag_name属性定位任意元素;
7.定位多个元素
上面提到findElements()方法可以返回一个符合条件的元素List组。看下面例子。
Java代码
public class FindElementsStudy {
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();
}
}
输出结果:
Java代码
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对象
8.层级定位
层级定位的思想是先定位父元素,然后再从父元素中精确定位出其我们需要选取的子元素。
层级定位一般的应用场景是无法直接定位到需要选取的元素,但是其父元素比较容易定位,通过定位父元素再遍历其子元素选择需要的目标元素,或者需要定位某个元素下所有的子元素。
下面的代码演示了如何使用层级定位class为"login"的div,然后再取得它下面的所有label,并打印出他们的文本
Java代码
public class LayerLocator {
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());
}
}
输出结果:
Java代码
帐号:
密码:
隐身