selenium 怎么使用java编写测试用例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了selenium 怎么使用java编写测试用例相关的知识,希望对你有一定的参考价值。

参考技术A control-1.0.1-dist.zip。 解压。
2. 用命令行来到解压的文件夹下: \selenium-remote-control-0.9.2\selenium-server-0.9.2
3. 运行: java -jar selenium-server.jar 启动selenium server (务必启动!!)
4. 在Eclipse创建一个项目,在项目的build path里面加上junit.jar和selenium-java-client-driver.jar(这个在刚解压的包里面)
5. 先利用firefox selenium IDE来录制检测页面检测功能用的junit代码。
6. 在项目里面新建一个class(junit用例):将上面的junit代码帖于此。
7. 根据eclipse的错误提示来增加相应要import的类
8. 在进行测试前,最好将对应浏览器关闭,否则容易出错。
9. 然后在Eclipse里运行 “Run As -> unit Test”即可看到自动化的范例.
10.运行期间,会弹出ie窗口,自动进 行操作测试。检测完后,若junit显示为“绿色”则表示成功。
下面粘贴一下那个测试小程序
import com.thoughtworks.selenium.SeleneseTestCase;public class Untitled extends SeleneseTestCase
public void setUp() throws Exception
//由于selenium 对*firefox不支持3.6版本的.只能支持3.0版本.所以,最好将selenium IDE录制的代码中的firefox改为ie进行测试。
//setUp("http://www.google.cn/", "*firefox");
setUp("http://www.google.cn/", "*iexplore");

public void testUntitled() throws Exception
selenium.open("/");
selenium.type("q", "baidu");
selenium.click("btnG");
selenium.waitForPageToLoad("30000");
selenium.click("link= 百度一下,你就知道");
//添加断言进行测试:
// assertTrue(selenium.isTextPresent("OpenQA: Selenium")); //测试出错,程序退出
assertTrue(selenium.isTextPresent("百度一 下,你就知道")); //测试成功,程序继续

//用于让测试的页面关闭.若不写,则页面不会关闭
public void tearDown() throws Exception
selenium.stop();


(7)
7.1
selenium 常用操作有:open,type,click,select,selectFrame:
1. open("/")打开的是当前的网址;selenium.open("/dmmc/"):在当前的网址后面追回/dmmc/;
2. type,click,select,selectFrame各方法使用时,对元素的定位都可采用元素ID 或 xpath方式;
3. type,click,select,selectFrame去选择元素时,可以直接用元素的ID作为标 记.
4. 如:selenium.type("loginName", "coship");;采用xpath方式时,则格式如://元素名1[元素属性名1='元素属性值1']/元素名2[元素属性名2='元素 属 性值2']/....
如:selenium.type("//input[@name='admin.password']", "coship")7.2
常用命令用法:
1)
type的两种不同定位方式:
selenium.type("loginName", "coship");
//以下语句的"xpath="可以省略
selenium.type("xpath=//input[@name='admin.password']", "coship");
2)
click的两种不同定位方式:
selenium.click("imageField"); 即是通过ID定位:<input type="submit" value=" " id="imageField">
selenium.click("//input[@type='submit']"); (通过属性input-type)
selenium.click("//input[@value='确定']"); (通过属性input-value)
selenium.click("//input[@name='devTypeIds' and @value='000002']") (还可通过属性@id)
3)
点击链接方式:
对于动态内容的获取,尽量避 免采用第一种方式(若内容变了,则出错),而采用第二种方式.
实现方式一:
点击链接:<a href=..>801830456628</a>
selenium.click("link=801830456628");
实现方式二:
获取id=adminList的table中的tbody下的第三行,第二列中的a href元素。
selenium.click("//table[@id='adminsList']/tbody/tr[3]/td[2]/a");
4)
选 择下拉框:
实现方式一:
selenium.select("status", "label=启用");
即 是:<select id="status"><option value="1">启用</option></select>
实现方式二:
selenium.select("xpath=//SELECT[@id='status']", "index=1");
具体应用,请见以下实例。7.3
实例:
用于检测abmc系统各模块功能是否正常。
方式:
用selenium IDE录制abmc系统各模块功能操作.(前提是:这些操作,这些功能都是正确成功),以后当abmc系统升级,更改后,即可运行此脚本,来检查升级是否 影响系统功能实现。若系统更改有错,则selenium中运行中某一步骤时,会出错退出。
如:
系统更改后导致某一页面打不开,这时 selenium运行到此页面时,就不能继续往下操作,就会出错而退出。注意:
1.同时,也可在测试代码中添加一些断言判断来判断成功,失败。
2.
对于firefox selenium IDE录制的脚本要进行适当的修改,尽量让selenium用元素ID来定位操作元素,而不通过元素名(元素名易变化)。
3.
若selenium RC检测代码出错,也不一定是系统升级有问题,可能是系统升级后,有些数据删除,修改了,selenium RC在回放操作时,找到原来录制时对应的数据而出错。具体代码如下:
//对于click,select,selectFrame去选择元素时,可以直接用元素的ID作为标记.// 如:selenium.click("元素ID");public class AbmcSeleniumTest extends SeleneseTestCase
public void setUp() throws Exception
setUp("http://192.31.52.103:8080/", "*iexplore");


