页面元素定位是自动化中最重要的事情, selenium Webdriver 提供了很多种元素定位的方法。  测试人员应该熟练掌握各种定位方法。 使用最简单,最稳定的定位方法。

自动化测试步骤

定位元素》操作元素》验证操作结果》记录测试结果

在自动化测试过程中, 测试程序通常的操作页面元素步骤

1. 找到Web的页面元素,并赋予到一个存储对象中 (WebElement)

2. 对存储页面元素的对象进行操作, 例如:点击链接,在输入框中输入字符等

3. 验证页面上的元素是否符合预期

定位方法

使用WebDriver对象的findElement函数定义一个Web页面元素

使用findElements函数可以定位页面的多个元素

定位的页面元素需要使用WebElement对象来存储,以便后续使用

常用的定位页面元素方法如下,   按推荐排序

如何定位

在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回元素句柄来定位元素

findElement() 方法返回一个元素, 如果没有找到,会抛出一个异常 NoElementFindException()

findElements()方法返回多个元素, 如果没有找到,会返回空数组, 不会抛出异常

如何选择 定位方法

策略是, 选择简单,稳定的定位方法。

1. 当页面元素有id属性的时候, 尽量使用id来定位。  没有的话,再选择其他定位方法

2. cssSelector  执行速度快, 推荐使用

3. 定位超链接的时候,可以考虑linkText或partialLinkText: 但是要注意的是 ,  文本经常发生改变, 所以不推荐用

3. xpath 功能最强悍。 当时执行速度慢,因为需要查找整个DOM,  所以尽量少用。  实在没有办法的时候,才使用xpath

通过ID查找元素: By.id()

通过页面元素的ID来查找元素是最为推荐的方式, W3C标准推荐开发人员为每一个页面元素都提供独一无二的ID属性

一旦元素被赋予了唯一的ID属性.,  我们做自动化测试的时候,很容易定位到元素.  元素的ID被作为首选的识别属性, 因为是最快的识别策略.

以百度主页为例,  搜索框的HTML示例代码如下,   它的ID为kw

<input type="text" autocomplete="off" maxlength="" id="kw" name="wd" class="s_ipt">

"百度一下"搜索按钮元素的HTML示例代码如下,   它ID为su

<input type="submit" class="btn self-btn bg s_btn" id="su" value="百度一下">

在Selenium/WebDriver 中通过ID查找元素的Java示例代码如下

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver; public class Helloworld { public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.chrome.driver",
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
//设置chromedriver的环境变量路径
WebDriver driver = new ChromeDriver();//创建chromedriver对象
driver.manage().window().maximize(); //使窗体最大化
driver.get("https://www.baidu.com");//获取url
WebElement element = driver.findElement(By.id("kw"));
element.sendKeys("java+selenium");
WebElement b = driver.findElement(By.id("su"));
b.submit();
Thread.sleep();//在页面停留五秒
driver.close();
driver.quit();//quit()方法关闭浏览器
}
}

通过Name查找元素:By.name()

以百度主页为例

WebElement  element = driver.findElement(By.name("wd"));
element.sendKeys("java+selenium");

通过TagName查找元素: By.tagName()

通过tagName来搜索元素的时候,会返回多个元素. 因此需要使用findElements()

List<WebElement> buttons = driver.findElements(By.tagName("div"));
System.out.println("Button:" + buttons.size());

注意:  如果使用tagName,  要注意很多HTML元素的tagName是相同的,

比如单选框,复选框, 文本框,密码框.这些元素标签都是input.  此时单靠tagName无法精确获取我们想要的元素, 还需要结合type属性,才能过滤出我们要的元素

List<WebElement> a = driver.findElements(By.tagName("input"));
for(WebElement b:a){
if (b.getAttribute("type").equals("text")) {
System.out.println("input text is :" + b.getText());
}
}

通过ClassName 查找元素 By.className

以淘宝网的主页搜索为例, 其搜索框的HTML代码如下:   class="search-combobox-input"

<input autocomplete="off" autofocus="true" accesskey="s" aria-label="请输入搜索文字" name="q" id="q" class="search-combobox-input"
aria-haspopup="true" aria-combobox="list" role="combobox" x-webkit-grammar="builtin:translate" tabindex="">

Java 示例代码如下

WebDriver driver  = new FirefoxDriver();
driver.get("http://www.taobao.com");
Thread.sleep();
WebElement searchBox = driver.findElement(By.className("search-combobox-input")); searchBox.sendKeys("羽绒服");
searchBox.submit();

注意:使用className 来进行元素定位时, 有时会碰到一个

通过LinkText查找元素 By.linkText();

