Skip to content

Commit a558850

Browse files
authored
Selenium support user-provided network (#1207)
1 parent 155f962 commit a558850

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

packages/modules/selenium/src/selenium-container.test.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import path from "path";
22
import { Browser, Builder } from "selenium-webdriver";
3-
import { GenericContainer } from "testcontainers";
3+
import { GenericContainer, Network } from "testcontainers";
44
import tmp from "tmp";
55
import { getImage } from "../../../testcontainers/src/utils/test-helper";
66
import { SELENIUM_VIDEO_IMAGE, SeleniumContainer } from "./selenium-container";
@@ -45,4 +45,19 @@ describe.for(browsers)("SeleniumContainer", { timeout: 240_000 }, ([browser, ima
4545
expect(exitCode).toBe(0);
4646
// }
4747
});
48+
49+
it(`should use provided network when recording for ${browser}`, async () => {
50+
await using network = await new Network().start();
51+
52+
await using _webServer = await new GenericContainer("cristianrgreco/testcontainer:1.1.14")
53+
.withNetwork(network)
54+
.withNetworkAliases("webserver")
55+
.withExposedPorts(8080)
56+
.start();
57+
58+
await using container = await new SeleniumContainer(image).withRecording().withNetwork(network).start();
59+
60+
const { exitCode } = await container.exec(["getent", "hosts", "webserver"]);
61+
expect(exitCode).toBe(0);
62+
});
4863
});

packages/modules/selenium/src/selenium-container.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,36 +77,46 @@ export class SeleniumRecordingContainer extends SeleniumContainer {
7777
super(image);
7878
}
7979

80-
public override async start(): Promise<StartedSeleniumRecordingContainer> {
80+
private async createNetworkIfNeeded(): Promise<StartedNetwork | undefined> {
81+
if (this.networkMode) {
82+
return undefined;
83+
}
8184
const network = await new Network().start();
8285
this.withNetwork(network);
86+
return network;
87+
}
88+
89+
public override async start(): Promise<StartedSeleniumRecordingContainer> {
90+
const internalNetwork = await this.createNetworkIfNeeded();
8391
this.withNetworkAliases(SELENIUM_NETWORK_ALIAS);
8492

8593
const startedSeleniumContainer = await super.start();
8694

8795
const startedFfmpegContainer = await new GenericContainer(SELENIUM_VIDEO_IMAGE)
88-
.withNetwork(network)
96+
.withNetworkMode(this.networkMode!)
8997
.withEnvironment({ DISPLAY_CONTAINER_NAME: SELENIUM_NETWORK_ALIAS })
9098
.withWaitStrategy(Wait.forLogMessage(/.*video-recording entered RUNNING state.*/))
9199
.start();
92100

93-
return new StartedSeleniumRecordingContainer(startedSeleniumContainer, startedFfmpegContainer, network);
101+
return new StartedSeleniumRecordingContainer(startedSeleniumContainer, startedFfmpegContainer, internalNetwork);
94102
}
95103
}
96104

97105
export class StartedSeleniumRecordingContainer extends StartedSeleniumContainer {
98106
constructor(
99107
startedSeleniumContainer: StartedTestContainer,
100108
private readonly startedFfmpegContainer: StartedTestContainer,
101-
private readonly network: StartedNetwork
109+
private readonly internalNetwork?: StartedNetwork
102110
) {
103111
super(startedSeleniumContainer);
104112
}
105113

106114
override async stop(options?: Partial<StopOptions>): Promise<StoppedSeleniumRecordingContainer> {
107115
const stoppedSeleniumContainer = await super.stop(options);
108116
const stoppedFfmpegContainer = await this.startedFfmpegContainer.stop({ remove: false, timeout: 60_000 });
109-
await this.network.stop();
117+
if (this.internalNetwork) {
118+
await this.internalNetwork.stop();
119+
}
110120
return new StoppedSeleniumRecordingContainer(stoppedSeleniumContainer, stoppedFfmpegContainer);
111121
}
112122
}

0 commit comments

Comments
 (0)