selenium进行自动化测试的一个很重要的东西那就是元素定位,如果元素都没法定位就无法操作它,也就无法进行自动化测试了。网上对于元素定位有很多的介绍,很详细很详细的,但是依然有很多新手总是会遇到无法定位的情况,在这里自己总结下元素定位。

先来看元素定位的方式

          //使用id定位
          userName = driver.findElement(By.id("TANGRAM__PSP_8__userName"));
          //使用class定位
          userName = driver.findElement(By.className("pass-text-input pass-text-input-userName"));
          //使用name定位
          userName = driver.findElement(By.name("userName"));
          //使用xpath定位
             //绝对路径
          userName = driver.findElement(By.xpath("/html/body/div[6]/div[2]/div[2]/div/div/div/div/div/div[1]/form/p[5]/input"));
             //使用元素属性值定位
          userName = driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_8__userName']"));
             //或者先定位父层级元素
          userName = driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_8__userNameWrapper']/input"));
             //使用逻辑运算符
          userName = driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_8__userName' and @name='userName']"));
             //contains 包含某个属性
          userName = driver.findElement(By.xpath("//input[contains(@id,'TANGRAM__PSP_8__userName')]"));

漏了一种还有css定位,一般来说在项目中用xpath和css基本能定位所有元素了,但是从效率上来讲的话还是css比较高。个人比较喜欢用xpath定位,id、class、name、tagname等等这些容易出现定位不到的情况,并且有些元素的属性还是动态变化的,如果用这些定位方法来定位的话容易出错。就拿xpath来说吧,当我们出现一个元素定位不到的时候该怎么处理呢?我说下我的思路:

1.查看html,看下这个元素是否被包在iframe等框架中,如果是有框架的话是需要切换框架的,以163邮箱登陆为例:

<html style="display: block;">
<head>
<body class=" move" style="padding-top: 0px;">
<header class="header">
<section id="mainBg" class="main" style="background-color: rgb(249, 249, 249);">
<div id="mainCnt" class="main-inner" style="background-image: url("http://mimg.127.net/m/lc/img/LoginBackgroundPic/1061/2/promPic.jpg");">
<div id="loginBlock" class="login tab-2">
<div class="loginFunc">
<div id="appLoginTab" class="loginForm">
<div id="normalLoginTab" class="loginForm">
<div class="loginWrap">
<div id="loginDiv" class="loginUrs" style="width: 295px; height: 413px;">
<iframe id="x-URS-iframe" frameborder="0" name="" scrolling="no" style="width: 100%; height: 100%; border: medium none; background: none repeat scroll 0% 0% transparent;" src="http://dl.reg.163.com/webzj/m163_1.0.1/pub/index_dl.html?wdaId=">
<!DOCTYPE html>
<html>
<head>
<body>
<div id="confirm" class="m-confirm f-dn">
<div id="cnt-box-parent" class="g-bd cnt-box-include">
<div id="loading" class="loading f-dn">
<div id="cnt-box" class="g-bd">
<div class="m-header">
<div class="m-cnt">
<form id="login-form">
<div id="auto-id-1482585786268" class="m-container">
<div id="account-box" class="inputbox">
<div class="u-logo">
<div id="auto-id-1482585786267" class="u-input box">
<label id="auto-id-1482585786237" class="u-label f-dn" style="display: block;">邮箱帐号或手机号</label>
<input id="auto-id-1482585786223" class="j-inputtext dlemail" type="text" spellcheck="false" tabindex="1" autocomplete="off" data-required="true" data-type="email" name="email" data-placeholder="邮箱帐号或手机号" placeholder="邮箱帐号或手机号" style="width: 122px;">

可以看到账号输入框是在一个iframe框架中的,我们必须要切换框架才能定位到账号输入框,如何切换呢,很简单,定位iframe,然后切换

WebElement frame = dr.findElement(By.xpath("//*[@id='x-URS-iframe']"));
      dr.switchTo().frame(frame);

2.如果是没有框架呢,还是定位不到,对了还要注意看报错信息,是无法定位到这个元素还是这个元素是不可见的。我们进行自动化测试的时候容易有个误区,就是想当然的以自己的逻辑去进行一个操作,而忽略了程序本身对这个逻辑的处理。举个例子,我们登陆的时候需要先点击登陆按钮,弹出登录小窗口再进行登陆。有的童鞋就直接定位账号密码输入框,自动化嘛,怎么简单怎么来,这当然是不行的。再写脚本的时候一定要注意,手工怎么点的,脚本就怎么写,怎么一步步执行,都不能漏。如果不能定位到元素就看下是不是对这个元素进行定位之前漏掉了什么操作。

3.定位的时候不要过分的相信自己写的代码。例如我写了个下面的定位,怎么检查代码都没有问题就是定位不到。这个时候就不要急,先查出是这个元素本身的问题还是写的代码的问题,使用另外一种定位方式再进行定位确定是不是自己定位写的有问题。我在群里经常看到许多童鞋粘上自己的代码就说写的没问题啊怎么就是定位不到,然后群里的热心朋友给他重写了个定位,他满心欢喜的一试,呀可以了就不了了之了,不从自身找下为什么定位不到的原因。