<a href="https://passport.baidu.com/v2/?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2F&amp;sms=5"
name="tj_login" class="lb" onclick="return false;">登录</a>

java代码

WebElement element = driver.findElement(By.linkText("登录"));
element.click();

通过PartialLinkText 查找元素 By.partialLinkText()

此方法是上一个方法的加强版, 单你只想用一些关键字匹配的时候,可以使用这个方法,通过部分超链接文字来定位元素

java 代码如下

WebElement loginLink = driver.findElement(By.partialLinkText("登"));
loginLink.click();

注意:用这种方法定位时, 可能会引起的问题是, 当你的页面中不知一个超链接包含“等”时, findElement方法只会返回第一个查找到的元素,而不会返回所有符合条件的元素

如果你想要获得所有符合条件的元素,还是只能用findElements方法

xpath定位

xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面,所以我们可以使用Xpath 的用法来定位页面元素。

xpath定位缺点

xpath 这种定位方式, webdriver会将整个页面的所有元素进行扫描以定位我们所需要的元素, 这是个非常费时的操作,  如果脚本中大量使用xpath做元素定位的话, 脚本的执行速度可能会稍慢

一旦页面结构发生改变,改路径也随之失效,必须重新。 所以不推荐使用绝对路径的写法

绝对路径定位方式

/html/body/div/input[@value="查询"]

WebElement button = driver.findElement(By.xpath("/html/body/div/input[@value='查询']"));

绝对路径  以 "/"  开头, 让xpath 从文档的根节点开始解析

相对路径  以"//" 开头, 让xpath 从文档的任何元素节点开始解析

相对路径定位方式

//input[@value="查询"]

WebElement button = driver.findElement(By.xpath("//input[@value='查询']"));

使用索引号定位

WebElement button = driver.findElement(By.xpath("//input[2]"));

使用页面属性定位

定位被测试页面中的第一个图片元素

//img[@alt='div1-img1']
WebElement button = driver.findElement(By.xpath("//img[@alt='div1-img1']"));

模糊定位start-with关键字

查找图片alt属性开始位置包含'div1'关键字的元素

//img[starts-with(@alt,'div')]

模糊定位contains关键字

查找图片alt属性包含'g1'关键字的元素

//img[contains(@alt,'g1')]

text()函数 文本定位

查找所有文本为"百度搜索" 的元素

driver.findElement(By.xpath("//*[text()='百度搜索']"));

查找所有文本为“搜索” 的超链接

driver.findElement(By.xpath("//a[contains(text(),'搜索')]"));

一下罗列的都是从w3school筛选的,也是常用的一些xpath的语法和函数,牢记:

重点需牢记:

CSS定位

CSS定位相对于XPath定位的优点是:css定位更快,语法更简洁。

1、通过id属性定位,需要加上标识符“#”,如:#kw;

element = driver.findElement(By.cssSelector("#kw"));
element.sendKeys("selenium");

2、通过class属性定位,需要加上标识符 “.”,如:.s_ipt;

element = driver.findElement(By.cssSelector(".s_ipt"));
element.sendKeys("selenium");

3、通过标签属性定位,不需要任何标示符,如:input;

//这里运行会报错,因为标签“input”不是唯一的;这里主要是了解写法
element = driver.findElement(By.cssSelector("input"));
element.sendKeys("selenium");

4.以下是定位其它属性的格式;

1)CSS通过name属性定位元素;

element = driver.findElement(By.cssSelector("#su"));
element.click();

2)CSS:通过autocomplete属性定位元素;

element = driver.findElement(By.cssSelector("[autocomplete = 'off']"));
element.sendKeys("autocomplete");

3)CSS通过type属性定位元素;

element = driver.findElement(By.cssSelector("[type = 'submit']"));
element.click();

5.css页可以通过标签与属性的组合来定位元素;

1)CSS通过标签与id属性组合定位元素;

element =driver.findElement(By.cssSelector("input#kw"));
element.sendKeys("selenium");

2)CSS通过标签与class属性定位元素;

element = driver.findElement(By.cssSelector("input.s_ipt"));
element.sendKeys("selenium");

3)CSS通过标签与其它属性组合定位元素;

element = driver.findElement(By.cssSelector("input[autocomplete = 'off']"));
element.sendKeys("selenium");

6.CSS:层级关系定位

//form的id属性
element = driver.findElement(By.cssSelector("form#form>span>input"));
element.sendKeys(""); //form的class属性
element = driver.findElement(By.cssSelector("form.fm>span>input"));
element.sendKeys("");

7.CSS:索引

css也可以通过索引option:nth-child(1)来定位子元素,这点与xpath写法用很大差异;其实很好理解,直接翻译过来就是第几个小孩;

