Skip to content

Commit 22bd913

Browse files
committed
Implemented tests for JavaScript event listeners. Implement functions to start and stop monitoring
1 parent 8884811 commit 22bd913

File tree

7 files changed

+83
-23
lines changed

7 files changed

+83
-23
lines changed

src/main/java/aquality/selenium/browser/devtools/JavaScriptHandling.java

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import java.util.*;
2424
import java.util.function.Consumer;
2525

26-
import static org.openqa.selenium.devtools.events.CdpEventTypes.consoleEvent;
2726
import static org.openqa.selenium.devtools.events.CdpEventTypes.domMutation;
2827

2928
/**
@@ -187,6 +186,22 @@ public void clearPinnedScripts() {
187186
getJavascriptExecutor().getPinnedScripts().forEach(getJavascriptExecutor()::unpin);
188187
}
189188

189+
/**
190+
* Starts monitoring for events from the browser's JavaScript engine.
191+
*/
192+
public void startEventMonitoring() {
193+
logger.info("loc.browser.javascript.event.monitoring.start");
194+
tools.sendCommand(Runtime.enable());
195+
}
196+
197+
/**
198+
* Stops monitoring for events from the browser's JavaScript engine, and clears JavaScript console event listeners.
199+
*/
200+
public void stopEventMonitoring() {
201+
logger.info("loc.browser.javascript.event.monitoring.stop");
202+
events.disable();
203+
}
204+
190205
/**
191206
* Adds a listener for events that occur when a JavaScript callback with a named binding is executed.
192207
* To add a binding, use {@link this.addJsBinding}.
@@ -227,19 +242,9 @@ public void addDomMutatedListener(Consumer<DomMutationEvent> listener) {
227242

228243
/**
229244
* Adds a listener for events that occur when methods on the JavaScript console are called.
230-
* @param listener a listener to add, consuming a javascript exception.
245+
* @param listener a listener to add, consuming a {@link ConsoleEvent}.
231246
*/
232247
public void addJavaScriptConsoleApiListener(Consumer<ConsoleEvent> listener) {
233-
logger.info("loc.browser.javascript.event.consoleapicalled.add");
234-
getDriverThatHasLogEvents().onLogEvent(consoleEvent(listener));
235-
}
236-
237-
/**
238-
* Adds a listener for events that occur when methods on the JavaScript console are called.
239-
* Consider using a method {@link this.addJavaScriptConsoleApiListener} instead.
240-
* @param listener a listener to add, consuming a javascript exception.
241-
*/
242-
public void addConsoleEventListener(Consumer<ConsoleEvent> listener) {
243248
logger.info("loc.browser.javascript.event.consoleapicalled.add");
244249
events.addConsoleListener(listener);
245250
}
@@ -253,14 +258,6 @@ public void addJavaScriptExceptionThrownListener(Consumer<JavascriptException> l
253258
events.addJavascriptExceptionListener(listener);
254259
}
255260

256-
/**
257-
* Disables console event listener and JavaScript event listener (disables the runtime).
258-
*/
259-
public void disableConsoleEventListeners() {
260-
logger.info("loc.browser.javascript.event.consoleapicalled.disable");
261-
events.disable();
262-
}
263-
264261
/**
265262
* Removes all bindings to JavaScript callbacks and all initialization scripts from being loaded for each document.
266263
*/

src/main/resources/localization/be.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@
112112
"loc.browser.javascript.event.callbackexecuted.add": "Падпісваемся на падзею выканання іменаванай прывязкі зваротнага выкліку JavaScript",
113113
"loc.browser.javascript.event.exceptionthrown.add": "Падпісваемся на падзею падзення памылкі JavaScript",
114114
"loc.browser.javascript.event.consoleapicalled.add": "Падпісваемся на падзею выкліку API кансолі JavaScript",
115-
"loc.browser.javascript.event.consoleapicalled.disable": "Адпісваемся ад падзеяў кансолі JavaScript",
116115
"loc.browser.javascript.event.dommutated.add": "Падпісваемся на падзею зменаў у DOM",
117116
"loc.browser.javascript.initializationscript.add": "Дадаем ініцыялізацыйны JavaScript з прыязным іменем '%1$s'",
118117
"loc.browser.javascript.initializationscript.remove": "Выдаляем ініцыялізацыйны JavaScript з прыязным іменем '%1$s'",
@@ -124,6 +123,8 @@
124123
"loc.browser.javascript.snippet.unpin": "Адмацоўваем фрагмент JavaScript",
125124
"loc.browser.javascript.snippets.get": "Атрымліваем замацаваныя фрагменты JavaScript",
126125
"loc.browser.javascript.snippets.clear": "Выдаляем усе замацаваныя фрагменты JavaScript",
126+
"loc.browser.javascript.event.monitoring.start": "Пачынаем маніторынг падзеяў JavaScript",
127+
"loc.browser.javascript.event.monitoring.stop": "Спыняем маніторынг падзеяў JavaScript",
127128
"loc.browser.javascript.clearall": "Выдаляем усе прывязкі зваротнага выкліку JavaScript і ініцыялізацыйныя скрыпты",
128129
"loc.browser.javascript.reset": "Выдаляем усе прывязкі зваротнага выкліку JavaScript і ініцыялізацыйныя скрыпты, і спыняем чаканне падзеяў",
129130
"loc.shadowroot.expand": "Разварочваем дрэва схаваных элементаў",

