selenium webdriver使用笔记

来源:互联网 发布:人脸变老软件电脑版 编辑:程序博客网 时间:2024/04/30 08:49

1、定位元素

  • 根据id查找:driver.findElement(By.id("xxx")).click;
  • 根据xpath查找(相对路径):driver.findElement(By.xpath("//span[@class='xxx']/span/button")).click();
  • 根据超链接文本查找(该文本必须为<a>标签内的文本):driver.findElement(By.linkText("login in")).click();
  • 根据部分超链接文本查找(同上):driver.findElement(By.partialLinkText("login")).click();
  • 根据class查找:driver.findElement(By.className("datatable")).click();
  • 根据class查找(如果class由多个组成<span class="glyphicons menu-item">,可以将空格变为小数点.,再加上标签名<span>得出):driver.findElement(By.cssSelector("span.glyphicons.menu-item")).click();
  • 根据网页文本查找(查找可见的所有网页上的文本进行定位):driver.findElement(By.xpath("//*[text()='Ok']")).click();(*可替换成任何标签名)
  • xpath使用例子:
  1. 普通方式:driver.findElement(By.xpath("html/body/span/button"));(最不可靠的)
  2. 使用属性定位:driver.findElement(By.xpath("//span[@class='xxx']/span/button"));(@后面跟随任何属性名,如:@type='button')
  3. 使用文本定位:driver.findElement(By.xpath("//*[text()='login']"));(*可替换成任何标签名,如:"//a[text()='Ok']")
  4. 使用部分文本定位:driver.findElement(By.xpath("//a[contains(text(),'login')]"));(但是这种查找部分超链接的方式我一直没有成功过)
  5. 使用部分属性值定位:driver.findElement(By.xpath("//a[contains(@title,'log')]"));(title是a标签内的一个属性)
  6. 使用多个属性定位:driver.findElement(By.xpath("//span[@class='title'][text()='NEW']"));(class属性值为‘title’,文本为“NEW”的元素)
  7. 使用不包含某个字段的定位:not,可在contains外加上not(contains());
参考:http://www.cnblogs.com/qingchunjun/p/4208159.html

*根据CSS定位元素:

代码中有两个相同的class名称,其中一个的style为display:none;,想要使用另一个可见的class,但是没有其他可以依附的标签时使用:

driver.findElement(By.cssSelector("div.cg-dialog-close:not([style*=display])"))

具体含义为选择class为“cg-dialog-close”且style不包含“display”字段的div层,一开始我匹配的是“display: none;”,但是一直找不到这个字段,可能是因为里面包含的空格的关系,具体原因待查。

css参考:http://www.360doc.com/content/13/1105/10/11675837_326750173.shtml


2、Actions动作

Actions action=new Actions(driver);

  • action.click(driver.findElement(By)).perform();(左键单击)
  • action.doubleClick(driver.findElement(By)).perform();(双击)
  • action.contextClick(driver.findElement(By)).perform();(右键单击)
  • action.dragAndDrop(driver.findElement(By),driver.findElement(By)).perform();(将a拖拽到b)
  • action.dragAndDrop(driver.findElement(By),x,y).perform();(将a拖拽到坐标(x,y))
参考:http://www.ibm.com/developerworks/cn/java/j-lo-keyboard/
注:目前尝试过的click&doubleclick如果不添加.perform()就无法生效,因为不熟悉所以情况不明,但是很多网上的例子写的却没有.perform(),不知道他们是怎么实现的,另外几个没有尝试过是不是需要添加.perform()。

3、svg元素定位

