selenium webdriver(2)---页面对象定位
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)---页面对象定位的更多相关文章
- java selenium webdriver实战 页面元素定位
自动化测试实施过程中,测试程序中常用的页面操作有三个步骤 1.定位网页上的页面元素,并存储到一个变量中 2.对变量中存储的页面元素进行操作,单击,下拉或者输入文字等 3.设定页面元素的操作值,比如,选 ...
- Python3.x:Selenium中的webdriver进行页面元素定位
Python3.x:Selenium中的webdriver进行页面元素定位 页面上的元素就像人一样,有各种属性,比如元素名字,元素id,元素属性(class属性,name属性)等等.webdriver ...
- Selenium webdriver 学习总结-元素定位
Selenium webdriver 学习总结-元素定位 webdriver提供了丰富的API,有多种定位策略:id,name,css选择器,xpath等,其中css选择器定位元素效率相比xpath要 ...
- python selenium 多个页面对象类使用同一个webdriver(即只打开一个浏览器窗口)
1 class BasePage(): 2 """selenium基类""" 3 4 def __init__(self, driver=N ...
- 解决Selenium弹出新页面无法定位元素问题(Unable to locate element)
Python 2.7 IDE Pycharm 5.0.3 环境细节详见Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录 对于同一页面无法定位元素问题请见姊妹篇解 ...
- selenium webdriver 实例化浏览器对象
public static FirefoxDriver FFSetting() { System.setProperty("webdriver.firefox.bin", &quo ...
- Java + Selenium + WebDriver八大元素定位方式
UI自动化测试的第一步就是进行元素定位,下面给大家介绍一下Selenium + WebDriver的八大元素定位方式.现在我们就以百度搜索框为例进行元素定位,如下图: 一.By.name() Java ...
- python+selenium—webdriver入门(二)
本文中主要介绍webdriver常见的对象定位方法: 一.对象定位的目的 二.常见的对象定位方法 一.对象定位的目的: 1.操作对象 2.获得对象的属性,如:对象的class属性.name属性等 3. ...
- selenium webdriver(3)---操作页面对象
页面对象的相关操作可以通过接口文件org.openqa.selenium.WebElement查看,本文只是对象接口的使用方式,具体的实现方式在org.openqa.selenium.remote.R ...
随机推荐
- 鼠标操作[OpenCV 笔记10]
) winname 窗口名字 onMouse 指定窗口每次鼠标事件发生的时候,被调用的函数指针.函数的原型应为void Foo(int event, int x, int y, int flags, ...
- ios 64位下编译webrtc的libvpx库出现错误Bad cputype for object file.Currently only tested for CPU_TYPE_x86_64
diff --git a/libvpx.gyp b/libvpx.gypindex 4f8cb2b..4eb6866 100644--- a/libvpx.gyp+++ b/libvpx.gyp@@ ...
- (转) UIALertView的基本用法与UIAlertViewDelegate对对话框的事件处理方法
首先,视图控制器必须得实现协议UIAlertViewDelegate中的方法,并指定delegate为self,才能使弹出的Alert窗口响应点击事件. 具体代码如下: #import <UIK ...
- jquery 插件的编写
/** * 插件的学习 * 原文地址:http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html#home */ ;(function($, ...
- Winform打包发布图解
最近,机房收费系统的个人版接近尾声,到了打包发布的时刻.VB.NET的打包发布与VB6.0的打包发布存在不小的差别.下面我们来详细看一下如果打包发布. 第一步: 打开VS,新建项目,选择其他项目类型- ...
- java String字符串——进度1
String字符串 在JAVA中提供了多种创建字符串对象的方法,这里介绍最简单的两种, 第一种是直接赋值, 第二种是使用String类的构造方法: 如下所示: Strin ...
- nginx Engine X静态网页服务器介绍
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. 反向代理(Reverse Proxy)方 ...
- php练习2——乘法表,变量的使用
目标:输出九九乘法表 程序: 结果: 目标: 程序variable01.html和variable01.php 结果:
- Laravel学习第一天(创建laravel项目、路由、视图、blade模板)
创建laravel项目 composer create-project laravel/laravel learnlv 4.1.* 查看帮助:composer create-project 使用 ...
- TDirectory.GetCreationTime、TDirectory.SetCreationTime获取和设置文件夹创建时间
使用函数: System.IOUtils.TDirectory.GetCreationTime//获取创建时间 System.IOUtils.TDirectory.SetCreationTime//设 ...