9

我正在使用 WebDriver 运行测试,当测试失败时,浏览器不会关闭。在 Windows 机器上,这是一个大问题,因为我有几个 IEDriver 实例仍在后台运行。

我尝试了一个似乎也不起作用的 try/catch 语句。如果测试失败,浏览器仍然保持打开状态。任何帮助将不胜感激。

try catch 语句看起来像这样:

try
{
   Assert.something(something something dark side);
   driver.quit();
}
catch(Exception e)
{
   System.out.println(e)
   driver.quit();
}

我的完整代码如下:

public class ClickAddMedication 
{
Browser browser = new Browser();

public void addMedication(String driverName)
{
    //Open Browser and navigate to page
    WebDriver driver = browser.getDriver(driverName);
    driver.manage().window().maximize();
    driver.get("http://someIP:8080/hmp_patient/index.html");

    //Click Add Medication button
    WebElement addBtn = driver.findElement(By.id("add-btn"));
    addBtn.click();

    //Verify Add Medication page has loaded successfully
    WebElement rxBtn = driver.findElement(By.className("icon-rx"));
    WebElement otcBtn = driver.findElement(By.className("icon-otc"));
    WebElement herbBtn = driver.findElement(By.className("icon-herb"));

    Assert.assertEquals(true, rxBtn.isDisplayed());
    Assert.assertEquals(true, otcBtn.isDisplayed());
    Assert.assertEquals(true, herbBtn.isDisplayed());

    driver.quit();

}

@Test(groups = {"functionalTests.FF"})
public void test_AddMedication_FF()
{
    addMedication("firefox"); 
}
@Test(groups = {"functionalTests.iOS"})
public void test_AddMedication_iOS()
{
    addMedication("iOS");
}
}

我使用 testng.xml 文件运行测试,并且希望无论测试是否通过都关闭浏览器。

下面是我的Browser课:

public class Browser 
{
public WebDriver getDriver(String driverName)
{
    WebDriver driver = null;
    if(driverName == "firefox")
    {
        driver = new FirefoxDriver();
    }
    else if(driverName == "chrome")
    {
        File chromeFile = new File ("C:/webdrivers/chromedriver.exe");
        System.setProperty("webdriver.chrome.driver", chromeFile.getAbsolutePath());
        driver = new ChromeDriver();
    }
    else if(driverName == "ie")
    {
        File ieFile = new File("C:/webdrivers/IEDriverServer.exe");
        System.setProperty("webdriver.ie.driver", ieFile.getAbsolutePath());
        driver = new InternetExplorerDriver();
    }
    else if(driverName == "iOS")
    {
        try 
        {
            driver = new RemoteWebDriver(new URL("http://localhost:3001/wd/hub"), DesiredCapabilities.ipad());
        } catch (MalformedURLException e) 
        {

            e.printStackTrace();
        }
    }


    return driver;

}
}
4

4 回答 4

6

您还没有提到您用于执行测试的框架,但处理此问题的一种方法是使用等效的“测试后”注释来完成此操作。JUnit 调用此注解@After,而 TestNG 调用它@AfterMethod。使用 after test 注释注释的方法将在使用 注释的每个方法之后运行@Test,无论测试的通过/失败状态如何。如果您希望跨测试方法使用相同的驱动程序实例,大多数测试运行程序都有一个@AfterClass注释或类似的,它将在@Test类中所有方法的末尾运行。

例如,您需要执行以下操作(注意将driver变量提升为类中的成员变量):

public class ClickAddMedication 
{
    // N.B. For this approach to work, you *must* have the "driver"
    // variable here. Having it as a member variable of the class is
    // what allows the addMedication() method to access it for manipulating
    // the browser, and the tearDown() method to access it for closing
    // the *same* *browser* *instance*.
    WebDriver driver;
    Browser browser = new Browser();

    public void addMedication(String driverName)
    {
        //Open Browser and navigate to page
        driver = browser.getDriver(driverName);
        driver.manage().window().maximize();
        driver.get("http://someIP:8080/hmp_patient/index.html");

        //Click Add Medication button
        WebElement addBtn = driver.findElement(By.id("add-btn"));
        addBtn.click();

        //Verify Add Medication page has loaded successfully
        WebElement rxBtn = driver.findElement(By.className("icon-rx"));
        WebElement otcBtn = driver.findElement(By.className("icon-otc"));
        WebElement herbBtn = driver.findElement(By.className("icon-herb"));

        Assert.assertEquals(true, rxBtn.isDisplayed());
        Assert.assertEquals(true, otcBtn.isDisplayed());
        Assert.assertEquals(true, herbBtn.isDisplayed());
    }

    @AfterMethod
    public void tearDown()
    {
        driver.quit();
    }

    @Test(groups = {"functionalTests.FF"})
    public void test_AddMedication_FF()
    {
        addMedication("firefox"); 
    }

    @Test(groups = {"functionalTests.iOS"})
    public void test_AddMedication_iOS()
    {
        addMedication("iOS");
    }
}
于 2012-12-21T18:58:35.303 回答
0

如果你使用 Ruby 和测试单元,你可以有这样的东西 -

如果您为多个测试共享 wedriver 浏览器会话,并且只需要在最后关闭浏览器

def self.shutdown
    @driver.quit
    assert_equal [], @verification_errors
end

或者如果您想在每次单独测试后关闭浏览器

def teardown
    @driver.quit
    assert_equal [], @verification_errors
end
于 2012-12-21T19:04:13.703 回答
0

这可能不是合适的解决方案,但我这样做是为了解决这个问题。

而不是Try{}catch... 使用throws:throws java.lang.AssertionError并在 catch 块中退出浏览器,例如:

public void testMethod() throws java.lang.AssertionError{

Assert.assertTrue(condition,Message);
}

catch(java.lang.AssertionError e){

e.printstactrace();

browser.quit();

Assert.fail();

}
于 2013-05-21T11:57:52.423 回答
0

driver.close() 应该为您解决问题。或者设置一个布尔标志,当测试失败时,布尔标志设置为真。

然后使用 driver.close() 或 System.exit(1) 应该可以工作!

如果您对上述解决方法有疑问,请告诉我。

于 2014-01-31T19:33:39.003 回答