Skip to content

Commit d7eb639

Browse files
authored
build: switch tests away from protractor (#33664)
Reworks most e2e tests not to use Protractor. Note that we have some test harnesses functionality built specifically for Protractor that we need to keep around.
1 parent 4a09fb6 commit d7eb639

16 files changed

Lines changed: 403 additions & 255 deletions

File tree

src/cdk-experimental/scrolling/BUILD.bazel

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
load("//src/e2e-app:test_suite.bzl", "e2e_test_suite")
1+
load("//src/cdk/testing/tests:webdriver-test.bzl", "webdriver_test")
22
load("//tools:defaults.bzl", "ng_project", "ng_web_test_suite", "ts_project")
33

44
package(default_visibility = ["//visibility:public"])
@@ -43,13 +43,19 @@ ts_project(
4343
testonly = True,
4444
srcs = glob(["**/*.e2e.spec.ts"]),
4545
deps = [
46+
"//:node_modules/@bazel/runfiles",
47+
"//:node_modules/@types/jasmine",
48+
"//:node_modules/@types/node",
4649
"//:node_modules/@types/selenium-webdriver",
47-
"//:node_modules/protractor",
50+
"//:node_modules/selenium-webdriver",
51+
"//src/cdk/testing/selenium-webdriver",
52+
"//src/e2e-app:e2e_setup",
4853
],
4954
)
5055

51-
e2e_test_suite(
56+
webdriver_test(
5257
name = "e2e_tests",
58+
server = "//src/e2e-app:server",
5359
deps = [
5460
":e2e_test_sources",
5561
],

src/cdk-experimental/scrolling/virtual-scroll.e2e.spec.ts

Lines changed: 72 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,121 @@
1-
import {browser, by, element, ElementFinder} from 'protractor';
2-
import {ILocation, ISize} from 'selenium-webdriver';
1+
import * as webdriver from 'selenium-webdriver';
2+
import {waitForAngularReady} from '../../cdk/testing/selenium-webdriver';
3+
import {createE2eWebDriver} from '../../e2e-app/e2e-setup';
34

45
declare var window: any;
56

7+
const {builder, port} = createE2eWebDriver();
8+
69
describe('autosize cdk-virtual-scroll', () => {
7-
let viewport: ElementFinder;
10+
let wd: webdriver.WebDriver;
11+
let viewport: webdriver.WebElement;
12+
13+
beforeAll(async () => {
14+
wd = await builder.build();
15+
});
16+
17+
afterAll(async () => {
18+
await wd.quit();
19+
});
820

921
describe('with uniform items', () => {
1022
beforeEach(async () => {
11-
await browser.get('/virtual-scroll');
12-
viewport = element(by.css('.demo-virtual-scroll-uniform-size cdk-virtual-scroll-viewport'));
23+
await wd.get(`http://localhost:${port}/virtual-scroll`);
24+
await waitForAngularReady(wd);
25+
viewport = await wd.findElement(
26+
webdriver.By.css('.demo-virtual-scroll-uniform-size cdk-virtual-scroll-viewport'),
27+
);
1328
});
1429

1530
it('should scroll down slowly', async () => {
16-
await browser.executeAsyncScript(smoothScrollViewportTo, viewport, 2000);
17-
const offScreen = element(by.css('.demo-virtual-scroll-uniform-size [data-index="39"]'));
18-
const onScreen = element(by.css('.demo-virtual-scroll-uniform-size [data-index="40"]'));
31+
await wd.executeAsyncScript(smoothScrollViewportTo, viewport, 2000);
32+
const offScreen = await wd.findElement(
33+
webdriver.By.css('.demo-virtual-scroll-uniform-size [data-index="39"]'),
34+
);
35+
const onScreen = await wd.findElement(
36+
webdriver.By.css('.demo-virtual-scroll-uniform-size [data-index="40"]'),
37+
);
1938
expect(await isVisibleInViewport(offScreen, viewport)).toBe(false);
2039
expect(await isVisibleInViewport(onScreen, viewport)).toBe(true);
2140
});
2241

2342
it('should jump scroll position down and slowly scroll back up', async () => {
2443
// The estimate of the total content size is exactly correct, so we wind up scrolled to the
2544
// same place as if we slowly scrolled down.
26-
await browser.executeAsyncScript(scrollViewportTo, viewport, 2000);
27-
const offScreen = element(by.css('.demo-virtual-scroll-uniform-size [data-index="39"]'));
28-
const onScreen = element(by.css('.demo-virtual-scroll-uniform-size [data-index="40"]'));
45+
await wd.executeAsyncScript(scrollViewportTo, viewport, 2000);
46+
const offScreen = await wd.findElement(
47+
webdriver.By.css('.demo-virtual-scroll-uniform-size [data-index="39"]'),
48+
);
49+
const onScreen = await wd.findElement(
50+
webdriver.By.css('.demo-virtual-scroll-uniform-size [data-index="40"]'),
51+
);
2952
expect(await isVisibleInViewport(offScreen, viewport)).toBe(false);
3053
expect(await isVisibleInViewport(onScreen, viewport)).toBe(true);
3154

3255
// As we slowly scroll back up we should wind up back at the start of the content.
33-
await browser.executeAsyncScript(smoothScrollViewportTo, viewport, 0);
34-
const first = element(by.css('.demo-virtual-scroll-uniform-size [data-index="0"]'));
56+
await wd.executeAsyncScript(smoothScrollViewportTo, viewport, 0);
57+
const first = await wd.findElement(
58+
webdriver.By.css('.demo-virtual-scroll-uniform-size [data-index="0"]'),
59+
);
3560
expect(await isVisibleInViewport(first, viewport)).toBe(true);
3661
});
3762
});
3863

3964
describe('with variable size', () => {
4065
beforeEach(async () => {
41-
await browser.get('/virtual-scroll');
42-
viewport = element(by.css('.demo-virtual-scroll-variable-size cdk-virtual-scroll-viewport'));
66+
await wd.get(`http://localhost:${port}/virtual-scroll`);
67+
await waitForAngularReady(wd);
68+
viewport = await wd.findElement(
69+
webdriver.By.css('.demo-virtual-scroll-variable-size cdk-virtual-scroll-viewport'),
70+
);
4371
});
4472

4573
it('should scroll down slowly', async () => {
46-
await browser.executeAsyncScript(smoothScrollViewportTo, viewport, 2000);
47-
const offScreen = element(by.css('.demo-virtual-scroll-variable-size [data-index="19"]'));
48-
const onScreen = element(by.css('.demo-virtual-scroll-variable-size [data-index="20"]'));
74+
await wd.executeAsyncScript(smoothScrollViewportTo, viewport, 2000);
75+
const offScreen = await wd.findElement(
76+
webdriver.By.css('.demo-virtual-scroll-variable-size [data-index="19"]'),
77+
);
78+
const onScreen = await wd.findElement(
79+
webdriver.By.css('.demo-virtual-scroll-variable-size [data-index="20"]'),
80+
);
4981
expect(await isVisibleInViewport(offScreen, viewport)).toBe(false);
5082
expect(await isVisibleInViewport(onScreen, viewport)).toBe(true);
5183
});
5284

5385
it('should jump scroll position down and slowly scroll back up', async () => {
5486
// The estimate of the total content size is slightly different than the actual, so we don't
5587
// wind up in the same spot as if we scrolled slowly down.
56-
await browser.executeAsyncScript(scrollViewportTo, viewport, 2000);
57-
const offScreen = element(by.css('.demo-virtual-scroll-variable-size [data-index="18"]'));
58-
const onScreen = element(by.css('.demo-virtual-scroll-variable-size [data-index="19"]'));
88+
await wd.executeAsyncScript(scrollViewportTo, viewport, 2000);
89+
const offScreen = await wd.findElement(
90+
webdriver.By.css('.demo-virtual-scroll-variable-size [data-index="18"]'),
91+
);
92+
const onScreen = await wd.findElement(
93+
webdriver.By.css('.demo-virtual-scroll-variable-size [data-index="19"]'),
94+
);
5995
expect(await isVisibleInViewport(offScreen, viewport)).toBe(false);
6096
expect(await isVisibleInViewport(onScreen, viewport)).toBe(true);
6197

6298
// As we slowly scroll back up we should wind up back at the start of the content. As we
6399
// scroll the error from when we jumped the scroll position should be slowly corrected.
64-
await browser.executeAsyncScript(smoothScrollViewportTo, viewport, 0);
65-
const first = element(by.css('.demo-virtual-scroll-variable-size [data-index="0"]'));
100+
await wd.executeAsyncScript(smoothScrollViewportTo, viewport, 0);
101+
const first = await wd.findElement(
102+
webdriver.By.css('.demo-virtual-scroll-variable-size [data-index="0"]'),
103+
);
66104
expect(await isVisibleInViewport(first, viewport)).toBe(true);
67105
});
68106
});
69107
});
70108

71109
/** Checks if the given element is visible in the given viewport. */
72-
async function isVisibleInViewport(el: ElementFinder, viewport: ElementFinder): Promise<boolean> {
73-
if (
74-
!(await el.isPresent()) ||
75-
!(await el.isDisplayed()) ||
76-
!(await viewport.isPresent()) ||
77-
!(await viewport.isDisplayed())
78-
) {
110+
async function isVisibleInViewport(
111+
el: webdriver.WebElement,
112+
viewport: webdriver.WebElement,
113+
): Promise<boolean> {
114+
try {
115+
if (!(await el.isDisplayed()) || !(await viewport.isDisplayed())) {
116+
return false;
117+
}
118+
} catch {
79119
return false;
80120
}
81121
const viewportRect = getRect(await viewport.getLocation(), await viewport.getSize());
@@ -90,8 +130,8 @@ async function isVisibleInViewport(el: ElementFinder, viewport: ElementFinder):
90130

91131
/** Gets the rect for an element given its location ans size. */
92132
function getRect(
93-
location: ILocation,
94-
size: ISize,
133+
location: webdriver.ILocation,
134+
size: webdriver.ISize,
95135
): {top: number; left: number; bottom: number; right: number} {
96136
return {
97137
top: location.y,

src/cdk/overlay/BUILD.bazel

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
load("//src/e2e-app:test_suite.bzl", "e2e_test_suite")
1+
load("//src/cdk/testing/tests:webdriver-test.bzl", "webdriver_test")
22
load(
33
"//tools:defaults.bzl",
44
"markdown_to_html",
@@ -88,14 +88,21 @@ ts_project(
8888
name = "e2e_test_sources",
8989
testonly = True,
9090
srcs = glob(["**/*.e2e.spec.ts"]),
91-
deps = ["//:node_modules/protractor"],
91+
deps = [
92+
"//:node_modules/@bazel/runfiles",
93+
"//:node_modules/@types/jasmine",
94+
"//:node_modules/@types/node",
95+
"//:node_modules/@types/selenium-webdriver",
96+
"//:node_modules/selenium-webdriver",
97+
"//src/cdk/testing/selenium-webdriver",
98+
"//src/e2e-app:e2e_setup",
99+
],
92100
)
93101

94-
e2e_test_suite(
102+
webdriver_test(
95103
name = "e2e_tests",
96-
deps = [
97-
":e2e_test_sources",
98-
],
104+
server = "//src/e2e-app:server",
105+
deps = [":e2e_test_sources"],
99106
)
100107

101108
markdown_to_html(

0 commit comments

Comments
 (0)