blob: 6303f05e05d3692ce80170666c0e2ade9c62fb2a [file] [log] [blame]
// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
@TestOn('vm')
library webdriver.web_driver_test;
import 'dart:async';
import 'package:test/test.dart';
import 'package:webdriver/core.dart';
import 'configs/async_io_config.dart' as config;
void main() {
group('WebDriver', () {
group('create', () {
test('default', () async {
var driver = await config.createTestDriver();
await config.createTestServerAndGoToTestPage(driver);
var element = await driver.findElement(const By.tagName('button'));
expect(await element.name, 'button');
});
});
group('methods', () {
late WebDriver driver;
setUp(() async {
driver = await config.createTestDriver();
await config.createTestServerAndGoToTestPage(driver);
});
test('get', () async {
await driver.findElement(const By.tagName('button'));
});
test('currentUrl', () async {
var url = await driver.currentUrl;
expect(url, anyOf(startsWith('file:'), startsWith('http:')));
expect(url, endsWith('test_page.html'));
});
test('findElement -- success', () async {
var element = await driver.findElement(const By.tagName('tr'));
expect(element, config.isWebElement);
});
test('findElement -- failure', () async {
try {
await driver.findElement(const By.id('non-existent-id'));
throw 'expected NoSuchElementException';
} on NoSuchElementException {
// noop
}
});
test('findElements -- 1 found', () async {
var elements = await driver
.findElements(const By.cssSelector('input[type=text]'))
.toList();
expect(elements, hasLength(1));
expect(elements, everyElement(config.isWebElement));
});
test('findElements -- 4 found', () async {
var elements =
await driver.findElements(const By.tagName('td')).toList();
expect(elements, hasLength(4));
expect(elements, everyElement(config.isWebElement));
});
test('findElements -- 0 found', () async {
var elements =
await driver.findElements(const By.id('non-existent-id')).toList();
expect(elements, isEmpty);
});
test('pageSource', () async {
expect(await driver.pageSource, contains('<title>test_page</title>'));
});
test('close/windows', () async {
var numHandles = (await driver.windows.toList()).length;
await (await driver.findElement(const By.partialLinkText('Open copy')))
.click();
expect(await driver.windows.toList(), hasLength(numHandles + 1));
await (await driver.window).close();
expect(await driver.windows.toList(), hasLength(numHandles));
});
test('window', () async {
var orig = await driver.window;
Window? next;
await (await driver.findElement(const By.partialLinkText('Open copy')))
.click();
await for (Window window in driver.windows) {
if (window != orig) {
next = window;
await driver.switchTo.window(window);
break;
}
}
expect(await driver.window, equals(next));
await (await driver.window).close();
});
test('activeElement', () async {
var element = (await driver.activeElement)!;
expect(await element.name, 'body');
await (await driver
.findElement(const By.cssSelector('input[type=text]')))
.click();
element = (await driver.activeElement)!;
expect(await element.name, 'input');
});
test('windows', () async {
var windows = await driver.windows.toList();
expect(windows, hasLength(isPositive));
expect(windows, everyElement(isA<Window>()));
});
test('execute', () async {
var button = await driver.findElement(const By.tagName('button'));
var script = '''
arguments[1].textContent = arguments[0];
return arguments[1];''';
var e = await driver.execute(script, ['new text', button]);
expect(await e.text, 'new text');
});
test('executeAsync', () async {
var button = await driver.findElement(const By.tagName('button'));
var script = '''
arguments[1].textContent = arguments[0];
arguments[2](arguments[1]);''';
var e = await driver.executeAsync(script, ['new text', button]);
expect(await e.text, 'new text');
});
test('captureScreenshot', () async {
// ignore: deprecated_member_use_from_same_package
var screenshot = await driver.captureScreenshot().toList();
expect(screenshot, hasLength(isPositive));
expect(screenshot, everyElement(isA<int>()));
});
test('captureScreenshotAsList', () async {
var screenshot = await driver.captureScreenshotAsList();
expect(screenshot, hasLength(isPositive));
expect(screenshot, everyElement(const TypeMatcher<int>()));
});
test('captureElementScreenshotAsList', () async {
var element = await driver.findElement(const By.tagName('tr'));
var screenshot = await driver.captureElementScreenshotAsList(element);
expect(screenshot, hasLength(isPositive));
expect(screenshot, everyElement(const TypeMatcher<int>()));
});
test('captureScreenshotAsBase64', () async {
var screenshot = await driver.captureScreenshotAsBase64();
expect(screenshot, hasLength(isPositive));
expect(screenshot, const TypeMatcher<String>());
});
test('captureElementScreenshotAsBase64', () async {
var element = await driver.findElement(const By.tagName('tr'));
var screenshot = await driver.captureElementScreenshotAsBase64(element);
expect(screenshot, hasLength(isPositive));
expect(screenshot, const TypeMatcher<String>());
});
test('future based event listeners work with script timeouts', () async {
driver.addEventListener((WebDriverCommandEvent e) async =>
await Future.delayed(const Duration(milliseconds: 1000), (() {})));
try {
await driver.timeouts.setScriptTimeout(const Duration(seconds: 1));
await driver.executeAsync('', []);
fail('Did not throw timeout as expected');
} catch (e) {
expect(e, const TypeMatcher<ScriptTimeoutException>());
}
});
test('future based event listeners ordered appropriately', () async {
var eventList = <int>[];
var millisDelay = 2000;
var current = 0;
driver.addEventListener((WebDriverCommandEvent e) async =>
await Future.delayed(Duration(milliseconds: millisDelay), (() {
eventList.add(current++);
millisDelay = (millisDelay / 2).round();
})));
for (var i = 0; i < 10; i++) {
await driver.title; // GET request.
}
expect(eventList, hasLength(10));
for (var i = 0; i < 10; i++) {
expect(eventList[i], i);
}
});
});
}, timeout: const Timeout(Duration(minutes: 2)));
}