webdriver的元素定位很灵活,提供了多种定位方式:

  • Id
  • LinkText
  • PartialLinkText
  • Name
  • TagName
  • Xpath
  • ClassName
  • CssSelector

这些方法可以在org.openqa.selenium.By中找到,下面一一道来

假如有这样的需求:登录安居客网站,搜索陆家嘴附近的二手房源,网页是这样的

这个需求涉及到一个输入框和一个提交按钮,先查看网页源码

在输入框中输入“陆家嘴”然后点击“二手房”按钮,如果能跳转到陆家嘴相关页面就完成了这个需求,我们尝试用webdriver提供的元素定位方法来解决

Id

id是唯一标识,通过id来定位是非常快速和准确的

 import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebElement; public class NewTest
{
public static void main(String[] args)
{
System.setProperty("webdriver.chrome.driver",
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://anjuke.com"); //id
WebElement text=driver.findElement(By.id("glb_search0"));
text.sendKeys("陆家嘴");
WebElement button=driver.findElement(By.id("btnSubmit"));
button.click(); if(driver.getTitle().contains("陆家嘴"))
System.out.print("搜索成功,当前页面为"+driver.getTitle());
else
System.out.print("搜索失败,当前页面为"+driver.getTitle()); driver.quit();
}
}
 Name

提交表单时可以通过name属性获取数据,较id来说并不常用,有id属性时建议优先使用id属性,上面的源码中text输入框是有name属性的,button依然用id来获取(当然,如果测试需要的话可以修改源码,没有修改源码权限的自动化测试是很难进行的)。

 import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebElement; public class NewTest
{
public static void main(String[] args)
{
System.setProperty("webdriver.chrome.driver",
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://anjuke.com"); //name
WebElement text=driver.findElement(By.name("kw"));
text.sendKeys("陆家嘴");
WebElement button=driver.findElement(By.id("btnSubmit"));
button.click(); if(driver.getTitle().contains("陆家嘴"))
System.out.print("搜索成功,当前页面为"+driver.getTitle());
else
System.out.print("搜索失败,当前页面为"+driver.getTitle()); driver.quit();
}
}
 TagName

tagname一般用来获取批量数据,如统计页面链接数,输入框数量等等,用tagname来定位单一元素有点麻烦

 import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebElement; public class NewTest
{
public static void main(String[] args)
{
System.setProperty("webdriver.chrome.driver",
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://anjuke.com"); List<WebElement> inputs=driver.findElements(By.tagName("input"));
for(int index=0;index<inputs.size();index++){
if(inputs.get(index).getAttribute("id").equals("glb_search0"))
inputs.get(index).sendKeys("陆家嘴");
if(inputs.get(index).getAttribute("id").equals("btnSubmit"))
inputs.get(index).click();
} if(driver.getTitle().contains("陆家嘴"))
System.out.print("搜索成功,当前页面为"+driver.getTitle());
else
System.out.print("搜索失败,当前页面为"+driver.getTitle()); driver.quit();
}
}
ClassName

当标签具有class属性时也可使用classname来定位,不过要注意class的值不是唯一的findElement方法返回匹配到的第一个元素

 import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebElement; public class NewTest
{
public static void main(String[] args)
{
System.setProperty("webdriver.chrome.driver",
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://anjuke.com"); //classname
WebElement text=driver.findElement(By.className("kw"));
text.sendKeys("陆家嘴");
WebElement button=driver.findElement(By.className("btn"));
button.click(); if(driver.getTitle().contains("陆家嘴"))
System.out.print("搜索成功,当前页面为"+driver.getTitle());
else
System.out.print("搜索失败,当前页面为"+driver.getTitle()); driver.quit();
}
}
Xpath

xpath相关教程可以参考w3school上的教程,为了程序的统一性,平时工作中我都是使用xpath来定位元素的

 import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebElement; public class NewTest
{
public static void main(String[] args)
{
System.setProperty("webdriver.chrome.driver",
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://anjuke.com"); //xpath
WebElement text=driver.findElement(By.xpath("//input[@id='glb_search0']"));
text.sendKeys("陆家嘴");
WebElement button=driver.findElement(By.xpath("//input[@id='btnSubmit']"));
button.click(); if(driver.getTitle().contains("陆家嘴"))
System.out.print("搜索成功,当前页面为"+driver.getTitle());
else
System.out.print("搜索失败,当前页面为"+driver.getTitle()); driver.quit();
}
}
CssSelector

CssSelector教程可以参考css3-selectors,CssSelector和xpath应该是实际工作中用的最多的定位方法了,两者没有优劣之分,看个人喜好吧。

 import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebElement; public class NewTest
{
public static void main(String[] args)
{
System.setProperty("webdriver.chrome.driver",
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://anjuke.com"); //cssSelector
WebElement text=driver.findElement(By.cssSelector("input[id='glb_search0']"));
text.sendKeys("陆家嘴");
WebElement button=driver.findElement(By.cssSelector("input[id='btnSubmit']"));
button.click(); if(driver.getTitle().contains("陆家嘴"))
System.out.print("搜索成功,当前页面为"+driver.getTitle());
else
System.out.print("搜索失败,当前页面为"+driver.getTitle()); driver.quit();
}
}
LinkText和PartialLinkText

LinkText和PartialLinkText用来定位网页中的超链接,需要a标签中的全部或部分内容即可。例如,需要访问热门版块中的古美罗阳可以这样定位

 import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebElement; public class NewTest
{
public static void main(String[] args)
{
System.setProperty("webdriver.chrome.driver",
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://anjuke.com"); //linkText
WebElement a=driver.findElement(By.linkText("古美罗阳"));
a.click();
//partialLinkText
//WebElement a=driver.findElement(By.partialLinkText("古美"));
//a.click();
if(driver.getTitle().contains("古美罗阳"))
System.out.print("访问成功,当前页面为"+driver.getTitle());
else
System.out.print("访问失败,当前页面为"+driver.getTitle()); driver.quit();
}
}
 层级定位

webdriver提供了层级定位的方式即通过父元素访问其子元素,比如,输出热门版块下的所有版块

 import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.WebElement; public class NewTest
{
public static void main(String[] args)
{
System.setProperty("webdriver.chrome.driver",
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://anjuke.com"); WebElement element=driver.findElement(By.xpath("//div[@id='content_Rd0']/dl[@class='dl0']/dd")); List<WebElement> links=element.findElements(By.tagName("a")); for(int index=0;index<links.size();index++){
System.out.println(links.get(index).getAttribute("text"));
} driver.quit();
}
}

selenium webdriver(2)---页面对象定位的更多相关文章

  1. java selenium webdriver实战 页面元素定位

    自动化测试实施过程中,测试程序中常用的页面操作有三个步骤 1.定位网页上的页面元素,并存储到一个变量中 2.对变量中存储的页面元素进行操作,单击,下拉或者输入文字等 3.设定页面元素的操作值,比如,选 ...

  2. Python3.x:Selenium中的webdriver进行页面元素定位

    Python3.x:Selenium中的webdriver进行页面元素定位 页面上的元素就像人一样,有各种属性,比如元素名字,元素id,元素属性(class属性,name属性)等等.webdriver ...

  3. Selenium webdriver 学习总结-元素定位

    Selenium webdriver 学习总结-元素定位 webdriver提供了丰富的API,有多种定位策略:id,name,css选择器,xpath等,其中css选择器定位元素效率相比xpath要 ...

  4. python selenium 多个页面对象类使用同一个webdriver(即只打开一个浏览器窗口)

    1 class BasePage(): 2 """selenium基类""" 3 4 def __init__(self, driver=N ...

  5. 解决Selenium弹出新页面无法定位元素问题(Unable to locate element)

    Python 2.7 IDE Pycharm 5.0.3 环境细节详见Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录 对于同一页面无法定位元素问题请见姊妹篇解 ...

  6. selenium webdriver 实例化浏览器对象

    public static FirefoxDriver FFSetting() { System.setProperty("webdriver.firefox.bin", &quo ...

  7. Java + Selenium + WebDriver八大元素定位方式

    UI自动化测试的第一步就是进行元素定位,下面给大家介绍一下Selenium + WebDriver的八大元素定位方式.现在我们就以百度搜索框为例进行元素定位,如下图: 一.By.name() Java ...

  8. python+selenium—webdriver入门(二)

    本文中主要介绍webdriver常见的对象定位方法: 一.对象定位的目的 二.常见的对象定位方法 一.对象定位的目的: 1.操作对象 2.获得对象的属性,如:对象的class属性.name属性等 3. ...

  9. selenium webdriver(3)---操作页面对象

    页面对象的相关操作可以通过接口文件org.openqa.selenium.WebElement查看,本文只是对象接口的使用方式,具体的实现方式在org.openqa.selenium.remote.R ...

随机推荐

  1. leetcode342——Power of Four(C++)

    Given an integer (signed 32 bits), write a function to check whether it is a power of 4. Example:Giv ...

  2. ubuntu server 安装

    http://tigerlchen.iteye.com/blog/1765765  解决CDROM找不到的bug

  3. 【搭建开发环境】在 Windows XP 中参与开源项目,搭建 git 和 cygwin 开发环境

    引言 只有一台 Windows XP 家用机,却想在诸如 Git@OSC 之类的开源社区参与开发,本文提供一个入门级的开发环境搭建指引. 涉及工具:Eclipse,EGit,Cygwin. 欢迎来到 ...

  4. 如何查看MySQL中每张表占用的空间大小

    如题,找到MySQL中的information_schema表,这张表记录了所有数据库中表的信息,主要字段含义如下: TABLE_SCHEMA : 数据库名 TABLE_NAME:表名 ENGINE: ...

  5. mongodb3.2系统性学习——2、write concern mongodb 写安全机制

    为了尊重作者原文章位置:http://kyfxbl.iteye.com/blog/1952941 首先讲一下mongodb 的写操作过程: mongodb有一个write concern的设置,作用是 ...

  6. php设计模式:工厂模式

    php设计模式:工厂模式 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂模式实现: 工厂模式中任何创建对象的工厂类都要实现这个接口,实现接口的方法体中都要实现接口中的方法,它声明 ...

  7. mongodb篇二:mongodb克隆远程数据库,去重查询的命令及对应java语句

    http://blog.csdn.net/qkxh320/article/details/16115671 1.首先操作mongodb最基本命令:: show databases;           ...

  8. .NET笔试题(关于迭代的:遍历XML中的FileName)

    一.使用迭代算法,遍历XML文件中所有的文件名 写一个函数返回文件名集合 在主函数中调用该方法: 以后有关迭代的都写到这儿

  9. Sublime Text 3 若干问题解决办法

    1.在高分屏下中文文件夹名显示异常问题解决办法 新买了个2K的屏,有些中文文件夹名全部变成了“口口”. 在“preferences” - "设置-用户" 添加 "dpi_ ...

  10. 如何使用Github仓库创建网站

    官方文档:https://help.github.com/categories/github-pages-basics/ 1.创建一个仓库 2.额外建立一个gh-pages分支 3.添加CNAME文件 ...