如何在Selenium Webdriver中使用相同的会话打开浏览器?

时间:2016-04-12 11:14:23

标签: java session selenium

我有一个应用程序自动化框架,其中应用程序实际上被视为浏览器。现在,这是我的功能。

通常它会始终启动登录页面。现在我的测试用例要求我首先崩溃应用程序,然后重新启动它,这将指向一些错误报告'页面而不是这次启动登录页面。

如果我从命令提示符执行此操作,则此功能正常工作,因为每个命令提示符窗口都是一个会话,因此基本上它会在同一会话中崩溃并重新打开。

现在这在通过webdriver运行时不起作用,因为每次运行@BeforeClass时,它都会创建一个新的应用程序实例,因此我会再次指向登录页面而不是指向错误页面。

有关如何在同一会话中实现崩溃和重新启动应用程序的任何建议都会有很大帮助。我只提供了调用驱动程序的一小部分代码。

protected void setupChromeRemoteDriver(String hubUrl, String platformName) throws IOException {

        Platform platform = (platformName != null) ? Platform.valueOf(platformName) : Platform.ANY;

        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
        capabilities.setBrowserName("chrome");
        capabilities.setPlatform(platform);
        capabilities.setCapability(CapabilityType.TAKES_SCREENSHOT, true);

        Set<Cookie> cookies = driver.manage().getCookies();
        for(Cookie cookie : cookies){
            driver.manage().addCookie(cookie);
        }

        driver = new CustomRemoteWebDriver(new URL(hubUrl), capabilities);
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(Constants.ELEMENT_TIMEOUT_SECONDS, TimeUnit.SECONDS);
    }

CrashApplication.java

public void crashUTAApp(){
        String filePath = Constants.CRASHAPP_BATCHFILE_LOCATION;
        try{
            Process process = Runtime.getRuntime().exec(filePath); 
            if(null != process && process.waitFor() == 0 && process.exitValue() == 0){
                Reporter.log("App Crashed");
            }else{
                Reporter.log("Failed to crash app");
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    } 

1 个答案:

答案 0 :(得分:0)

实现此目的的一种可能的解决方法是在测试junit类中使用@Before注释并从其中调用CrashApplication。这样你就可以使用@BeforeClass启动驱动程序并在@Before中执行崩溃。请注意,如果使用此方法,则在每个@Test之前执行@Before时,只应在整个类中涵盖此方案。 简单表示结构:

(测试类)

@BeforeClass(创建新的app实例并调用webDriver实例)

@Before(在每个@Test之前执行,调用CrashApplication作为真正的@Test的前提条件)

@Test(将通过使用相同的会话执行并导航到登录屏幕)