使用Selenium“自动”在不同的浏览器上运行JUnit测试

时间:2011-11-04 14:12:28

标签: java selenium junit

所以我正在使用selenium API,并成功使用它来测试firefox和chrome。但是我需要做什么才能自动在两个浏览器上运行相同的单元测试。我已经尝试将WebDrivers放在一个ArrayList<WebDriver> drivers对象中,但如果我这样做,测试就无法正常运行。目前,ArrayList中只有一个驱动程序,但它仍然不能只使用一个条目。这是一些代码......

package testsuites;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

public class BingTests extends BaseTestSuite{
//private WebDriver fireFoxDriver;
private WebDriver chromeDriver;
private WebDriver fireFoxDriver;
private  ArrayList<WebDriver> drivers;

@Before
public void setUp() throws Exception {
    fireFoxDriver = new FirefoxDriver();
    fireFoxDriver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    drivers.add(fireFoxDriver);
}

@Test
public void testGoogle(){
    for(WebDriver driver: drivers){
        driver.get("http://www.bing.com");
        driver.findElement(By.id("sb_form_q")).clear();
        driver.findElement(By.id("sb_form_q")).sendKeys("Selenium IDE");
        driver.findElement(By.id("sb_form_go")).click();
          driver.findElement(By.xpath("//ul[@id='wg0']/li[2]/div/div/h3/a/strong")).click();
        WebElement elem = driver.findElement(By.id("mainContent")); 
        assertTrue(elem.getText().contains("Selenium News"));
    }
}

@Test
public void isWikiContentCorrect(){
    for(WebDriver driver: drivers){
        driver.get("http://www.bing.com");
        driver.findElement(By.id("sb_form_q")).clear();
        driver.findElement(By.id("sb_form_q")).sendKeys("Saturn");
        driver.findElement(By.id("sb_form_go")).click();
        driver.findElement(By.linkText("Saturn - Wikipedia, the free encyclopedia")).click();
        driver.findElement(By.cssSelector("li.toclevel-1.tocsection-9 > a > span.toctext")).click();
        assertTrue(driver.getPageSource().contains("53 of which"));
    }
}

@Test
public void isWikiTitleCorrect(){
    for(WebDriver driver: drivers){
        driver.get("http://www.bing.com");
        driver.findElement(By.id("sb_form_q")).clear();
        driver.findElement(By.id("sb_form_q")).sendKeys("Saturn");
        driver.findElement(By.id("sb_form_go")).click();
        driver.findElement(By.linkText("Saturn - Wikipedia, the free encyclopedia")).click();
        assertEquals("Saturn - Wikipedia, the free encyclopedia", driver.getTitle());
    }
}

@Test
public void testDropDownWithSelenium(){
    for(WebDriver driver: drivers){
        driver.get("http://www.bing.com");
        driver.findElement(By.id("sb_form_q")).clear();
        driver.findElement(By.id("sb_form_q")).sendKeys("Neptunes moon");
        driver.findElement(By.partialLinkText("moons and rings")).click();
        driver.findElement(By.linkText("Neptune (planet) :: Neptune's moons       and rings -- Britannica Online ...")).click();
        List<WebElement> elems = driver.findElements(By.tagName("Input"));
        for(WebElement elem: elems){
            System.out.println(elem.getText());
        }
    }
}

@After
public void tearDown() throws Exception {
    for(WebDriver driver: drivers){
        driver.close();
    }
}
}

2 个答案:

答案 0 :(得分:2)

您采用了错误的做法。此实现需要在测试方法中使用不必要的循环代码。随着测试用例数量的增加,这种做法变得更加痛苦(想想100多个测试用例)。

使用Selenium Grid或使用QAF formerly ISFW。在Qmetry Automation Framework(QAF)中,您可以在配置文件中将其设置为针对不同的浏览器运行。 例如

<suite name="Test Automation" verbose="0" parallel="tests">

    <test name="Test on FF">
      <parameter name="browser" value="InternetExplorerWebDriver" />
    ...
    </test>
    <test name="Test on IE">
      <parameter name="browser" value="firefoxWebDriver" />
    ...
    </test>
</suit>

答案 1 :(得分:1)

在不同浏览器上使用Selenium进行JUNIT

推出不同的浏览器:Chrome&amp; FireFox自动

public class SimpleJunit {
    private static WebDriver driver;
    public static int random = 0;
    private String baseURL;
    // @BeforeClass : Executes only once for the Test-Class. 
    @BeforeClass public static void setting_SystemProperties(){
        System.out.println("System Properties seting Key value.");

        System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");  // Chrome Driver Location.
    }
    // @Before      : To execute once before ever Test.
    @Before public void test_Setup(){       
        System.out.println("Launching Browser");
        if (random == 0) {
            driver = new ChromeDriver(); // Creates new SessionID & opens the Browser.
        }else {
            driver = new FirefoxDriver();
        }

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

        System.out.println("Session ID : " + ((RemoteWebDriver) driver).getSessionId() );
    }
    //  @Test        : Testing senarios.
    @Test public void robot_ScreenShot() throws AWTException, IOException{
        System.out.println("Robot Tset Screen Shot.");  
        baseURL = "http://searchsoa.techtarget.com/definition/stickiness";
                Robot robot = new Robot();   // CTRL+T new tab in Browser.                   

        driver.get(baseURL);        

                Toolkit toolkit = Toolkit.getDefaultToolkit();  
                int width = (int) toolkit.getScreenSize().getWidth();  
                int height = (int) toolkit.getScreenSize().getHeight();                 

                Rectangle area = new Rectangle(0, 0, width, height);
                BufferedImage bufferedImage = robot.createScreenCapture(area);
                ImageIO.write(bufferedImage, "png", new File("D:\\Screenshots\\JUNIT-Robot.png"));
                random += 1;
    }
    @Test public void selenium_ScreenShot() throws IOException { 
        baseURL = "http://www.w3schools.com/css/css_positioning.asp";
        driver.get(baseURL);
        System.out.println("Selenium Screen shot.");
        File screenshotFile = ((RemoteWebDriver) driver).getScreenshotAs(OutputType.FILE);                        
        FileUtils.copyFile(screenshotFile, new File("D:\\Screenshots\\JUNIT-Selenium.jpg"));
        random += 1;
    }
    // @After       : To execute once after ever Test.
    @After  public void test_Cleaning(){
        System.out.println("Closing Browser");
        baseURL = null;     
        driver.close(); // Removing SessionID & Close the Browser.      
/*if you are not using driver.quit(). then JUNIT-Test will not terminate untill you end chromedriver.exe process
  in Task-Manager. use CTRL+SHIFT+ESC to open TaskManager then goto processes-view find chromedriver.exe and 
  then end the process manually. */ 
        driver.quit(); // Ends the Process by removing chromedriver.exe process from Task-Manager.
    }
    // @AfterClass  : Executes only once before Terminating the Test-Class.
    @AfterClass public static void clearing_SystemProperties(){
        System.out.println("System Property Removing Key value.");              
        System.clearProperty("webdriver.chrome.driver");
    }   
}

JUnit Tests execution order.