Selenium 是一组软件工具集,每一个都有不同的方法来支持测试自动化。大多数使用 Selenium 的QA工程师只关注一两个最能满足他们的项目需求的工具上。然而,学习所有的工具你将有更多选择来解决不同类型的测试自动化问题。这一整套工具具备丰富的测试功能,很好的契合了测试各种类型的网站应用的需要。这些操作非常灵活,有多种选择来定位 UI 元素,同时将预期的测试结果和实际的行为进行比较。Selenium 一个最关键的特性是支持在多浏览器平台上进行测试。
Selenium 是用于测试 Web 应用程序用户界面 (UI) 的常用框架。它是一款用于运行端到端功能测试的超强工具。您可以使用多个编程语言编写测试,并且 Selenium 能够在一个或多个浏览器中执行这些测试。
Selenium经历了两个版本,Selenium1.0 和Selenium2.0,Selenium 也不是简单一个工具,而是由几个工具组成,每个工具都有其特点和应用场景。
Selenium是在2004年由一个叫Jason Huggins的聪明的年轻人开发的,当时身处ThoughtWorks的他,为了不想让自己的时间浪费在无聊的重复性工作中,所以开发一个JS的类库来驱动浏览器页面的行为;这个js类库就是selenium core,同时也是seleniumRC、Selenium IDE的核心组件。这就是Selenium1.0的产生史。
在2006年,在google的一位有胆识的年轻人Simon Stewart发起了一个叫WebDriver的项目;因为长期以来google一直是selenium的重度用户,但却总是被限制在有限的操控范围内,所以Simon希望能通过浏览器、操作系统的底层方法等一些手段来直接操作浏览器;这样就避免了在JavaScript的沙箱环境里存在的那些限制了,webdriver项目就此诞生!
在2008年,Selenium和webdriver结合了,从此永结良缘,福泽我们广大的测试工作者。这期间谁追的谁都不重要了,重要的是他们合并的原因正如webdriver的作者所说:
部分原因是 selenium 补充了 webdriver 的不足
部分原因是 webdriver 补充了 selenium 的不足
部分原因是它们合体后能给用户提供一个更好的自动化测试框架
Selenium是一款同样使用Apache License 2.0协议发布的开源框架。Selenium也是一套完整的Web应用程序测试系统工具,它包含了:
Selenium 由多个软件工具组成,每个具备特定的功能。
是一个用于构建脚本的初级工具,其实是FireFox的一个插件,拥有一个易于使用的界面。它拥有记录功能,能够记录用户执行的操作,并可以导出为可重复使用的脚本。如果没有编程经验,可以通过Selenium IDE来快速熟悉Selenium的命令。该工具实际使用不多。Selenium-core 是使用HTML的方式来编写测试脚本,你也可以使用 Selenium-IDE来录制脚本,但是目前Selenium-IDE只有 FireFox 版本。
Selenium-RC(Selenium3.X 移除):
selenium-remote control 缩写,是使用具体的语言来编写测试类。Selenium RC支持多种不同的语言编写自动化测试脚本,通过SeleniumRC的服务器作为代理服务器去访问应用,从而达到测试的目的。主要包含以下两大部分:
ClientLibraries库主要用于编写测试脚本,用来控制SeleniumServer的库。
SeleniumServer负责控制浏览器行为。SeleniumServer包含三部分:Launcher,Http Proxy和Core。其中,Selenium Core是被Selenium Server嵌入到浏览器页面中的,其实SeleniumCore就是一堆JavaScript函数的集合,即通过这些JavaScript函数,我们才可以实现用程序对浏览器进行操作。Launcher用于启动浏览器,把Selenium Core加载到浏览器页面当中,并把浏览器的代理设置为SeleniumServer的HttpProxy。
Selenium2.x提出了WebDriver的概念之后,它提供了完全另外的一种方式与浏览器交互。那就是利用浏览器原生的API,封装成一套更加面向对象的SeleniumWebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)。由于使用的是浏览器原生的API,速度大大提高,而且调用的稳定性交给了浏览器厂商本身,显然是更加科学。然而带来的一些副作用就是,不同的浏览器厂商,对Web元素的操作和呈现多少会有一些差异,这就直接导致了Selenium WebDriver要分浏览器厂商不同,而提供不同的实现。例如Firefox就有专门的FirefoxDriver,Chrome就有专门的ChromeDriver等等。(甚至包括了AndroidDriver和iOS WebDriver)
实现测试的并行处理。
Selenium RC方式(3.X以后版本移除该方式):
WebDriver(目前主流方式):
Selenium 2.X启动SeleniumRC至今为止还保留着,应该是考虑到向前兼容。Selenium 3.X完成移除了SeleniumRC。
Selenium2.X增加了WebDriver,保持RC向前兼容。WebDriver项目是由Simon Stewart创建的,它是一个非常便捷的自动化测试工具。WebDriver对不同浏览器的处理方式和RC有着明显的不同,RC是不管什么浏览器都是JavaScript来处理,而WebDriver是选择浏览器最容易接受的语言来处理。比如,在IE中,C++最合适,在Firefox中, JavaScript最合适等等。通过灵活选择最合适的语言来处理多浏览器,我们可以很好的回避某些浏览器对JavaScript的安全限制。而且WebDriver不仅仅具有这些能力,它还能够调用操作系统API,尤其是当用户需要模拟鼠标和键盘进行真实的页面操作的时候,这项能力的作用尤为明显。
现在支持的WebDriver:AndroidDriver,ChromeDriver, FirefoxDriver, HtmlUnitDriver, EventFiringWebDriver,InternetExplorerDriver, IPhoneDriver, IPhoneSimulatorDriver, RemoteWebDriver。
Selenium Grid(目前主流的方式):
传统的无Grid的模式,只能在一台机器上进行测试。Selenium可以在上面两种方式下进行执行,第一种是每台机器都是一致的,第二种是可以指定特定的浏览器或者特定的操作系统执行。
Selenium特点:
Selenium1.0代表的是经典,Selenium2.0代表的是未来。
我们在此重点关注Selenium2.0的WebDriver。而WebDriver面临的第一个选择就是编程语言。WebDriver支持众多的编程语言,例如,C#、Ruby、Python、 Java、Javacript、Objective-C、PHP。我们在使用之前必须要确定一种。
面向对象
平台无关
多线程
安全性
close:表示关闭当前页面(窗口)
quit:表示退出浏览器
以百度主页为例:搜索框的HTML示例代码如下,它的ID为kw
WebElement searchBox = driver.findElement(By.id(“kw”)).sendKeys(“小坦克 博客园”);
//相当于根据name获取百度的输入框并填写小坦克博客
链接 link
小坦克
//找到链接
WebElement link1 = driver.findElement(By.linkText(“小坦克”));
WebElement link1 = driver.findElement(By.partialLinkText(“坦克”));
- 点击链接
link1.click();
输入框 testbox
//找到元素
WebElement element = driver.findElement(By.id(“usernameid”));
//在输入框中输入内容
element.sendKeys(“test111111”);
//清空输入框
element.clear();
//获取输入框的内容
element.getAttribute(“value”);
按钮
//找到元素
String xpath = “//path[@value=’添加’]”;
WebElement addButton = driver.findElement(By.xpath(xpath));
//点击按钮
addButton.click();
//判断是否enable
addButton.isEnabled();
下拉选择 Select
下拉选择框的操作:
//找到元素
Select select = new Select(driver.findElement(By.id(“proAddItem_kind”)));
//选择对应的选项,index从0开始的
select.selectByIndex(1);
select.selectByValue(“2”);
select.selectByVisibleText(“种类CC”);
//获取所有的选项
List options = select.getOption();
for(WebElement webElement : option){
System.out.println(webElement.getText());
}
单选项Radio Button
Apple
Pear
Banana
Orange
//找到元素
String xpath = “//input[@type=’radio’][@value=’Apple’]”;
WebElement apple = driver.findElement(By.xpaty(xpath));
//选择某个元素
applie.click();
//判断某个单选框是否已经被选择
BooleanisAppleSelect = apple.isSelected();
//获取元素属性
apple.getAttribute(“value”);
//浏览器最大化、前进、多退、刷新
public static void testBrowser(WebDriverdriver) throws Excepotion{
driver.get(“http://www.cnblogs.com/tankxiao”);
Thread.sleep(5000);
//浏览器最大化
driver.manage().window().maximize();
driver.navigate().to(“http://www.baidu.com”);
//刷新浏览器
driver.naviget.refresh();
//浏览器后退
driver.navigate.back();
//浏览器前进
driver.navigate.forward();
//浏览器退出
driver.quit();
}
public static void testScreenShot(WedDriverdriver) throws Exception{
driver.get(“http://www.baidu.com”);
File srcFile = ((TakesScreenshot)driver).getSreenshotAs(OutputType.FILE);
/**
* 利用FileUtils工具类的copyFile()方法保存getScreenshotAs()返回的文件对象
*new File()第一个参数表示截图储存路径;如果该文件在本工程目录下,只需要填写文件夹名字即可;如果该文件夹没有在该工程目录下,则需要填写完成的路径
*new File()第二个参数表示截图保存的文件名
*/
FileUtils.copyFile(srcFile,new File("snapshot", System.currentTimeMillis() + ".png"));
}
public static voidrightClickMouse(WebDriver driver){
driver.get(“http://www.baidu.com”);
Action action = new Action(driver);
action.contextClick(driver.findElement (By.id(“kw”))).perform();
}
public static void killProcess(){
//killfirefox
WindowsUtils.tryToKillByName(“firefox.exe”);
//kill IE
WindowsUtils.tryToKillByName(“iexplore.exe”);
//kill chrome
WindowsUtils.tryToKillByName(“chrome.exe”);
}
WebDriver driver = new FireFfoxDriver();
driver.get(“file:///C:/Users/Tank/Desktop/set_timeout.html”);
driver.manage().timeouts().implicitlyWait(20, TimeUnitl.SENCONDS);
//等待10s,如果10s元素还不存在,就会抛出异常
WebElement element = driver.findElement(By.cssSelector(“.red_box”));
((JavascriptExecutor)driver).executeScript(“argument[0].style.border= \"5pxsolid yellow\"”, element);
WebDriver wait = newWebDriverWait(driver ,30);
wait.until(ExpectedConditons.presenceOfElementLocated(By.cssSelector(“.red_box”)));
Actions action = new Actions(driver);
action.click(); //在当前位置点击左键
action.click(driver.findElement(By.id(“”))); //在指定位置单机左键
Actions action = new Actions(driver);
action. contextClick (); //在当前位置点击右键
action. contextClick (driver.findElement(By.id(“”))); //在指定位置点击右键
Actions action = new Actions(driver);
action. doubleClick(); //在当前位置点击左键
action. doubleClick (driver.findElement(By.id(“”))); //再指定位置双击
Actions action = new Actions(driver);
action. dragAndDrop (source,target); //将source元素拖放到target元素的位置
action. doubleClick (source, xOffset, yOffset); //将source元素拖放到(xOffset, yOffset)位置,其中xOffset为横坐标,yOffset为纵坐标
Actions action = new Actions(driver);
action.clickAndHold(); //在当前位置悬停
action.clickAndHold(onElement); //鼠标悬停在 onElement 元素的位置
Actions action = new Actions(driver);
action.moveToElement(toElement); //将鼠标移到 toElement
action.moveToElement(toElement,xOffset,yOffset) //将鼠标移到元素 toElement 的 (xOffset,yOffset) 位置
action.moveByOffset(xOffset,yOffset); //以鼠标当前位置或者 (0,0) 为中心开始移动到(xOffset, yOffset) 坐标轴
对于键盘的模拟操作,Actions 类中有提供keyUp(theKey)
、keyDown(theKey)
、sendKeys(keysToSend)
等方法来实现
Actions action = new Actions(driver);
action.sendKes(Keys.TAB); //模拟按下并释放TAB键
action.sendKeys(Keys. CONTROL); //模拟按下并释放CONTROL键