public void testUntitled() throws Exception
selenium.open("/abmc/");

//type的两种不同定位方式
selenium.type("loginName", "coship");
//以下语句 的"xpath="可以省略
selenium.type("xpath=//input[@name='admin.password']", "coship");

// selenium.click("imageField"); 即是通过ID 定位:<input type="submit" value=" " id="imageField">
selenium.click("//input[@type='submit']");

//等待一个新的页面加载。 以毫秒为单位,超过后该命令将返回错误。
selenium.waitForPageToLoad("30000");

//即选择<frame src="device/index.jsp" id="mainFrame">
selenium.selectFrame("mainFrame");

//对于动态内容的获取,尽量避免采用第一种方式 (若内容变了,则出错),而采用第二种方式
//点击链接:<a href=..>801830456628</a>
// selenium.click("link=801830456628");
//实现方式二:获取id=adminList的table中的tbody下的第三行,第二列中的a href元素。
selenium.click("//table[@id='adminsList']/tbody/tr[3]/td[2]/a");

selenium.waitForPageToLoad("30000");
selenium.click("//input[@value=' 返回']");
selenium.waitForPageToLoad("30000");
//因为有多个“查看应用列表”,若不指定,默认获取第一个
selenium.click("link=查看应用列表");
selenium.click("btn_dsure");

// 方式一:
//selenium.click(" //a[@onclick=\"showPage('应用列表','deviceAppList.action?device.swType=2&device.deviceId=0000257&device.deviceName=801830456628&device.specName=DevTyp',750,400)\"]");
//方式二:
selenium.click("//table[@id='adminsList']/tbody/tr[3]/td[5]/span[1]/a");

selenium.click("btn_dsure");
selenium.selectFrame("relative=up");
selenium.selectFrame("leftFrame");
selenium.click("link=应用文件管理");
selenium.click("link=应用文件信息");
selenium.selectFrame("relative=up");
selenium.selectFrame("mainFrame");
selenium.click("//a[@onclick=\"showPage('匹配终端类型','appTypeList.action?application.appId=01&application.appName=maliao',750,400)\"]");
selenium.click("btn_dsure");
selenium.click("//table[@id='adminsList']/tbody/tr[7]/td[8]/span[2]/a");
selenium.waitForPageToLoad("30000");
selenium.click("//input[@name='devTypeIds' and @value='000002']");
selenium.click("//input[@value='确定']");
selenium.waitForPageToLoad("30000");
selenium.click("//a[@onclick=\"showPage('匹配终端类型','appTypeList.action?application.appId=01&application.appName=maliao',750,400)\"]");
selenium.click("btn_dsure");
selenium.selectFrame("relative=up");
selenium.selectFrame("leftFrame");
selenium.click("link=终端应用管理");
selenium.click("link=终端应用许可");
selenium.selectFrame("relative=up");
selenium.selectFrame("mainFrame");

// selenium.select("status", "label=启用"); 即是:<select id="status"><option value="1">启 用</option></select>
selenium.select("xpath=//SELECT[@id='status']", "index=1");

selenium.click("//input[@type='image']");
selenium.waitForPageToLoad("30000");
selenium.click("//input[@type='image']");
selenium.waitForPageToLoad("30000");
selenium.selectFrame("relative=up");
//即 选择<frame src="device/index.jsp" id="mainFrame">
selenium.selectFrame("topFrame");
selenium.click("link=注销");
//若要测试其 它的网页,可以继续selenium.open(..)


#web测试技术

行为驱动:Cucumber + Selenium + Java - 实现测试用例的参数化

4.1 什么是用例参数化

实际测试中,我们可能经常会去测试几个类似的场景,或者一些大同小异的测试点。

比如说,测试用户登录的过程中,为了满足测试的完整性,我们会要通过等价类划分等基本方法,去测试登录系统对于有效类--正确的用户名密码;和无效类--错误的用户名密码等场景。

这一些场景的前序步骤都很类似,如果我们对于每一个这样的用例都从头到尾按照我们之前的例子那样,从gherkin的用例编写,到java代码的解释这么写下来,代码量会很多而且没有必要。

所以我们就要想,对于这样的测试,我们能不能将他们集合在一起,用参数化或者数据驱动的方式去实现?

4.2 Cucumber的数据驱动

