51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2248|回复: 2
打印 上一主题 下一主题

[转贴] selenium webdriver学习 04 – 定位页面元素

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-7-18 13:48:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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。
CODE:
  1. <font size="4">import org.openqa.selenium.WebDriver;
  2. import org.openqa.selenium.WebElement;
  3. import org.openqa.selenium.By;

  4. public class ByClassName {
  5.     publicstaticvoid main(String[] args) {
  6.          WebDriver driver = new FirefoxDriver();
  7.         driver.get("http://www.51.com");
  8.          WebElement element = driver.findElement(By.className("username"));
  9.          System.out.println(element.getTagName());
  10.     }
  11. }</font>
复制代码
输出结果:
CODE:
  1. <font size="4">
  2. </font>
复制代码
使用id属性定位
51.com首页的帐号输入框的html代码如下:
CODE:
  1. <font size="4"><input id="passport_51_user" tabindex="1" title="用户名/彩虹号/邮箱" type="text" name="passport_51_user" value="" /></font>
复制代码
在下面的例子中我们用id定位这个输入框,并输出其title,借此也可以验证代码是否工作正常。
CODE:
  1. <font size="4">import org.openqa.selenium.By;
  2. import org.openqa.selenium.WebDriver;
  3. import org.openqa.selenium.WebElement;
  4. import org.openqa.selenium.firefox.FirefoxDriver;

  5. public class ByUserId {
  6.     /**
  7.      * @param args
  8.      */
  9.     publicstaticvoid main(String[] args) {
  10.         // TODO Auto-generated method stub
  11.         WebDriver dr = new FirefoxDriver();
  12.         dr.get("http://www.51.com");

  13.         WebElement element = dr.findElement(By.id("passport_51_user"));
  14.         System.out.println(element.getAttribute("title"));
  15.     }
  16. }</font>
复制代码
输出结果:
CODE:
  1. <font size="4">用户名/彩虹号/邮箱</font>
复制代码
使用name属性定位
51.com首页的帐号输入框的html代码如下:
CODE:
  1. <font size="4"><input id="passport_51_user" tabindex="1" title="用户名/彩虹号/邮箱" type="text" name="passport_51_user" value="" /></font>
复制代码
使用name定位
CODE:
  1. <font size="4">WebElement e = dr.findElement(By.name("passport_51_user"));</font>
复制代码
使用css属性定位
51.com首页的帐号输入框的html代码如下:
CODE:
  1. <font size="4"><input id="passport_51_user" tabindex="1" title="用户名/彩虹号/邮箱" type="text" name="passport_51_user" value="" /></font>
复制代码
使用css定位
CODE:
  1. <font size="4">WebElement e1 = dr.findElement(By.cssSelector("#passport_51_user"));</font>
复制代码
使用其他方式定位
在定位link元素的时候,可以使用link和link_text属性;
另外还可以使用tag_name属性定位任意元素;
定位多个元素
上面提到findElements()方法可以返回一个符合条件的元素List组。看下面例子。
CODE:
  1. <font size="4">import java.io.File;
  2. import java.util.List;

  3. import org.openqa.selenium.By;
  4. import org.openqa.selenium.WebDriver;
  5. import org.openqa.selenium.WebElement;
  6. import org.openqa.selenium.firefox.FirefoxBinary;
  7. import org.openqa.selenium.firefox.FirefoxDriver;

  8. public class FindElementsStudy {

  9.     /**
  10.      * @author gongjf
  11.      */
  12.     publicstaticvoid main(String[] args) {
  13.         WebDriver  driver = new FirefoxDriver();
  14.         driver.get("http://www.51.com");

  15.         //定位到所有input标签的元素,然后输出他们的id
  16.         List element = driver.findElements(By.tagName("input"));
  17.         for (WebElement e : element){
  18.             System.out.println(e.getAttribute("id"));
  19.         }

  20.         driver.quit();
  21.     }
  22. }</font>
复制代码
输出结果:
CODE:
  1. <font size="4">passport_cookie_login
  2. gourl
  3. passport_login_from
  4. passport_51_user
  5. passport_51_password
  6. passport_qq_login_2
  7. btn_reg
  8. passport_51_ishidden
  9. passport_auto_login</font>
复制代码
上面的代码返回页面上所有input对象。很简单,没什么可说的。
层级定位
层级定位的思想是先定位父元素,然后再从父元素中精确定位出其我们需要选取的子元素。
层级定位一般的应用场景是无法直接定位到需要选取的元素,但是其父元素比较容易定位,通过定位父元素再遍历其子元素选择需要的目标元素,或者需要定位某个元素下所有的子元素。
下面的代码演示了如何使用层级定位class为”login”的div,然后再取得它下面的所有label,并打印出他们的文本
CODE:
  1. <font size="4">import java.io.File;
  2. import java.util.List;

  3. import org.openqa.selenium.By;
  4. import org.openqa.selenium.WebDriver;
  5. import org.openqa.selenium.WebElement;
  6. import org.openqa.selenium.firefox.FirefoxBinary;
  7. import org.openqa.selenium.firefox.FirefoxDriver;

  8. public class LayerLocator {

  9.     /**
  10.      * @author gongjf
  11.      */
  12.     publicstaticvoid main(String[] args) {

  13.         WebDriver  driver = new FirefoxDriver();
  14.         driver.get("http://www.51.com");

  15.         //定位class为"login"的div,然后再取得它下面的所有label,并打印出他们的值
  16.         WebElement element = driver.findElement(By.className("login"));
  17.          List el = element.findElements(By.tagName("label"));
  18.          for(WebElement e : el)
  19.         System.out.println(e.getText());

  20.     }

  21. }</font>
复制代码
输出结果:
CODE:
  1. <font size="4">帐号:
  2. 密码:
  3. 隐身
  4. 下次自动登录</font>
复制代码
定位页面元素over了,下次写一下对frame的处理。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-18 05:52 , Processed in 0.064014 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表