userName = driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_8__userNameWrapper']/input"));

4.当元素结构比较复杂的时候,学会灵活运用定位方式,像多利用这种包涵的定位方式可以更好的解决问题。

//contains 包含某个属性

userName = driver.findElement(By.xpath("//input[contains(@id,'TANGRAM__PSP_8__userName')]"));

总之元素定位是不难的,要多练,定位不到自己解决,自己反思是哪里出的问题,这样才能提高自己。

selenium使用笔记(三)——元素定位的更多相关文章

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

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

  2. python + selenium相关事件和元素定位

    女友由于工作上的失误,将公司RDM中的某一字段的2000条数据给删除了.....就算是重新添加字段,但是与其他数据的关联性已经不在了.由于每天的数据修改量大,有关部门不愿意恢复数据库,因此只能一条条的 ...

  3. selenium+python自动化之元素定位

    自动化按步骤拆分的话,可以分为四步操作:定位元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告.本篇接下来讲基本的八种元素定位方法.说的通俗一点,就是教大家找对象. ...

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

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

  5. python+selenium 环境搭建以及元素定位

    在给公司同事给培训了WEB自动化框架,现在和大家分享交流下

  6. Selenium2学习-009-WebUI自动化实战实例-007-Selenium 8种元素定位实战实例源代码(百度首页搜索录入框及登录链接)

    此 文主要讲述用 Java 编写 Selenium 自动化测试脚本编写过程中,通过 ID.name.xpath.cssSelector.linkText.className.partialLinkTe ...

  7. 初探appium之元素定位(1)

    无论是selenium还是appium,元素定位都是我们开始实现自动化面临的第一个问题.selenium还好,我们可以在浏览器的调试页面进行元素定位还是蛮方便的.那么appium怎么做呢? 我看到很多 ...

  8. [Selenium With C#学习笔记] Lesson-02 Web元素定位

    使用Selenium来做自动化测试,一般的流程是:查找定位元素--->操作元素--->断言,那么第一步我们需要能够完成查找并定位元素,Selenium目前提供了8种基本定位方法,可根据实际 ...

  9. python selenium 元素定位(三)

    上两篇的博文中介绍了python selenium的环境搭建和编写的第一个自动化测试脚本,从第二篇的例子中看出来再做UI级别的自动化测试的时候,有一个至关重要的因素,那就是元素的定位,只有从页面上找到 ...

随机推荐

  1. json中$ref对象重复引用问题

    FastJson提供了SerializerFeature.DisableCircularReferenceDetect这个序列化选项,用来关闭引用检测.关闭引用检测后,重复引用对象时就不会被$ref代 ...

  2. jsp 中的js 与 jstl 运行的先后顺序

    在jsp 中运行下面的代码,结论是:js 中可以使用 标签,js 的注释 对标签无效-- 有知道原理的吗<c:set var="flag" value="false ...

  3. String类的常用方法

    package stringUse; public class StringUse { public static void main(String[] args) { //获取 //indexOf, ...

  4. ofbiz进阶之实体引擎配置文件

    The Open For Business Project: Entity Engine Configuration Guide 原文链接:http://ofbiz.apache.org/docs/e ...

  5. JQUERY1.9学习笔记 之基本过滤器(二) 等于选择器

    等于选择器 :eq() 描述:选择与设定下标匹配的元素.jQuery( ":eq(index)" )jQuery( ":eq(-index)" ) <!D ...

  6. [教程]隐藏ActionBar中的MenuItem

    有时候我们需要在不同的时候改变ActionBar中MenuItem的项数,或者隐藏某些MenuItem,百度上找了很久没什好资料,还是Google了一下,StackOverFlow上有大神解决了. 先 ...

  7. 2017年AR大会上海站干货分享

    怀着即兴奋又激动的心情,踏上了第二次去上海的高铁,全长约1400公里行驶6小时15分钟,不算漫长的6个多小时里,对于不长出差的我来说,可谓是一种煎熬,再加上晕车的毛病,在去高铁的路上已经渐渐发作,但好 ...

  8. 关于apidoc文档生成不了的一个原因

    前几天在写完API后,写注释文档,然后很习惯的去用apidoc取生成注释文档,但是奇怪的事发生了,没有注释的内容,也没有报错:注释代码如下: /* * @api {get} /applet/:id 根 ...

  9. 【原创】大数据基础之HDFS(1)HDFS新创建文件如何分配Datanode

    HDFS中的File由Block组成,一个File包含一个或多个Block,当创建File时会创建一个Block,然后根据配置的副本数量(默认是3)申请3个Datanode来存放这个Block: 通过 ...

  10. xamarin android 需要获取apk签名工具

    请打开vs 扩展 搜索 android keystore signature tool 如果是Release 记得查找对应的keystore 文件然后进行获取签名