element = driver.findElement(By.cssSelector("select#ft>option:nth-child(1)"));
element.click(); element = driver.findElement(By.cssSelector("select#ft>option:nth-child(2)"));
element.click(); element = driver.findElement(By.cssSelector("select#ft>option:nth-child(3)"));
element.click();

selenium+java二元素定位的更多相关文章

  1. Python3-Selenium自动化测试框架(二)之selenium使用和元素定位

    Selenium自动化测试框架(二)之selenium使用和元素定位 (一)selenium的简单使用 1.导包 from selenium import webdriver 2.初始化浏览器 # 驱 ...

  2. selenium自动化之元素定位方法

    在使用selenium webdriver进行元素定位时,有8种基本元素定位方法(注意:并非只有8种,总共来说,有16种). 分别介绍如下: 1.name定位 (注意:必须确保name属性值在当前ht ...

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

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

  4. Selenium 八种元素定位方法

    前言: 我们在做WEB自动化时,最根本的就是操作页面上的元素,首先我们要能找到这些元素,然后才能操作这些元素.工具或代码无法像我们测试人员一样用肉眼来分辨页面上的元素.那么我们怎么来定位他们呢? 在学 ...

  5. selenium常见的元素定位方法

    一.获取元素 1)通过谷歌浏览器自动的工具访问百度首页,我们可以看到,页面上的元素都是由一行行的代码组成的,它们之间有层级地组织起来,每个元素之间都有不同的标签和值,我们可以通过这些不同的标签和值来找 ...

  6. Selenium(一):元素定位

    一.Selenium 8种定位方式 baidu.html <form id="form" name="f" action="/s" c ...

  7. selenium+python自动化元素定位

    最近学习自动化测试,终于初步学习完成,需要进行博客日志总结,加深巩固自己的知识. 元素的八种定位方式 1.id 以百度为例子 我们在python输入的元素定位语法:bs.find_element_by ...

  8. selenium webdriver python 元素定位

    总结   定位查找时,返回查找到的第一个match的元素.如果找不到,则 raise NoSuchElementException   单个元素定位: find_element_by_idfind_e ...

  9. Selenium之WebDriver元素定位方法

    Selenium WebDriver 只是 Python 的一个第三方框架, 和 Djangoweb 开发框架属于一个性质. webdriver 提供了八种元素定位方法,python语言中也有对应的方 ...

随机推荐

  1. (转载)js日期格式化转化

    原文地址:http://www.cnblogs.com/zhangpengshou/archive/2012/07/19/2599053.html // 对Date的扩展,将 Date 转化为指定格式 ...

  2. EntityFramework Core:版本不一致问题

    code first 更新数据库时候报版本不对或者未找到错误 解决方法: 在项目文件中添加以下节点: <PropertyGroup> <OutputType>Library&l ...

  3. thrift常见异常及原因分析(updating)

    [org.apache.thrift.TException家族] [Thrift架构] 以下是thrift的客户端和服务端交互的一个原理图.可以看到遵循了rpc框架的传输层.协议层和应用层三层.本文提 ...

  4. windows 下安装weblogic

    下载weblogic安装文件 https://www.oracle.com/technetwork/middleware/weblogic/downloads/index.html 在目录下, 下载后 ...

  5. C++---使用VS在C++编程中出现 fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?

    啦啦啦,好久没写博客啦... 对于C++初学者来说适应一个新的编译器还是需要蛮长一段时间的,现在我就给你们说说标题所说的这个问题吧... 第一步:菜单--〉项目--〉设置,出现“项目设置”对话框,左边 ...

  6. Visual Studio Git本地Repos和GitHub远程Repos互操作

    近期准备将一个项目开源到GitHub中,N-Sharding,.Net版本的分库分表数据访问框架.中间遇到了点小问题,整理了一下. 1. GitHub上Create New Repos 2. 代码Ch ...

  7. Docker学习资源

    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口. ...

  8. 复制ASP.NET的ASHX、aspx文件的注意事项

    在复制ashx文件后,需要在夫指出的文件上右键——打开方式——点击“”源代码文本编辑器“”  ashx在你新建的时候它已经指定了执行的命名空间你后面再去修改文件名或者里边的类名它的指定也不会变 这是因 ...

  9. LP-KPN

    LP-KPN 网络结构 网络解析 1. 网络结构中绿色星星标志 公式.其实就是用预测出来的核在原图片经过Laplacian pyramid decomposes 后的图片上进行卷积运算.所以应该使用p ...

  10. python 2 和 python 3 的区别

    p2:重复代码语言不统一不支持中文input() 输入数字 获取数字输入字符串必须自己手动写引号raw_input 和p3中的 input 一样print可以加括号 也可以不加括号p2 中除法获取到的 ...