【原创】Selenium学习系列之(五)—从Selenium 到 Selenium2(Webdriver)

来源:互联网 发布:国内上google 知乎 编辑:程序博客网 时间:2024/05/26 02:51

通过前面四期,大家对Selenium应该有了初步的了解,它是一个强大的基于浏览器的开源自动化测试工具。在使用一段时间后,你会觉得Selenium确实是一个很不错的Web测试工具,它使用灵活简单,上手快,而且写出的测试case非常简洁,并且支持多个编程语言。

但Selenium并不是能够在浏览器中自动化功能测试的唯一工具。由SimonStewart创建的webdriver是一个具有类似目标的项目。要控制浏览器,需要依赖采用本机支持的独立客户端。webdriver仅提供java绑定,并不能支持Selenium1所能支持的那么多浏览器。这样就有了Selenium2的出现,接下来我们聊一聊Selenium2。

Selenium2的由来

Selenium 2(又名 WebDriver),简单来说Selenium2.0=Selenium1.0+webdriver,结合了Selenium1和webdriver中的最佳特性。

那 Selenium 团队为什么会将两个项目合并呢?以下这段,摘自于网上比较官方的说法。

我们通常认为其中部分原因是 WebDriver 解决了 Selenium 存在的缺点(比如,能够绕过 JS 沙箱,这个),部分原因是 Selenium 解决了 WebDriver 存在的问题(比如,支持更广泛的浏览器和编程语言),不论真正的原因是什么两个项目的合并为用户提供了一个优秀的自动化测试框架。它具有来自webdriver的清晰面向对象API,并且能以最佳的方式与浏览器进行交互,它支持多种浏览器和多语言绑定。Selenium2还提供基于htmlunit的无外设驱动,是用于测试web应用程序的java框架。htmlunit运行速度特别快,但它不是一个真正与真实浏览器相关联的驱动。

我切身的使用感受是,Selenium2(以下统称webdriver)比Selenium1(以下统称Selenium)简单方便,脚本易维护,我们在使用中可以将Selenium可以作为上手实践,然后逐渐过渡到Webdriver。

Selenium无法自定义testcase执行顺序,只能按照自上而下的顺序执行,而且它的结构只能是 test suite-test case的两层关系,不能实现更多层次的结构,如 test suite-test suite –test case。

目前Selenium2为下列程序提供驱动程序:

Mozilla Firefox

Google Chrome

Microsoft Internet Explorer

Opera

Apple iPhone

Android browsers

说了这么多,有没有想要体验一把的冲动,那么先从搭建环境开始吧。

 

Eclipse中配置webdriver

我们需要下载和安装程序

  • Eclipse
  • JRE
  • Selenium-server( e.g.Selenium-server-2.39.0.zip)

All variants of the Selenium Server: stand-alone, jar with dependencies and sources.

  • Selenium-server-standalone(e.g.Selenium-server-standalone-2.39.0.jar) Use this if you want to use the Selenium RC or Remote WebDriver or use Grid 2 without needing any additional dependencies
  • IEDriverServer(e.g. IEDriverServer_x64_2.39.0)

 

我使用的Eclipse和JRE都是绿色版免安装版,需要注意的,两者的bit要一致,如果使用的是64bit的Eclipse,则JRE也需要是64bit。Selenium的两个jar包和IEDriverServer都可以去Selenium官网下载(http://www.seleniumhq.org/)

接下来将Selenium-server 和Selenium-server-standalone  两个文件copy到某一目录下,(例如  D:\mySoftware\eclipse_j2ee\eclipse_j2ee\plugins)

接着解压IEDriverServer并将其放到某一目录下(如 D:\mySoftware\IEDriverServer\IEDriverServer.exe),这个目录我们后面会用到的,需要记住的。

 

在Eclipse 新建JavaProject,命名为 SeleniumBlog。

NewProject

对新建的Project,configure build path,导入两个Selenium jar包,IEDriverServer 和Junit4。

BuildPath

在SeleniumIDE新建 login test case,并将其导出为 Java/Junit/Webdriver。

LoginTestCase-Selenium1

ExportAsJunit4

在Eclipse新建firstTest.java,将导出的Java/Junit/Webdriver,粘贴过来。然后,我们需要对代码进行微调,原因如下:

  1. 导出的code默认用 Firefox DriverServer,而我们要使用IE DriverServer
  2. IE Driver Server的path,需要定义一下,否则它会默认寻找C:\Program Files\Internet Explorer,如果这个路径下找不到的话,则无法启动IE 的Driver,运行报错
  3. 有可能你的IE是兼容模式,所以需要通过代码设定一下,否则运行会报错

Webdriver

在firstTest.java, 点选右键,选择 run as-Junit, 然后静待结果吧。如果,看到下面的结果,那么恭喜你,运行成功。Keep the code clean, keep the bar green。

Result

:微调后并运行通过的代码

package Test;

import java.util.regex.Pattern;

import java.util.concurrent.TimeUnit;

import org.junit.*;

import static org.junit.Assert.*;

import static org.hamcrest.CoreMatchers.*;

import org.openqa.selenium.*;

import org.openqa.selenium.firefox.FirefoxDriver;

import org.openqa.selenium.ie.InternetExplorerDriver;

import org.openqa.selenium.remote.DesiredCapabilities;

import org.openqa.selenium.support.ui.Select;

 

public class firstTest {

private WebDriver driver;

private String baseUrl;

private boolean acceptNextAlert = true;

private StringBuffer verificationErrors = new StringBuffer();

 

@Before

public void setUp() throws Exception {

 

//Set  environment  variable  for   “webdriver.ie.driver”  though  system.setProperty method.

System.setProperty(“webdriver.ie.driver”, “D:\\mySoftware\\IEDriverServer\\IEDriverServer.exe”);

 

//The  below  setting must be done if  IE setting  in Protected  mode

DesiredCapabilities ieCapabilities = DesiredCapabilities.internetExplorer();

ieCapabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,true);

driver = new InternetExplorerDriver(ieCapabilities);

// driver = new InternetExplorerDriver();

 

baseUrl = “http://10.237.89.182:8080/”;

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

}

 

@Test

public void testLoginJunit4WebDriver() throws Exception {

driver.get(baseUrl + “/ecc/”);

driver.findElement(By.id(“txtLogin”)).clear();

driver.findElement(By.id(“txtLogin”)).sendKeys(“global”);

driver.findElement(By.name(“password”)).clear();

driver.findElement(By.name(“password”)).sendKeys(“Pw#12346”);

driver.findElement(By.xpath(“//input[@value=’LOGIN’]”)).click();

try {

assertEquals(“Welcome,”, driver.findElement(By.cssSelector(“span.welcome”)).getText());

} catch (Error e) {

verificationErrors.append(e.toString());

}

driver.findElement(By.id(“btnLogout”)).click();

}

 

@After

public void tearDown() throws Exception {

driver.quit();

String verificationErrorString = verificationErrors.toString();

if (!””.equals(verificationErrorString)) {

fail(verificationErrorString);

}

}

 

private boolean isElementPresent(By by) {

try {

driver.findElement(by);

return true;

} catch (NoSuchElementException e) {

return false;

}

}

 

private boolean isAlertPresent() {

try {

driver.switchTo().alert();

return true;

} catch (NoAlertPresentException e) {

return false;

}

}

 

private String closeAlertAndGetItsText() {

try {

Alert alert = driver.switchTo().alert();

String alertText = alert.getText();

if (acceptNextAlert) {

alert.accept();

} else {

alert.dismiss();

}

return alertText;

} finally {

acceptNextAlert = true;

}

}

}

阅读全文
0 0
原创粉丝点击