如何在java中的webdriver中使用多个断言

时间:2014-11-06 12:45:27

标签: java selenium

我是Selenium Webdriver的新手,并试图学习这个API。我想知道如何在一次测试中有效地使用多个断言。我试图直接使用它,但它增加了我的代码长度,也很难调试。有任何建议如何完成它?

package com.eureqa.scripts;    
import java.util.concurrent.TimeUnit;    
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

    public class Phase1 {
    public static WebDriver driver;
    public static WebDriver driver1;

    public void navigation1(WebDriver driver1) 
    {
        boolean result=verifyElementPresent(driver1);
        if(result)
        {
            System.out.println("Element found");
        }
        else
        {
            System.out.println("Element not found");

        }



        driver1.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);



        boolean result1=assertElementPresent(driver1);
        if(result1)
        {
            System.out.println("Element asserted");
        }
        else
        {
            System.out.println("Element not asserted");
            driver1.quit();
        }

        driver1.findElement(By.linkText("Reports")).click();
    }





    public boolean verifyElementPresent(WebDriver driver1)
    {
        try{
            driver1.findElement(By.id("commonheader:headerForm:projectlist"));
            return true;

        }catch(Exception ex)
        {
            return false;
        }
    }

    public boolean assertElementPresent(WebDriver driver1)
    {
        try{
            driver1.findElement(By.linkText("Reports"));
            return true;

        }catch(Exception ex)
        {
            return false;

        }
    }




    public static void main(String arr[]) throws InterruptedException
    {
        WebDriver driver1=LoginObject.driver();
        System.out.println("Object Received");

        LoginEureqa m=new LoginEureqa();
        m.login(driver1);

        Phase1 p1=new Phase1();
        p1.navigation1(driver1);
        System.out.println();

        System.out.println("Phase1 executed successf`enter code here`ully");

    }

}

2 个答案:

答案 0 :(得分:1)

我已经将我的selenium测试与jUnit结合起来,所以我可以使用jUnit内置的断言。它使代码更容易使用。另一种你想要查看Selenium等待方法的方法。

当您考虑测试时,您还应该考虑在发现错误情况后是否确实需要测试继续运行。在您的示例中,测试尝试单击"报告"是否有意义?链接,如果verifyElementPresent和assertElementPresent都失败了?如果您在失败后不需要继续运行测试,那么您的代码将更加简单。

查看您的代码,我可能会重写导航1,例如:

package com.eureqa.scripts;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class Phase1 {
    public static WebDriver driver;
    public static WebDriver driver1;

    public void navigation1(WebDriver driver1) 
    {
        WebDriverWait wait = new WebDriverWait(driver, 10);
        assertTrue("commonheader:headerForm:projectlist not found", 
                     driver1.findElements(By.id("commonheader:headerForm:projectlist")).size() == 1);
        wait.until(ExpectedConditions.elementToBeClickable(By.linkText("Reports"))).click();
    }

    public static void main(String arr[]) throws InterruptedException
    {
        WebDriver driver1=LoginObject.driver();
        System.out.println("Object Received");

        LoginEureqa m=new LoginEureqa();
        m.login(driver1);

        Phase1 p1=new Phase1();
        p1.navigation1(driver1);
        System.out.println();

        System.out.println("Phase1 executed successf`enter code here`ully");

    }
}

现在,这并没有完全重现原始帖子中的内容,因为它会在每一步都失败。如果你想让第一个断言失败但是继续,你可以用try / catch块包围assertTrue,然后显示一个单独的消息。

navigation1中的代码非常简单。它首先尝试查找ID为" commonheader:headerForm:projectlist"如果它没有找到该元素,它将抛出一个测试错误,其中包含" commonheader:headerForm:projectlist not found"的消息。

第二步是等待链接可以点击文字"报告"如果该链接在10秒内没有出现,则会引发错误。

答案 1 :(得分:1)

有时,添加脚本可能需要多个断言。

就像

  1. 项目添加成功
  2. 不允许重复的项目。但是这两种说法都是正确的

在这种情况下,您可以按照以下方式处理两条消息:

String alert_Text = driver.switchTo().alert().getText(); 
String successMessage = "item successfully added."; 
String duplicateMessage = "Duplicate item not allowed";     
assertTrue(alert_Text.equals(successMessage) || alert_Text.equals(duplicateMessage), "Success or Duplicate both message will be count as successful message");