Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
黄瓜+;SeleniumJava:在测试用例之间保持浏览器打开_Java_Selenium - Fatal编程技术网

黄瓜+;SeleniumJava:在测试用例之间保持浏览器打开

黄瓜+;SeleniumJava:在测试用例之间保持浏览器打开,java,selenium,Java,Selenium,我目前正在Java中使用Cucumber和SeleniumWebDriver来测试web应用程序。 我不太满意浏览器在每个测试用例之间是关闭和重新打开的 首先,它相当慢,而且,它对我来说毫无意义 我想做的是在每次测试之间注销应用程序,并保持浏览器打开 我原以为这条线可以完成这项工作,但它没有按预期工作: driver.navigate().to("http://myurl.url"); 而不是: driver.get("http://myurl.url"); 它将打开一个新浏览器。我理解它为

我目前正在Java中使用Cucumber和SeleniumWebDriver来测试web应用程序。 我不太满意浏览器在每个测试用例之间是关闭和重新打开的

首先,它相当慢,而且,它对我来说毫无意义

我想做的是在每次测试之间注销应用程序,并保持浏览器打开

我原以为这条线可以完成这项工作,但它没有按预期工作:

driver.navigate().to("http://myurl.url");
而不是:

driver.get("http://myurl.url");

它将打开一个新浏览器。我理解它为什么会这样做,但我想附加到我的浏览器的上一个会话。

如果我正确,您的浏览器实例化可能发生在
之前标记的
设置
方法中,关闭可能发生在
之后标记的
拆卸
方法中。如果您想停止关闭浏览器,则只需在拆卸中或在任何地方注释掉该代码。

您可以使用
@BeforeClass
@AfterClass
注释。它们分别在@before和@after之前运行。假设您尝试测试的测试用例在同一类中,您可以在
@BeforeClass
方法中初始化
WebDriver
,并在
@AfterClass
方法中关闭它

我找到了一种在测试之间保持浏览器打开的方法。我使用了
Singleton设计模式
picocontainer
。 在这个类中,我在
static
中声明了我的浏览器

public class Drivers {
    private static boolean initialized = false;
    private static WebDriver driver;

    @Before
    public void initialize(){
        if (!initialized){
            initialized = true;
            driver = new FirefoxDriver();
            driver.get("http://myurl.url");
        }
    }
    public static WebDriver getDriver(){
        return driver;
    }   
}
在每个
步骤定义
类中,我都有一个构造函数来实例化我的
单例

public class DashboardSteps extends SuperSteps {
    Drivers context;

    @After
    public void close(Scenario scenario) {
        super.tearDown(scenario);
        loginPage = homePage.clickLogout();
        loginPage.waitPageLoaded();
    }

    public DashboardSteps(Drivers context) {
        super(context);
    }
超级步课程:

public class SuperSteps {
    protected Drivers context;

    public SuperSteps(Drivers context){
        this.context = context;
    }

如您所见,每次测试后我都会返回登录页面,这样我就可以独立运行每个测试。

您好,谢谢您的回答。你是对的,但问题是我必须导航到一个URL。为此,我将其设置为“@Before”。在我的'@After'方法中,我不会关闭浏览器,但在下一个测试中,'@Before'会打开一个新浏览器。如果不想并行运行测试,请再进行一次黑客攻击,然后在Before方法中设置一个标志,如果有更多测试要运行或当前测试是最后一次测试,请在After方法中签入。在关闭浏览器后,当您到达@中的最后一个测试时。实际上,我的所有测试并不在同一个类中。这就是我有这个问题的原因。我现在找不到解决方案:(您将遇到的问题之一是JUnit没有对测试的执行顺序做出任何承诺。您可以将它们全部转储到一个套件中,但这无助于重新启动浏览器。您到底为什么希望保持浏览器打开?是纯粹为了速度,还是有其他原因?主要原因是速度。当您重新运行2k测试,打开/关闭会在过程中增加太多时间。但这也是因为我认为它不需要这样工作。有一些想法可能可信,也可能不可信。djangofan的回应(关于第二个)提到使用Selenium Grid并行运行多个测试。有一些其他选项可用于并行运行测试。但我不知道您是否能够非常干净地完成希望完成的任务。Djangofan的原始解决方案可能会起作用,但正如他指出的,它并不真正符合最佳实践。希望t帮助!祝你好运!使用SpecFlow for BDD会在不同场景之间关闭浏览器。因此,即使测试都在同一类中,场景也会故意以干净的状态执行…我看到子步类文件中存在漏洞。必须在每个子步类文件中写入它不是一个限制吗?确保用户在登录时已注销精简初始化步骤解决了此问题?您可以验证用户是否在初始化中注销。但如果我没有记错,子类不会从超类的注释继承,因此您必须在每个子步类文件中调用tearDown。您可以使用QMetry Automation Framework[]并使用it的不同功能来满足此类web自动化的共同需求。