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. angularJS的核心特性

    前几天师傅让我了解一下angularJS,angularJS是一个前端框架,具体的优缺点和运用场景我现在也还没有搞清楚,暂时就先不做描述了,留到运用以后进行补充吧. angularJS四大核心特性:M ...

  2. JAVA学习-JAVA环境准备

    dir:列出当前目录下的文件以及文件夹md:  创建目录rd:  删除目录cd: 进入指定的目录,打开文件夹cd..:退回到上一级目录cd/或cd\:退回到根目录del:删除文件d: : 切换到D盘根 ...

  3. java_UML:继承/泛化、实现、依赖、关联、聚合、组合的联系与区别 (2016-07-12)

    分别介绍这几种关系: UML关系:继承(泛化).实现.依赖.关联.聚合.组合的联系与区别 一.表示符号上的区别 二.具体区别与联系 1. 继承/泛化(Generalization) [泛化关系]:是一 ...

  4. UVA 11732 strcmp() Anyone?(Trie的性质)

    strcmp() Anyone? strcmp() is a library function in C/C++ which compares two strings. It takes two st ...

  5. 理解Http协议(一)

    本文对Http协议进行了简要的描述,说明了其用途的广泛性:通过代码对Http连接和Http请求消息的发送进行实现,希望能将这些抽象的过程直观的显示出来:最后对HttpURL和Http协议中“资源”这些 ...

  6. python 自动化之路 day 08 面向对象进阶

    面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 面向对象高级语法部分 经典类vs新式类 把下面代码用python2 和python3都执行一下 1 2 ...

  7. Centos系统安装

    Centos系统安装 安装系统前的注意事项 1) 硬件CPU必须支持虚拟化技术,在支持虚拟化的前提下我们还要去把虚拟 的功能打开否则在安装的时候会报错,开启虚拟化需要在BIOS中开启 2)创建虚拟机的 ...

  8. Ajax--1

    1.Ajax:组合利用javascript.XML和DOM等技术,在无需要刷新页面的前提下实现浏览器与服务器通信.它在用户和服务器之间引入了一个中间层,负责转发用户界面和服务器之间的交互.在服务器处理 ...

  9. 响应式页面字体用什么单位:rem

    html:62.5%//10pxbody:1.4rem;//14px... <!doctype html> <html> <head> <title>a ...

  10. 【 java版坦克大战--绘图技术】 绘制坦克

    通过上一节,我们学会的用java绘图.那现在就用java绘制自己坦克. 首先通过分析坦克由这几部分组成.如图 各个部件的长宽如图.15,10为圆心. /** * 坦克游戏的1.0版 * 1.画出坦克 ...