JUnit4测试用例不会继续

时间:2013-05-09 11:32:10

标签: webdriver junit4 test-suite

我使用Selenium IDE创建了一个包含2个测试用例的测试套件。我将套件导出为Java / JUnit4 / WebDriver。

第一个测试用例允许用户登录网站,找到匹配后进行会员搜索,访问会员的个人资料

第二个测试用例:一旦在会员资料中,点击“捐赠”链接即可添加承诺。

测试套件在Selenium IDE中运行良好,但是当我执行套件时,它在Eclipse中挂起。   在Eclipse中的行为,第一个测试用例运行正常,第二个案例打开一个新的浏览器,系统需要登录(输入用户名和密码)。

我想知道该怎么做,因此测试用例2继续而不要求用户登录。  感谢您的帮助和建议。

这是我的测试套件代码分解为3个部分(我删除了uid和pd,因为该网站是内部网站)

-test suite runner file: searchDonorAddPledge   
-test case1: searchDonorSuzy.class    
-test case2: DonorAddPledge.class

失败跟踪消息:

  1. org.openqa.selenium.StaleElementReferenceException:元素不是 在缓存中找到 - 也许页面已经改变了 查找命令持续时间或超时:30.12秒

  2. 引起: org.openqa.selenium.remote.ErrorHandler $ UnknownServerException: 在缓存中找不到元素 - 也许页面已经改变了 它被查询构建信息:版本:'2.31.0',修订版:'1bd294d', 时间:'2013-02-27 20:53:56'

  3. 亚军档案

    import org.junit.runners.Suite;
    import org.junit.runner.RunWith;
    
          @RunWith(Suite.class)
          @Suite.SuiteClasses
          (
            {
                SearchDonorSuzy.class,
                DonorAddPledge.class      
            }
          )
    
          public class searchDonorAddPledge { }
    

    testcase 1代码:

    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.support.ui.Select;
    
    public class SearchDonorSuzy 
    {
        private WebDriver driver;
          private String baseUrl;
          private boolean acceptNextAlert = true;
          private StringBuffer verificationErrors = new StringBuffer();
    
          @Before
          public void setUp() throws Exception {
            driver = new FirefoxDriver();
            baseUrl = "https://jlaustin.tcheetah.com/";
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
          }
    
          @Test
          public void testSearchDonorSuzy() throws Exception {
            // set overall speed of the test case
            // ERROR: Caught exception [ERROR: Unsupported command [setSpeed | 4000 | ]]
            driver.get(baseUrl + "/?html=openid");
            driver.findElement(By.cssSelector("input[type=\"submit\"]")).click();
            driver.findElement(By.id("edit-name")).clear();
            driver.findElement(By.id("edit-name")).sendKeys("username");
            driver.findElement(By.id("edit-pass")).clear();
            driver.findElement(By.id("edit-pass")).sendKeys("password");
            driver.findElement(By.id("edit-submit")).click();
            driver.findElement(By.id("cmp_admin")).click();
            driver.findElement(By.id("quicksearch_anchor")).click();
            driver.findElement(By.cssSelector("img[alt=\"Member\"]")).click();
            driver.findElement(By.id("search_name")).clear();
            driver.findElement(By.id("search_name")).sendKeys("suzy");
            driver.findElement(By.cssSelector("input[type=\"image\"]")).click();
            driver.findElement(By.linkText("Balagia, Suzy")).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 String closeAlertAndGetItsText() 
          {
            try 
            {
              Alert alert = driver.switchTo().alert();
              if (acceptNextAlert) 
              {
                alert.accept();
              } 
              else 
              {
                alert.dismiss();
              }
              return alert.getText();
            } 
            finally 
            {
              acceptNextAlert = true;
            }
          }
    
    }
    

    testcase2代码:

    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.support.ui.Select;
    
    public class DonorAddPledge 
    {
          private WebDriver driver;
          private String baseUrl;
          private boolean acceptNextAlert = true;
          private StringBuffer verificationErrors = new StringBuffer();
    
          @Before
          public void setUp() throws Exception 
          {
            driver = new FirefoxDriver();
            baseUrl = "https://jlaustin.tcheetah.com/";
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
          }
    
          @Test
          public void testDonorAddPledge() throws Exception 
          {
            driver.get(baseUrl + "/?nd=db_member&account_id=942&nowwritestate=i1110536420226242");
    
            driver.findElement(By.xpath("(//a[contains(text(),'Donor')])[2]")).click();
            driver.findElement(By.linkText("Campaign Manager")).click();
            new Select(driver.findElement(By.id("campaign_id"))).selectByVisibleText("A Christmas Affair 2012");
            driver.findElement(By.xpath("//a[contains(text(),'Add\n            pledge')]")).click();
            driver.findElement(By.id("pledge_amount")).clear();
            driver.findElement(By.id("pledge_amount")).sendKeys("100.00");
            driver.findElement(By.id("pledge_notes")).clear();
            driver.findElement(By.id("pledge_notes")).sendKeys("test pledge");
            driver.findElement(By.cssSelector("input[type=\"image\"]")).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 String closeAlertAndGetItsText() 
          {
            try 
            {
              Alert alert = driver.switchTo().alert();
              if (acceptNextAlert) 
              {
                alert.accept();
              } 
              else 
              {
                alert.dismiss();
              }
              return alert.getText();
            }
    
            finally 
            {
              acceptNextAlert = true;
            }
          }
    
    }
    

1 个答案:

答案 0 :(得分:1)

两个测试用例在其@Before方法中实例化一个新驱动程序;这将启动一个具有全新会话的新浏览器实例,因此它会丢失以前任何测试用例中的登录会话详细信息:

driver = new FirefoxDriver();

我建议调查两种替代策略:

  1. 每个类实例化一次驱动程序,并将测试用例放入依赖于使用相同会话的同一个类中。
  2. 重组您的测试用例,使它们彼此独立。
  3. 1。在多个测试用例中保持相同的会话

    通过每个类仅实例化一次驱动程序,而不是为每个测试用例单独设置驱动程序,可以提高代码执行效率。但是,您应该将此视为主要是提高效率;我不建议将它用作将测试用例链接在一起的方法,以便测试用例2依赖于成功运行的测试用例1。

    2。使您的测试用例独立

    按顺序构建测试用例总是诱人的,这样你就可以进行测试用例1(例如,包括登录),然后自然地进入测试用例2(进行一些进一步的操作)。但是我警告说这会导致问题。它使您的整个测试套件更加脆弱 - 如果测试用例1中存在问题,则所有测试用例都会失败。它使您的测试变得不那么灵活 - 您不能只运行测试用例3来单独重新测试,而且您无法从套件中挑选和选择单独的测试用例。

    我强烈建议你研究第二种策略;因此,例如,如果测试用例1只是测试登录例程,请让它只测试登录例程,然后再次注销。如果测试用例2只是测试一些只能在登录后才能达到的功能 - 那么,让它登录以便它可以获得它感兴趣的功能。测试用例1也登录的事实与测试用例2无关,这也不是问题 - 事实上,你可以把它看作是一个机会,开始重新分解你的测试用例,将重复的代码提取到一个单独的方法调用中。