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

Java 如何在Selenium Webdriver中使用相同的会话打开浏览器?,java,session,selenium,Java,Session,Selenium,我有一个应用程序自动化框架,其中应用程序实际上被视为浏览器。现在,这里是我的功能 通常,它总是启动登录页面。现在,我的测试用例要求我首先使应用程序崩溃,然后重新启动它,这将指向某个“错误报告”页面,而不是这次启动登录页面 如果我在命令提示符下执行此操作,此功能可以正常工作,因为每个命令提示符窗口都是一个会话,因此基本上它会在同一会话中崩溃并重新打开 现在,当通过webdriver运行时,这不起作用,因为每次@BeforeClass运行时,它都会创建应用程序的新实例,因此我会再次指向登录页面,而不

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

通常,它总是启动登录页面。现在,我的测试用例要求我首先使应用程序崩溃,然后重新启动它,这将指向某个“错误报告”页面,而不是这次启动登录页面

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

现在,当通过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);
    }

实现这一点的一个可能的解决方法是在测试junit类中使用@Before注释,并从内部调用CrashApplication。这样,驱动程序将以@BeforeClass启动,并在@BeforeClass内执行崩溃。请注意,如果使用这种方法,则整个类中只应包含这种场景,因为在每个@Test之前都会执行@Before。 结构的简单表示:

(测试班)

@BeforeClass(创建新的应用程序实例并调用webDriver实例)

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


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

实现这一点的一个可能的解决方法是在Test junit类中使用@Before注释,并从内部调用CrashApplication。这样,驱动程序将以@BeforeClass启动,并在@BeforeClass内执行崩溃。请注意,如果使用这种方法,则整个类中只应包含这种场景,因为在每个@Test之前都会执行@Before。 结构的简单表示:

(测试班)

@BeforeClass(创建新的应用程序实例并调用webDriver实例)

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

@测试(将使用相同的会话执行,并导航到登录屏幕)

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();
        }
    }