网页中有svg时是不能使用一般的定位方式进行定位的,需要使用/*[name()='svg']/*[name()='g']替代之前的/svg/g[1]之类的

源码:

<svg class='graph'>  <g class='1'></g>  <g class='2'>     <text>graph</text>  </g></svg>
定位代码:

driver.findElement(By.xpath("//*[name()='svg']/*[name()='g'][2]/*[name()='text']"));

更复杂一点,希望可以根据<text>标签内的文本“graph”来定位需要的元素,可以使用:

//*[name()='text'][sta‌​rts-with(text(), 'graph')]

相当于:

//text[text()='graph']

根据class来定位:

//*[name()='g'][@class='1']

相当于:

//g[@class='1']

*对于上述xpath中的数字[2],可以用[*]来替代,只是会延长查找时间,但是对于不清楚是哪一层只知道标签名字来说,这样做是很方便的事情。

*对于svg元素的单击事件,使用参考1的方式并没有用,但是去除中间的build倒是有作用,可能我的svg跟那位仁兄的有些不一样,另外我的svg也可以用最平常的driver.xxx.click()事件,至于右键什么的操作就只能依靠action方法啦。

参考1:http://blog.csdn.net/navyhu/article/details/40149881

参考2:http://stackoverflow.com/questions/26722421/how-do-i-test-a-click-on-svg-objects-using-selenium-webdriver


4、Junit测试案例顺序设置

有的时候需要在一个java文件里面编写多个@Test,但是Junit并不会按照代码的编写顺序来执行测试案例,一般默认都是随机顺序的。

所以如果想要Junit测试可以按照预定的顺序进行执行,就需要用到以下代码,并将它放到import代码下方:

@FixMethodOrder(MethodSorters.NAME_ASCENDING)

具体方法网上都有,上述代码的作用就是按照test的名称升序排序执行,然后更改test的名称,最好按照一个编号顺序来命名,这样Junit就会按照既定的顺序进行执行,一般我使用的test名称会以“test001测试名”来命名。

5、不关闭浏览器执行所有test直到测试执行完毕

有时候执行测试我只希望打开一次浏览器,然后在这个网页的基础上继续往下执行,对于老手来说这是个很无聊的问题,但是对于新手来说,这是个转不过脑子想到的事情,比如刚开始的我。

因为刚接触selenium的时候我是在selenium IDE里面复制的代码,而IDE里面的代码一般都是这种格式:

@before

打开浏览器,打开网页

@Test

执行测试

@after

关闭浏览器

验证是否有错

后来我想增加几个@Test,但是执行起来总是会先关闭浏览器然后重新打开一个新的浏览器,一开始我并不明白这是为什么,后来写多了程序才发现@before@after的真正意思是在执行每个@Test的时候都运行一遍@before和@after,也就是说如果一个Junit的格式是这样的(@before@Test1@Test2@after),那么Junit执行起来会是这样的(@before@Test1@after@before@Test2@after)。

所以如果只想打开一次浏览器,然后执行很多的@Test,就需要把打开浏览器的代码写在一个@Test里面,而不是写在@before里面,目前我的测试格式会是以下这个样子,并且需要配合问题4中Junit的设置执行顺序:

package

import

@FixMethodOrder(MethodSorters.NAME_ASCENDING)

public class 程序名 {

@Test

public void test001OpenURL() throws Exception{

打开浏览器,打开网页

}

@Test

public void test002XXX() throws Exception{

执行测试

}

@Test

public void test003XXX() throws Exception{

执行测试

}

@Test

public void test004Shutdown() throws Exception{

关闭浏览器

}

@after

public void tearDown() throws Exception{

验证是否有错

}

}

6、java代码中执行js代码

js代码:

var value = window.document.getElementById('username').value;return value;

java代码:

JavascriptExecutor jsAllNode = (JavascriptExecutor) driver;String valuejs = "var value = window.document.getElementById('username').value;"+ "return value;";String value = (String) jsAllNode.executeScript(valuejs);
java中执行js代码可能会在需要获取文本框中的值的时候使用到,因为<input type='text'/>这种类型的文本框不能用getText的方法获取到文本框内的值,只能通过js的代码来获取。

上述代码就是获取id为username的文本框的文本,并保存在value字符串内。




0 0