最近项目组里需要推行Selenium的UI自动化的测试,就让我负责学习,经过一段时间的研究,对这个工具有了一个初步的了解,下面分享一下这段时间的学习经验,对这段时间的努力做个总结。
Selenium是一个自动化测试工具,旨在用程序模拟人对B/S架构系统的真实操作,实现自动化测试的目的。它是由Selenium1.0+Webdriver组成的,组合升级以后,Selenium2.0弥补了前面两个工具的一些缺点和不足。
言归正传,下面说说这个工具的使用吧。Selenium2.0支持好多主流的浏览器,因为公司测试的系统只支持Firefox,所以下面就以Firefox浏览器为例吧。
首先需要下载开发工具Eclipse,Selenium工具jar包 selenium-server-standalone-2.35.0,火狐浏览器插件 firebug-1.12.7-fx_82618.xpi,火狐浏览器启动程序(在安装程序目录下可以找到)firefox.exe,这些准备好之后就可以开始了。
在Eclipse里面新建一个工程,然后将selenium-server-standalone-2.35.0添加到工程中, 然后在根目录下新建一个名为res的文件夹,将firebug-1.12.7-fx_82618.xpi 和 firefox.exe放进去,搭建好的环境如图所示:
下面写一段代码来测试一下这个工具:
package demo;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
public class df
{
public static void main(String[] args)
{
// 如果火狐浏览器是默认安装到C盘的,下面这句可以不用写,如果安装到别的盘里,需要在这里配置一下环境变量要不然就会抛出一个路径找不到的异常
System.setProperty("webdriver.firefox.bin","D:\\Mozilla Firefox\\firefox.exe");
//创建一个WebDriver实例,对控件进行操作。
WebDriver driver =new FirefoxDriver();
//访问google
driver.get("http://www.google.com.hk");
//找到文本框的位置
WebElement element = driver.findElement(By.name("q"));
//输入搜索关键字
element.sendKeys("CSDN");
//提交表单 WebDriver会自动从表单中查找提交按钮并提交
element.submit();
//关闭浏览器
driver.quit();
}
}
在这里,还可能抛出一个异常 org.openqa.selenium.firefox.NotConnectedException: Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms. 抛出这个异常是因为Selenium2.0的版本和浏览器的版本不兼容,可以采用降低浏览器版本或者提高Selenium的版本来解决这个问题,我是用的selenium-server-standalone-2.35.0和Firefox 19版本的,完美支持。
上面示例的过程比较快,如果感觉不容易看清,可以使用Thread.sleep( ) 来休眠一下,Selenium2.0也有自带的方法来延时,但是个人感觉不好用,这里就不推荐了,有兴趣的自己可以查。
可以看出Selenium2.0是通过定位UI元素然后去填值或者进行其它操作的,如sendkeys()是赋值操作,click()是点击操作.......Selenium2.0定位UI元素的方法有以下几种:
1. By.id ( ) 通过id查找 2.By.name() 通过节点的name查找 ......还有好多查找的方法,如通过className,css等等,方法都类似,这里就不在赘述。
需要提到一点的是By.xPath ( )方法,因为在一些动态生成代码的系统中,上面的一些方法可能会出现节点找不到的问题,因此可以采用xPath方法,xPath("//*[@id="xhePanel"]/div/div[2]") 还有一种写法xPath("/html/body/div[2]/div");使用这个查找节点会很精确,但是相对前面几种方法来说比较耗时。
有时候会碰到一种情况,就是遇到级联菜单时,在页面中只能找到上一级的节点,下一级的节点需要Mouseover( )操作之后才JS会自动生成出来,这时候就需要一个Mouseover()操作,Selenium se=new WebDriverBackedSelenium(driver, url);使用这个对象可以调用Mouseover() 方法,然后再去寻找下一级的节点。
使用javascript
您可以执行任意JavaScript找到一个元素,只要你返回一个DOM元素,它会自动转换到一个WebElement对象。例子:jQuery的页面加载一个简单的例子:
WebElement element = (WebElement) ((JavascriptExecutor)
driver).executeScript("return $('.cheese')[0]");
寻求所有的页面上的input元素:
List<WebElement> labels = driver.findElements(By.tagName("label"));
List<WebElement> inputs = (List<WebElement>) ((JavascriptExecutor)driver).executeScript( "var labels = arguments[0], inputs = []; for (var i=0; i < labels.length; i++){" +"inputs.push(document.getElementById(labels[i].getAttribute('for'))); }
return inputs;", labels);
遍历select标签:
WebElement select = driver.findElement(By.tagName("select"));
List<WebElement> allOptions = select.findElements(By.tagName
("option"));
for (WebElement option : allOptions) {
System.out.println(String.format("Value is: %s",
option.getAttribute("value")));
option.click();
}
选择其中的某一项:
Select select = new Select(driver.findElement(By.tagName("select")));
select.deselectAll();
select.selectByVisibleText("Edam");
文件上传:
WebElement FileUpload =driver.findElement(By.id("upload"));
String filePath = "C:\test\\uploadfile\\media_ads\\test.jpg";
FileUpload.sendKeys(filePath);
拖拽操作:
WebElement element = driver.findElement(By.name("source"));
WebElement target = driver.findElement(By.name("target"));
(new Actions(driver)).dragAndDrop(element, target).perform();
支持frame
driver.switchTo().frame("frameName");
frame是一个重载的方法,如果是字符串就是按Frame的name去找,如果是int类型的,则按照frame集合的下标去找,我在使用的过程中,由于系统代码自动生成,所以找不到frame的name,然后就使用下标查找,很方便。
支持对弹出框的获取:
Alert alert = driver.switchTo().alert();
driver.to() 和driver.negavite.get()的作用是一样的,但是negative可以实现前进和后退。
driver.navigate().forward(); driver.navigate().back();
初次接触,感谢 Selenium2.0之WebDriver学习总结(2) 来自lvzeting 的博客,给了我很多的帮助。关于自动化测试对Flex的支持目前正在研究中......下一篇博客将会有详细的分析。