在使用 Spring 使用 testNG(Selenium) 进行 运行 测试时无法维持两个并行会话?
Unable to maintain two parallel sessions while running tests using testNG(Selenium) using Spring?
我在使用 Spring 框架使用 TestNG 和 Selenium 进行 运行 简单测试时遇到问题,问题是它无法启动两个并行会话(没有并行它工作正常没有任何问题) .
整体 objective 是启动两个并行浏览器,每个会话由 springIOC 管理。没有 Spring 使用静态 threadLocal 很容易做到,但是使用 spring 我想维护两个由 spring 本身管理的独立 IOC 容器。
请帮我解决这个问题。代码可在下方 link,
https://github.com/priyankshah217/AutomationFrameworkUsingSpringDI.git
testNg.xml
<test name="search-engine-test">
<classes>
<class name="com.test.framework.tests.TestAmazonWeb"/>
</classes>
</test>
TestConfig.java
@Configuration
@ComponentScan("com.test.framework")
public class TestConfig {
WebDriver webDriver;
@Bean
public WebDriver getDriver() {
if (webDriver == null || ((ChromeDriver) webDriver).getSessionId() == null) {
webDriver = new ChromeDriver();
}
return webDriver;
}
}
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);
}
}
所有 Page 对象都是 spring 带有 WebDriver(自动装配)的组件。
您的代码库中存在一些阻止并发支持的问题。
-
autowired
WebDriver
实例的范围应该定义为 prototype
而不是 singleton
(这是默认范围)。这样每个页面对象基本上都会获得自己的 WebDriver 实例。虽然当您的 @Test
方法跨越多个页面时,这在某种程度上有点复杂。
- 如果您要使用原型范围的 webdriver,您处理 post 处理(其中您正在初始化页面工厂)的方式也必须更改,因为您现在负担不起在那里自动装配网络驱动程序,但现在必须从页面对象中提取它 class.
为了以更易于理解的方式解释更改,我已针对您的存储库提出拉取请求。
参考https://github.com/priyankshah217/AutomationFrameworkUsingSpringDI/pull/2
完整的更改集。
我在使用 Spring 框架使用 TestNG 和 Selenium 进行 运行 简单测试时遇到问题,问题是它无法启动两个并行会话(没有并行它工作正常没有任何问题) . 整体 objective 是启动两个并行浏览器,每个会话由 springIOC 管理。没有 Spring 使用静态 threadLocal 很容易做到,但是使用 spring 我想维护两个由 spring 本身管理的独立 IOC 容器。
请帮我解决这个问题。代码可在下方 link, https://github.com/priyankshah217/AutomationFrameworkUsingSpringDI.git
testNg.xml
<test name="search-engine-test">
<classes>
<class name="com.test.framework.tests.TestAmazonWeb"/>
</classes>
</test>
TestConfig.java
@Configuration
@ComponentScan("com.test.framework")
public class TestConfig {
WebDriver webDriver;
@Bean
public WebDriver getDriver() {
if (webDriver == null || ((ChromeDriver) webDriver).getSessionId() == null) {
webDriver = new ChromeDriver();
}
return webDriver;
}
}
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);
}
}
所有 Page 对象都是 spring 带有 WebDriver(自动装配)的组件。
您的代码库中存在一些阻止并发支持的问题。
-
autowired
WebDriver
实例的范围应该定义为prototype
而不是singleton
(这是默认范围)。这样每个页面对象基本上都会获得自己的 WebDriver 实例。虽然当您的@Test
方法跨越多个页面时,这在某种程度上有点复杂。 - 如果您要使用原型范围的 webdriver,您处理 post 处理(其中您正在初始化页面工厂)的方式也必须更改,因为您现在负担不起在那里自动装配网络驱动程序,但现在必须从页面对象中提取它 class.
为了以更易于理解的方式解释更改,我已针对您的存储库提出拉取请求。
参考https://github.com/priyankshah217/AutomationFrameworkUsingSpringDI/pull/2
完整的更改集。