Java 在使用Spring运行testNG(Selenium)测试时无法维护两个并行会话?
在使用Spring框架使用TestNG和Selenium运行简单测试时,我遇到了一个问题,问题是它无法启动两个并行会话(如果没有并行会话,它的工作将很好,没有任何问题)。 总体目标是启动两个并行浏览器,每个会话由springIOC管理。没有Spring,使用静态threadLocal很容易,但是有了Spring,我想维护由Spring自己管理的两个独立的IOC容器 请帮我解决这个问题。代码可在以下链接中找到, testNg.xml BaseTest.javaJava 在使用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
@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
方法跨越多个页面时,这在某种程度上有点复杂获取完整的更改。感谢您的解释。。它很有魅力。。只有一个问题,在您的代码中,我可以看到您重写了“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);
}
}