src/main/resources/localization/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@
112112
"loc.browser.javascript.event.callbackexecuted.add": "Subscribing to JavaScript Callback With A Named Binding Is Executed event",
113113
"loc.browser.javascript.event.exceptionthrown.add": "Subscribing to JavaScript Exception Is Thrown event",
114114
"loc.browser.javascript.event.consoleapicalled.add": "Subscribing to JavaScript Console API Is Called event",
115-
"loc.browser.javascript.event.consoleapicalled.disable": "Unsubscribing from JavaScript Console events",
116115
"loc.browser.javascript.event.dommutated.add": "Subscribing to DOM mutated event",
117116
"loc.browser.javascript.initializationscript.add": "Adding initialization JavaScript with friendly name '%1$s'",
118117
"loc.browser.javascript.initializationscript.remove": "Removing initialization JavaScript by friendly name '%1$s'",
@@ -122,6 +121,8 @@
122121
"loc.browser.javascript.scriptcallbackbindings.clear": "Removing all JavaScript callback bindings",
123122
"loc.browser.javascript.snippet.pin": "Pinning JavaScript snippet",
124123
"loc.browser.javascript.snippet.unpin": "Unpinning JavaScript snippet",
124+
"loc.browser.javascript.event.monitoring.start": "Starting JavaScript Event Monitoring",
125+
"loc.browser.javascript.event.monitoring.stop": "Stopping JavaScript Event Monitoring",
125126
"loc.browser.javascript.snippets.get": "Getting pinned JavaScript snippets",
126127
"loc.browser.javascript.snippets.clear": "Removing all pinned JavaScript snippets",
127128
"loc.browser.javascript.clearall": "Removing all JavaScript callback bindings and initialization JavaScripts",

src/main/resources/localization/ru.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@
113113
"loc.browser.javascript.event.callbackexecuted.add": "Подписываемся на событие исполнения именованной привязки обратного вызова JavaScript",
114114
"loc.browser.javascript.event.exceptionthrown.add": "Подписываемся на событие падения ошибки JavaScript",
115115
"loc.browser.javascript.event.consoleapicalled.add": "Подписываемся на событие вызова API консоли JavaScript",
116-
"loc.browser.javascript.event.consoleapicalled.disable": "Отписываемся от события консоли JavaScript",
117116
"loc.browser.javascript.event.dommutated.add": "Подписываемся на событие изменений в DOM",
118117
"loc.browser.javascript.initializationscript.add": "Добавление инициализационного JavaScript с дружелюбным именем '%1$s'",
119118
"loc.browser.javascript.initializationscript.remove": "Удаление инициализационного JavaScript с дружелюбным именем '%1$s'",
@@ -125,6 +124,8 @@
125124
"loc.browser.javascript.snippet.unpin": "Открепление фрагмента JavaScript",
126125
"loc.browser.javascript.snippets.get": "Получение закрепённых фрагментов JavaScript",
127126
"loc.browser.javascript.snippets.clear": "Удаление всех закрепённых фрагментов JavaScript",
127+
"loc.browser.javascript.event.monitoring.start": "Начинаем мониторинг событий JavaScript",
128+
"loc.browser.javascript.event.monitoring.stop": "Останавливаем мониторинг событий JavaScript",
128129
"loc.browser.javascript.clearall": "Удаляем все привязки обратного вызова JavaScript и инициализационные скрипты",
129130
"loc.browser.javascript.reset": "Удаляем все привязки обратного вызова JavaScript и инициализационные скрипты, и останавливаем прослушивание событий",
130131
"loc.shadowroot.expand": "Разворачиваем дерево скрытых элементов",

