Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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
Java 在使用Spring运行testNG(Selenium)测试时无法维护两个并行会话?_Java_Spring_Selenium_Testng_Spring Ioc - Fatal编程技术网

Java 在使用Spring运行testNG(Selenium)测试时无法维护两个并行会话?

Java 在使用Spring运行testNG(Selenium)测试时无法维护两个并行会话?,java,spring,selenium,testng,spring-ioc,Java,Spring,Selenium,Testng,Spring Ioc,在使用Spring框架使用TestNG和Selenium运行简单测试时,我遇到了一个问题,问题是它无法启动两个并行会话(如果没有并行会话,它的工作将很好,没有任何问题)。 总体目标是启动两个并行浏览器,每个会话由springIOC管理。没有Spring,使用静态threadLocal很容易,但是有了Spring,我想维护由Spring自己管理的两个独立的IOC容器 请帮我解决这个问题。代码可在以下链接中找到, testNg.xml BaseTest.java @ContextConfig

在使用Spring框架使用TestNG和Selenium运行简单测试时,我遇到了一个问题,问题是它无法启动两个并行会话(如果没有并行会话,它的工作将很好,没有任何问题)。 总体目标是启动两个并行浏览器,每个会话由springIOC管理。没有Spring,使用静态threadLocal很容易,但是有了Spring,我想维护由Spring自己管理的两个独立的IOC容器

请帮我解决这个问题。代码可在以下链接中找到,

testNg.xml

BaseTest.java

@ContextConfiguration(classes = {TestConfig.class})
public class BaseTest extends AbstractTestNGSpringContextTests {

    @Autowired
    private WebDriver webDriver;

    @AfterMethod
    public void tearDown() {
        webDriver.quit();
    }
}
GoogleHomePage.java

@PageObject
public class GoogleHomePage extends BasePage {
    @FindBy(name = "q")
    private WebElement searchTextbox;

    public void enterGoogleSearch() {
        hardWait();
        searchTextbox.sendKeys("Selenium");
        searchTextbox.sendKeys(Keys.RETURN);
    }

}

所有页面对象都是带有WebDriver(自动连线)的spring组件

您的代码库中有一些问题妨碍了并发支持

  • autowired
    WebDriver
    实例的作用域应定义为
    prototype
    ,而不是
    singleton
    (默认作用域)。这样,每个页面对象基本上都会获得自己的WebDriver实例。虽然当您的
    @Test
    方法跨越多个页面时,这在某种程度上有点复杂
  • 如果要使用原型范围的webdriver,那么处理后期处理(初始化页面工厂)的方式也必须改变,因为您现在无法在其中自动连接webdriver,但现在必须从页面对象类中提取它
  • 为了以更容易理解的方式解释这些更改,我对您的存储库提出了一个请求


    获取完整的更改。

    感谢您的解释。。它很有魅力。。只有一个问题,在您的代码中,我可以看到您重写了“run”,并在那个里显式退出了驱动程序。有没有办法在fixture methods afterMethod中关闭驱动程序?因为当我尝试时,它不起作用,只关闭浏览器的一个实例。@PriyankShah-我的PR在
    IHookable#run
    实现中注意退出驱动程序的原因是,一旦执行
    @Test
    方法,在从
    PostTestExecution
    获取
    WebDriver
    实例方面存在一些问题,因为spring通过其行为——如果它没有找到bean,它就会创建bean,我对spring不是很了解,不知道如何让它停止。这就是为什么我必须以它的方式处理WebDriver清理。
    @ContextConfiguration(classes = {TestConfig.class})
    public class BaseTest extends AbstractTestNGSpringContextTests {
    
        @Autowired
        private WebDriver webDriver;
    
        @AfterMethod
        public void tearDown() {
            webDriver.quit();
        }
    }
    
    @PageObject
    public class GoogleHomePage extends BasePage {
        @FindBy(name = "q")
        private WebElement searchTextbox;
    
        public void enterGoogleSearch() {
            hardWait();
            searchTextbox.sendKeys("Selenium");
            searchTextbox.sendKeys(Keys.RETURN);
        }
    
    }