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=" 295px; height: 413px;"> <iframe id="x-URS-iframe" frameborder="0" name="" scrolling="no" style=" 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=" 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')]"));
总之元素定位是不难的,要多练,定位不到自己解决,自己反思是哪里出的问题,这样才能提高自己。