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使用例子:
- 普通方式:driver.findElement(By.xpath("html/body/span/button"));(最不可靠的)
- 使用属性定位:driver.findElement(By.xpath("//span[@class='xxx']/span/button"));(@后面跟随任何属性名,如:@type='button')
- 使用文本定位:driver.findElement(By.xpath("//*[text()='login']"));(*可替换成任何标签名,如:"//a[text()='Ok']")
- 使用部分文本定位:driver.findElement(By.xpath("//a[contains(text(),'login')]"));(但是这种查找部分超链接的方式我一直没有成功过)
- 使用部分属性值定位:driver.findElement(By.xpath("//a[contains(@title,'log')]"));(title是a标签内的一个属性)
- 使用多个属性定位:driver.findElement(By.xpath("//span[@class='title'][text()='NEW']"));(class属性值为‘title’,文本为“NEW”的元素)
- 使用不包含某个字段的定位:not,可在contains外加上not(contains());
*根据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))
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'][starts-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
有的时候需要在一个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字符串内。
- selenium webdriver使用笔记
- selenium Webdriver学习笔记
- Selenium WebDriver 使用IE
- selenium WebDriver简单使用
- Selenium笔记 原理分析及其使用之一 webdriver
- Selenium-WebDriver学习笔记(一)
- Selenium Webdriver (学习笔记)
- Selenium WebDriver使用经验杂记
- Selenium WebDriver使用经验杂记
- Selenium WebDriver使用经验杂记
- Selenium WebDriver使用IE浏览器
- Selenium WebDriver使用经验杂记
- 使用 from selenium import webdriver
- selenium WebDriver的简单使用
- Selenium WebDriver笔记之——2、Hello WebDriver!
- Selenium webdriver 学习笔记(一) - 环境搭建
- Selenium WebDriver学习笔记(一)
- selenium 2.0 webdriver 学习笔记(一)
- android 获取各种日期
- 从键盘输入若干行字符(每行长度不等),输入后把它们存储到磁盘文件中。
- asp.net缓存
- tomcat配置文件server.xml详解
- 使用 Maven Profile 和 Filtering 打各种环境的包
- selenium webdriver使用笔记
- Android 系统语言切换监听和设置
- 在控制台和mfc平台下调用caffe库会出现的bug及解决办法
- Qt按钮为什么设置了三态点击样式效果,无法得到预期,enabled属性为何无法选中 - C/C++解惑之Qt
- 程序设计语言学习笔记
- 碎碎念_天天更
- MFC控件实例之Slider Control实例
- 【多校】ZZULIOJ 1919 D
- 二分图--最大匹配