【发布时间】:2019-05-06 10:38:41
【问题描述】:
当前设置是 maven 并行执行 cucumber,执行 webdriver,执行 chromedriver 来测试我的软件:
马文:
<project>
...
<build>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
<parallel>both</parallel>
<threadCount>3</threadCount>
<runOrder>random</runOrder>
</configuration>
</plugin>
</plugins>
</build>
</project>
小黄瓜:
Function: Example
Scenario: Example 1
When I do something
Then I expect something
Scenario: Example 2
When I do some other thing
Then I expect some other thing
Cucumber-JVM / Webdriver-JVM / Chromedriver:
@Before
public void setUp() {
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("--window-size=1920,1080");
driver = new ChromeDriver(options);
driver.navigate().to(baseUrl);
}
@After
public void tearDown() {
if (driver != null) {
driver.quit();
}
}
原则上,这可以正常工作。测试以随机顺序并行执行,按照 maven pom 中的说明,在每个场景之前调用setUp(),在每个场景之后调用tearDown()。
然而,ChromeDriver 显然在一个浏览器会话中运行多个测试,因此 Cookie 等在 Functions 和 Scenarios 之间共享,导致它们没有正确地相互隔离,从而导致 cookie、会话等进一步出现问题。
通过 Cucumber-JVM 并行运行 Webdriver 时如何正确隔离每个测试用例(ChromeDriver 会话)?
【问题讨论】:
-
"ChromeDriver 显然在一个浏览器会话中运行多个测试" -- 如果驱动程序是在 Before 钩子中创建并在 After 钩子中关闭的,它应该为每个场景打开新的浏览器。驱动变量是静态的吗?你应该考虑使用 ThreadLocal 来存储每个线程的驱动程序。
-
您是否尝试过运行匿名/隐身会话?
标签: maven selenium selenium-webdriver selenium-chromedriver cucumber-jvm