src/test/java/tests/usecases/devtools/InitializationScriptsTests.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public void testAddInitializationScriptGetItThenRemoveOrClear() {
5656
@Test(enabled = false)
5757
public void testAddScriptCallbackBindingSubscribeAndUnsubscribeGetItThenRemoveOrClear() throws TimeoutException {
5858
List<String> executedBindings = new ArrayList<>();
59+
javaScriptEngine().startEventMonitoring();
5960
javaScriptEngine().addInitializationScript(SCRIPT_NAME, SCRIPT);
6061
javaScriptEngine().addBindingCalledListener(executedBindings::add);
6162
getBrowser().refreshPageWithAlert(AlertActions.ACCEPT);
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package tests.usecases.devtools;
2+
3+
import aquality.selenium.browser.AqualityServices;
4+
import aquality.selenium.browser.devtools.JavaScriptHandling;
5+
import org.testng.Assert;
6+
import org.testng.annotations.Test;
7+
import tests.BaseTest;
8+
import theinternet.forms.WelcomeForm;
9+
10+
import java.time.Duration;
11+
import java.util.ArrayList;
12+
import java.util.List;
13+
14+
import static aquality.selenium.browser.AqualityServices.getConditionalWait;
15+
16+
public class JavaScriptEventTests extends BaseTest {
17+
private static final Duration NEGATIVE_CONDITION_TIMEOUT = Duration.ofSeconds(5);
18+
private static JavaScriptHandling javaScriptEngine() {
19+
return AqualityServices.getBrowser().javaScriptEngine();
20+
}
21+
22+
@Test
23+
public void testSubscribeToJavaScriptConsoleApiCalledEventAndUnsubscribeFromIt() {
24+
final String consoleApiScript = "console.log('Hello world!')";
25+
List<String> apiCalledMessages = new ArrayList<>();
26+
javaScriptEngine().addJavaScriptConsoleApiListener(consoleEvent -> apiCalledMessages.addAll(consoleEvent.getMessages()));
27+
getBrowser().executeScript(consoleApiScript);
28+
29+
boolean hasCountIncreased = getConditionalWait().waitFor(() -> !apiCalledMessages.isEmpty());
30+
Assert.assertTrue(hasCountIncreased, "Some JS console API events should have been recorded, should be possible to subscribe to JS Console API called event");
31+
32+
int previousCount = apiCalledMessages.size();
33+
34+
javaScriptEngine().stopEventMonitoring();
35+
getBrowser().executeScript(consoleApiScript);
36+
getConditionalWait().waitFor(() -> apiCalledMessages.size() > previousCount, NEGATIVE_CONDITION_TIMEOUT);
37+
Assert.assertEquals(apiCalledMessages.size(), previousCount, "No more JS console API events should be recorded, should be possible to unsubscribe from JS Console API called event");
38+
}
39+
40+
@Test
41+
public void testSubscribeToJavaScriptExceptionThrownEventAndUnsubscribeFromIt() {
42+
WelcomeForm welcomeForm = new WelcomeForm();
43+
List<String> errorMessages = new ArrayList<>();
44+
javaScriptEngine().addJavaScriptExceptionThrownListener(exception -> errorMessages.add(exception.getMessage()));
45+
46+
getBrowser().goTo(welcomeForm.getUrl());
47+
welcomeForm.getSubTitleLabel().getJsActions().setAttribute("onclick", "throw new Error('Hello, world!')");
48+
welcomeForm.getSubTitleLabel().click();
49+
boolean isNotEmpty = getConditionalWait().waitFor(() -> !errorMessages.isEmpty());
50+
Assert.assertTrue(isNotEmpty, "Some JS exceptions events should have been recorded, should be possible to subscribe to JS Exceptions thrown event");
51+
52+
int previousCount = errorMessages.size();
53+
javaScriptEngine().stopEventMonitoring();
54+
welcomeForm.getSubTitleLabel().click();
55+
getConditionalWait().waitFor(() -> errorMessages.size() > previousCount, NEGATIVE_CONDITION_TIMEOUT);
56+
Assert.assertEquals(previousCount, errorMessages.size(), "No more JS exceptions should be recorded, should be possible to unsubscribe from JS Exceptions thrown event");
57+
}
58+
}

src/test/resources/TestSuite.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
<class name="tests.usecases.devtools.DomMonitoringTest"/>
3535
<class name="tests.usecases.devtools.InitializationScriptsTests"/>
3636
<class name="tests.usecases.devtools.JavaScriptSnippetsTests"/>
37+
<class name="tests.usecases.devtools.JavaScriptEventTests"/>
3738
</classes>
3839
</test>
3940
<test name="Single-thread tests" parallel="none">

0 commit comments

Comments
 (0)