记selenium1.2升级到selenium2.0

上一篇 / 下一篇  2013-06-12 19:25:43 / 个人分类:功能自动化

         前阵子因为要进行支持多浏览器的自动化测试,原来selenium1.0仅支持到firefox3.6,IE8,chrome4的版本,而公司GA数据显示用户多使用IE9,Firefox20,chrome26,很显然selenium1.0已不再满足当前也业务需求,为了更好进行兼容性测试,升级selenium已经迫在眉睫。(PS.这篇文章重点讲的是selenium1.0升级到2.0的内容,关于如何使用selenium开展自动化测试不是本文的范畴,大家可以去网上找一下,有很多这方面的资料)

         因为我们使用的是JAVA+TestNG+Maven+Selenium自动化测试框架,以下内容均是基于该框架进行的阐述。

1. 修改dependency

把Pom.xml文件中的dependency进行修改:

<dependency>

       <groupId>com.thoughtworks</groupId>

       <artifactId>selenium-java-client-driver</artifactId>

       <version>2.25.0</version>

</dependency>

变为:

<dependency>

    <groupId>org.seleniumhq.selenium</groupId>

    <artifactId>selenium-server</artifactId>

    <version>2.31.0</version>

</dependency>

然后编译即可下载对应的jar包。

2. 创建WebDriver实例

1.0中直接通过一个方法创建实例,参数可以定义static变量传入。

public static Selenium createInstance()

    {

     instance = new SeleniumInstance(SELENIUM_SERVER,

SELENIUM_SERVER_PORTBROWSERDEFAULT_URL);

     return instance;

    }

2.0中因为IE及chrome的特殊性,可以在googlecode上下载对应的文件到本地磁盘,然后引入chromedriver及IEDriverServer的路径,这里说明下:

1) webdriver对firefox浏览器支持的比较好,从工作实践来看没有多少棘手的问题;

2) 对chrome的支持其实是Chromium项目自己支持和维护的,需要额外下载对应的standalone server以实现webdriver的通路协议,以支持webdriver;

3)而IEDriverService.exe是webdriver驱动IE浏览器的代理器,也就是做webdriver驱动IE做相应的动作时,都需要通过IEDriverServer.exe来通知IE,本质上IEDriverServer.exe是对IE实现的DOM接口进行了二次封装;

4)以下代码中因为safari需要真实运行于MAC系统下,所以通过Grid来执行,关于grid也可以网上去找找相关资料。

相关code:

public static WebDriver createInstance() throws MalformedURLException {

      

     if (BROWSER == "Firefox"){

    driverInstance = new FirefoxDriver();

     driverInstance.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);

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

     driverInstance.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);

      } else if (BROWSER == "Safari"){

    DesiredCapabilities capability = DesiredCapabilities.safari();

    driverInstance = new RemoteWebDriver(new URL("http://192.168.61.138:5555/wd/hub"),capability);

     capability.setBrowserName("safari");

     capability.setPlatform(Platform.MAC);

    capability.setVersion("6.0.2");

      } else if (BROWSER == "Chrome"){

       System.setProperty("webdriver.chrome.driver","D:\\selenium\\selenium-server-2.31.0\\chromedriver.exe");

      driverInstance = new ChromeDriver();

      } else if (BROWSER == "iExplore"){

    System.setProperty("webdriver.ie.driver""D:\\selenium\\selenium-server-2.31.0\\IEDriverServer.exe");

      DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer();

  capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINStrue);

      driverInstance = new InternetExplorerDriver(capabilities);

      }  else if (BROWSER == "HtmlUnit" ) {

      driverInstance = new HtmlUnitDriver(true); 

         }

return driverInstance;

  }

3. 完成以上两步,就差不多把所需的东西准备好了,接下来就需要一步步开工了。首先,把底层框架中启动和停止server的代码修改为最新的

 1.0中需要启动server才能运行,而在2.0中如果不通过Remote来运行的话是不需要启动server的,这里提到的启动实际是实例化过程,这中间会启动浏览器,停止时会释放资源并关闭浏览器。