我们直接去我们的代码里新建一个test.feature特性文件,如果eclipse的cucumber插件正确安装的话,那么不但这个文件会有独特的外观,你还会发现文件中自带了对于gherkin用例的一个模板:

  技术图片

#Author: your.email@your.domain.com
#Keywords Summary :
#Feature: List of scenarios.
#Scenario: Business rule through list of steps with arguments.
#Given: Some precondition step
#When: Some key actions
#Then: To observe outcomes or validation
#And,But: To enumerate more Given,When,Then steps
#Scenario Outline: List of steps for data-driven as an Examples and <placeholder>
#Examples: Container for s table
#Background: List of steps run before each of the scenarios
#""" (Doc Strings)
#| (Data Tables)
#@ (Tags/Labels):To group Scenarios
#<> (placeholder)
#""
## (Comments)
#Sample Feature Definition Template
@tag
Feature: Title of your feature
  I want to use this template for my feature file

  @tag1
  Scenario: Title of your scenario
    Given I want to write a step with precondition
    And some other precondition
    When I complete action
    And some other action
    And yet another action
    Then I validate the outcomes
    And check more outcomes

  @tag2
  Scenario Outline: Title of your scenario outline
    Given I want to write a step with <name>
    When I check for the <value> in step
    Then I verify the <status> in step

    Examples: 
      | name  | value | status  |
      | name1 |     5 | success |
      | name2 |     7 | Fail    |

可以看到,@tag2这个标签标记的测试用例用了一种我们之前没有用过的格式来组织用例,并且下面还有一个Examples表格。这就是cucumber自带的数据驱动表格。

下面我们就用这种形式来实现数据驱动和参数化。

4.3 编写参数化的feature特性文件

我们来实现之前提到的登录测试。

先在features文件夹底下新建一个名为testLogin.feature的特性文件。文件中写入如下gherkin代码:

@tag
Feature: Test login feature of lemfix
  I want to use this case to test login functionality

  @tag1
  Scenario Outline: Test login feature of lemfix
    Given I navigated to lemfix site
    When I input “<username>” and “<password>” to login
    Then I verify login “<result>”

    Examples: 
      | username        | password  | result  |
      | vincent20181030 | password1 | success |
      | vincent20000000 | password1 | fail    |

这里我们在一个用例里,用数据表格的方式,分别想去测试用户登录成功/失败的案例。数据表格的第一行是存在的用户名和密码,预计登录成功;而第二行的用户是不存在,预计登录失败。

4.4 将feature进行步骤定义

在stepDefinitions文件夹下新建TestLogin.java,写入如下代码:

package stepDefinitions;

import static org.testng.Assert.assertTrue;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;

import cucumber.api.PendingException;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;

public class TestLemfix 
    WebDriver driver;
    
    
    @Given("^I navigated to lemfix site$")
    public void i_navigated_to_lemfix_site() throws Throwable 
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.manage().window().maximize();
        
        driver.get("http://fm.lemfix.com");
    

    @When("^I input \\"([^\\"]*)\\" and \\"([^\\"]*)\\" to login$")
    public void i_input_vincent_and_password_to_login(String us_name, String us_psswd) throws Throwable 
        WebElement loginTop;
        WebElement username;
        WebElement password;
        WebElement loginBTN;
        
        loginTop = driver.findElement(By.xpath("html/body/div[1]/div/div[3]/ul/li[2]/a"));
        loginTop.click();
        
        username = driver.findElement(By.id("user_login"));
        password = driver.findElement(By.id("user_password"));
        loginBTN = driver.findElement(By.xpath(".//*[@id='new_user']/div[4]/input"));
        
        username.sendKeys(us_name);
        password.sendKeys(us_psswd);
        loginBTN.click();
        
        Thread.sleep(1000);
    

    @Then("^I verify login \\"([^\\"]*)\\"")
    public void i_verify_login_result(String rs) throws Throwable 
        String title = driver.getTitle();
        String result;
        if(title.contains("登录"))
            result = "fail";
        else if(title.equals("Lemfix"))
            result = "success";
        else
            result = null;
        
        System.out.println(title);
        System.out.println("result=" + result);
        Assert.assertTrue(result.equals(rs));
        
        Thread.sleep(1000);
        driver.quit();
    

注意在java代码中,解释方法也同样对应的引入参数,如:

技术图片

技术图片

运行runner类,测试通过,到此为止我们就实现了用参数化/数据驱动的形式来实现cucumber测试。

以上是关于selenium 怎么使用java编写测试用例的主要内容,如果未能解决你的问题,请参考以下文章

selenium测试用例的编写

Selenium 2自动化测试实战34(编写Web测试用例)

基于selenium的web自动化测试

Selenium+PageObject+Java实现测试用例

Python+Selenium+Unittest编写超链接点击测试用例

行为驱动:Cucumber + Selenium + Java - 实现测试用例的参数化