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. 【CODECHEF】【phollard rho + miller_rabin】The First Cube

    All submissions for this problem are available. Read problems statements in Mandarin Chinese and Rus ...

  2. greenplum学习

    公司TM蛋疼,动不动让你学习新东西,就是不让你闲下来,本着胳膊拧不过大腿定律,忍了,这是背景. 好吧哥端起一本厚厚的<GreenPlum企业应用实战>,打开百度开始GP的学习之路: GP只 ...

  3. go build 时报错 cc1.exe: sorry, unimplemented: 64-bit mode not compiled in

    最近在玩Go win下尝试编译Go的时候遇到了下面提示(可能是gorocksdb用到了gcc) gcc也需要64位的 最后找到了个帖子: https://github.com/mattn/go-sql ...

  4. 使用SqlBulkCopy批量插入多条数据进入表中

    由于工作中项目需求结算一次生成一批相同批次号的数据插入一个表中,然后再通过另一页面展示出来,所以需要用到一次性插入一批数据,所以就采用了SqlBulkCopy插入一批数据 1 public stati ...

  5. Check Mysql Database Size

    SELECT ROUND( SUM(data_length + index_length) / 1024 / 1024 ) TOTAL_MB, ROUND(SUM(data_length) / 102 ...

  6. SSH框架jar神包

    SSH JAR包链接(https://zhidao.baidu.com/share/ac8b1389bac84023d7442cad88f3933c.html)

  7. javascript 写状态模式

    写了状态模式的切换,以及分支循环.but 怎么实现子状态嵌套呢? /** * by JackChen 2016-3-26 11.51.20 * * 状态模式: * 一个状态到另一个状态的变换.其实可以 ...

  8. HDU1004 (数组元素出现最多)

    HDU1004 思路:求数组中出现次数最多的那个元素: 遍历数组元素,找出每个元素出现的次数 Input Input contains multiple test cases. Each test c ...

  9. 【译】4个你需要知道的Asset Catalog的秘密

    本文由CocoaChina译者 @唧唧歪歪 翻译,作者:Hector Matos 原文:4 XCODE ASSET CATALOG SECRETS YOU NEED TO KNOW 恶梦 想象你正在干 ...

  10. IE filter & z-index bug

    对最近遇到的2个问题的一点总结. 1.IE filter & z-index 重构后的首页即将上线,测试提出fix导航条扩展菜单在ie789滚动后一段无法显示的问题. 疑云重重: 这个问题一开 ...