protected static void startdriver() {

if (driver == null ){

try {

driver = DriverInstance.createInstance();

catch (MalformedURLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

private static void stopDriver() {

//stop driver;

if (driver != null) {

driver.quit();

if ( browser == "Firefox") {

closeFireFox();

else if (browser == "Chrome") {

closeChromeDriver();

}

}

}

4. 把底层框架中1.0的方法修改为2.0的,以下做一个对比

方法Selenium1.0Selenium2.0
打开页面Selenium.open(String url);Driver.get(String url);
点击元素Selenium.click(String arg0);driver.findElement(By).click();
输入框

selenium.type(String arg0, String arg1);

arg0为元素定位,arg1为输入的值,

再次type时会清空了输入

WebElement element = driver.findElement(By);

element.sendkeys(arg0);

需要使用element.clear();来清空内容。

下拉选择框

Selenium.select(String arg0, String arg1);

arg0为元素定位,arg1为选择的值

找到下拉框元素:

Select select=new Select(driver.findElement(By));  

选择对应的选择项:

select.selectByVisibleText(String text);

//通过文本选择

select.selectByValue(String value);

//通过value选择

select.selectByIndex(int index)

//通过序号选择

单选多选框

选择:

selenium.check(String locator);

不选:

selenium.check(String locator);

判断是否选择:

Boolean isChecked(String locator);

定位元素:

WebElement element =driver.findElement(By);

点击:Element.click();

清除:Element.clear();

判断是否选择:

Boolean isSelected();

判断是否可选择:Boolean isEnabled();

获取文本内容selenium.getText(String locator);

WebElement element =driver.findElement(By);

element.getText();

弹出框

Selenium.chooseOkOnNextConfirmation();

Selenium.chooseCancelOnNextConfirmation();

Selenium.getConfirmation();

该方法我使用后没有成功,所以一直很纠结

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

alert.accept();

//点击OK

alert.dismiss();

//点击cancel

alert.getText();

//获取弹出框文本

2.0很好的处理了弹出框问题。

frame1.0中对frame没有特殊处理跟其他元素一样

2.0中需要在framedefaultContent切换后才能定位,

否则会出现找不到元素的问题

driver.switchTo().defaultContent();

//切换到默认页面内容

driver.switchTo().frame(WebElement frameElement);

//切换到对应的frame

页面等待

selenium.waitForPageToLoad(String arg0);

直接有方法实现页面加载

driver.manage().timeouts().pageLoadTimeout(30, 

TimeUnit.SECONDS);

//页面加载等待时间

driver.manage().timeouts().implicitlyWait(30,

TimeUnit.SECONDS); 

//定位元素等待时间

driver.manage().timeouts().setScriptTimeout(30, 

TimeUnit.SECONDS);

//异步加载等待时间

但是只是在firefox上才能起作用,其他浏览器需要

自己实现对应的方法。

隐藏元素1.0中直接可以操作,即使该元素的styledisplay:none如果不显示的元素是无法定位的,那就需要触发mouseover
之后才能定位。

以上表格中提到的如何通过By定位元素的内容可以参考以下文章:

http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/By.html

5. 通过以上几步的努力,1.0->2.0就还剩下最后一步,运行调试脚本的工作了。

===========================

添加微信zzzmmmkkk,可以通过:

1. 请在微信添加好友->搜索公众账号里查找zzzmmmkkk

2. 或者点击本文右上角按钮后选择关注公众账号

3. 扫描头像

zzzmmmkkk,本名赵敏科,6年测试经验,2年项目及团队管理经验,从事过多年功能测试,性能测试及自动化测试,乐于分享。

不定期发布有关测试技术文章,测试经验分享,测试思考和问题探讨。



TAG: Selenium selenium webdriver WebDriver 自动化测试

 

评分:0

我来说两句

Open Toolbar