Skip to content

Commit ad02a24

Browse files
authored
Merge pull request #450 from TESTARtool/master_development
Webdriver and paste action updates
2 parents 4b0c64f + d660e13 commit ad02a24

12 files changed

Lines changed: 163 additions & 99 deletions

File tree

CHANGELOG

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
1+
#TESTAR v2.7.10 (26-Sep-2025)
2+
- Use scroll-snap-type to ignore scroll actions in carousels
3+
- Remove unused creation of existingCssClasses file
4+
- Catch potential chromedriver not responding test sequences
5+
- Add WdDriver stopProcessTree logic to kill Chrome SUT if chromedriver hangs
6+
- Catch potential IllegalStateExceptions opening the system clipboard
7+
- Fix potential null pointer exception in WdRootElement scroll
8+
- Refactor executeCanvasScript logic to Canvas web classes
9+
10+
111
#TESTAR v2.7.9 (23-Sep-2025)
212
- Bump io.github.bonigarcia:webdrivermanager from 6.2.0 to 6.3.2
313
- Update Windows GitHub runners environment to Windows Server 2022
414

15+
516
#TESTAR v2.7.8 (2-Sep-2025)
617
- Add paintBatch and drawBatchTestar logic to paint all web elements at once
718
- Fix the derivation and visualization of slide actions in web applications

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.7.9
1+
2.7.10

core/src/org/testar/monkey/alayer/actions/PasteText.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,12 @@ public void run(SUT system, State state, double duration) throws ActionFailedExc
7171
StringSelection selection = new StringSelection(inputText);
7272

7373
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
74-
clipboard.setContents(selection, null);
74+
75+
try {
76+
clipboard.setContents(selection, null);
77+
} catch (IllegalStateException ise) {
78+
throw new ActionFailedException("PasteText action execution failed due to currently unavailable clipboard!", ise);
79+
}
7580

7681
system.get(Tags.StandardKeyboard).paste();
7782
}

testar/src/org/testar/monkey/Main.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262

6363
public class Main {
6464

65-
public static final String TESTAR_VERSION = "v2.7.9 (23-Sep-2025)";
65+
public static final String TESTAR_VERSION = "v2.7.10 (26-Sep-2025)";
6666

6767
//public static final String TESTAR_DIR_PROPERTY = "DIRNAME"; //Use the OS environment to obtain TESTAR directory
6868
public static final String SETTINGS_FILE = "test.settings";

testar/src/org/testar/protocols/WebdriverProtocol.java

Lines changed: 18 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import com.google.common.collect.ArrayListMultimap;
3434
import com.google.common.collect.Multimap;
3535
import org.apache.commons.lang3.ArrayUtils;
36+
import org.apache.logging.log4j.LogManager;
37+
import org.apache.logging.log4j.Logger;
3638
import org.openqa.selenium.logging.LogEntries;
3739
import org.openqa.selenium.logging.LogEntry;
3840
import org.testar.environment.Environment;
@@ -48,6 +50,7 @@
4850
import org.testar.monkey.alayer.webdriver.Constants;
4951
import org.testar.monkey.alayer.webdriver.enums.WdRoles;
5052
import org.testar.monkey.alayer.webdriver.enums.WdTags;
53+
import org.testar.monkey.alayer.windows.WinApiException;
5154
import org.testar.monkey.alayer.windows.WinProcess;
5255
import org.testar.monkey.alayer.windows.Windows;
5356
import org.testar.plugin.NativeLinker;
@@ -57,23 +60,20 @@
5760
import java.io.*;
5861
import java.net.MalformedURLException;
5962
import java.net.URL;
60-
import java.nio.file.Files;
61-
import java.nio.file.Paths;
6263
import java.util.*;
6364
import java.util.logging.Level;
6465
import java.util.regex.Matcher;
6566
import java.util.regex.Pattern;
66-
import java.util.stream.Stream;
67-
6867
import static org.testar.monkey.alayer.Tags.Blocked;
6968
import static org.testar.monkey.alayer.Tags.Enabled;
7069

7170
public class WebdriverProtocol extends GenericUtilsProtocol {
71+
72+
protected static final Logger logger = LogManager.getLogger();
73+
7274
//Attributes for adding slide actions
7375
protected static double SCROLL_ARROW_SIZE = 36; // sliding arrows
7476
protected static double SCROLL_THICK = 16; //scroll thickness
75-
76-
protected static Set<String> existingCssClasses = new HashSet<>();
7777

7878
// WedDriver settings from file:
7979
protected List<String> clickableClasses, typeableClasses, deniedExtensions, webDomainsAllowed;
@@ -254,15 +254,12 @@ protected void beginSequence(SUT system, State state) {
254254
*/
255255
@Override
256256
protected State getState(SUT system) throws StateBuildException {
257-
258-
try {
259-
WdDriver.waitDocumentReady();
260-
} catch(org.openqa.selenium.WebDriverException wde) {
257+
258+
if(!WdDriver.waitDocumentReady()) {
261259
LogSerialiser.log("WEBDRIVER ERROR: Selenium Chromedriver seems not to respond!\n", LogSerialiser.LogLevel.Critical);
262260
System.out.println("******************************************************************");
263261
System.out.println("** WEBDRIVER ERROR: Selenium Chromedriver seems not to respond! **");
264262
System.out.println("******************************************************************");
265-
System.out.println(wde.getMessage());
266263
system.set(Tags.IsRunning, false);
267264
}
268265

@@ -277,19 +274,17 @@ protected State getState(SUT system) throws StateBuildException {
277274
&& system.get(Tags.PID, (long)-1) != (long)-1
278275
&& WinProcess.procName(system.get(Tags.PID)).contains("chrome")
279276
&& !WinProcess.isForeground(system.get(Tags.PID))){
280-
281-
WinProcess.toForeground(system.get(Tags.PID), 0.3, 100);
282-
LogSerialiser.log("Trying to set Chrome Browser to Foreground... "
283-
+ WinProcess.procName(system.get(Tags.PID)) + "\n");
284-
285-
}
286277

287-
if(settings.get(ConfigTags.Mode) == Modes.Spy) {
278+
String msg = "Trying to set the browser to Foreground... " + system.get(Tags.PID, -1L);
279+
logger.log(org.apache.logging.log4j.Level.INFO, msg);
288280

289-
for(Widget w : state) {
290-
WdElement element = ((WdWidget) w).element;
291-
existingCssClasses.addAll(element.cssClasses);
292-
}
281+
try {
282+
WinProcess.toForeground(system.get(Tags.PID), 0.3, 100);
283+
} catch (WinApiException wae) {
284+
logger.log(org.apache.logging.log4j.Level.WARN, wae);
285+
Verdict verdict = new Verdict(Verdict.Severity.NOT_RESPONDING, "Unable to bring the browser to foreground!");
286+
state.set(Tags.OracleVerdict, verdict);
287+
}
293288
}
294289

295290
return state;
@@ -390,33 +385,9 @@ protected void finishSequence(){
390385

391386
@Override
392387
protected void stopSystem(SUT system) {
393-
if(settings.get(ConfigTags.Mode) == Modes.Spy) {
394-
395-
try {
396-
if(Settings.getSettingsPath() != null) {
397-
File folder = new File(Settings.getSettingsPath());
398-
File file = new File(folder, "existingCssClasses.txt");
399-
if(!file.exists())
400-
file.createNewFile();
401-
402-
Stream<String> stream = Files.lines(Paths.get(file.getCanonicalPath()));
403-
stream.forEach(line -> existingCssClasses.add(line));
404-
stream.close();
405-
406-
PrintWriter write = new PrintWriter(new FileWriter(file.getCanonicalPath()));
407-
for(String s : existingCssClasses)
408-
write.println(s);
409-
write.close();
410-
}
411-
412-
} catch (IOException e) {
413-
e.printStackTrace();
414-
}
415-
}
416-
417388
super.stopSystem(system);
418389
}
419-
390+
420391
@Override
421392
protected void closeTestSession() {
422393
super.closeTestSession();

webdriver/resources/web-extension/js/testar.state.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ function getDimensionsTestar(element, computedStyle) {
307307
return {
308308
overflowX: computedStyle.getPropertyValue('overflow-x'),
309309
overflowY: computedStyle.getPropertyValue('overflow-y'),
310+
scrollSnapType: computedStyle.getPropertyValue('scroll-snap-type'),
310311
clientWidth: element.clientWidth,
311312
clientHeight: element.clientHeight,
312313
offsetWidth: element.offsetWidth || 0,

webdriver/src/org/testar/monkey/alayer/webdriver/CanvasDimensions.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
import org.testar.monkey.Util;
3434
import org.openqa.selenium.WebDriverException;
35+
import org.openqa.selenium.remote.RemoteWebDriver;
3536

3637
import java.util.List;
3738

@@ -113,11 +114,14 @@ public void run() {
113114
private void updateDimensions() {
114115
// This assumes no status bars on the left or on the bottom
115116
try {
116-
List<Long> screen = (List<Long>)
117-
WdDriver.executeScript("return canvasDimensionsTestar()");
118-
if (screen == null) {
119-
return;
120-
}
117+
RemoteWebDriver remoteWebDriver = WdDriver.getRemoteWebDriver();
118+
119+
if(remoteWebDriver == null) return;
120+
121+
List<Long> screen = (List<Long>)remoteWebDriver.executeScript("return canvasDimensionsTestar()");
122+
123+
if (screen == null) return;
124+
121125
canvasX = Math.toIntExact(screen.get(0));
122126
canvasY = Math.toIntExact(screen.get(1));
123127
canvasWidth = Math.toIntExact(screen.get(2));

webdriver/src/org/testar/monkey/alayer/webdriver/WdCanvas.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@
3333
import java.util.ArrayList;
3434
import java.util.List;
3535

36+
import org.apache.logging.log4j.LogManager;
37+
import org.apache.logging.log4j.Logger;
38+
import org.openqa.selenium.WebDriverException;
39+
import org.openqa.selenium.remote.RemoteWebDriver;
3640
import org.testar.monkey.Assert;
3741
import org.testar.monkey.Pair;
3842
import org.testar.monkey.alayer.Canvas;
@@ -45,6 +49,8 @@
4549
* Represents a webdriver canvas on which can be painted.
4650
*/
4751
public class WdCanvas implements Canvas {
52+
protected static final Logger logger = LogManager.getLogger();
53+
4854
private static final int textOffsetX = 5;
4955
private static final int textOffsetY = 15;
5056

@@ -97,7 +103,7 @@ public void release() {
97103
@Override
98104
public void clear(double x, double y, double width, double height) {
99105
Object[] args = new Object[]{x, y, width, height};
100-
WdDriver.executeCanvasScript("clearCanvasTestar(arguments)", args);
106+
executeCanvasScript("clearCanvasTestar(arguments)", args);
101107
}
102108

103109
@Override
@@ -181,7 +187,7 @@ public void rect(Pen pen, double x, double y, double width, double height) {
181187
@Override
182188
public void paintBatch() {
183189
if (!drawBatch.isEmpty()) {
184-
WdDriver.executeCanvasScript("drawBatchTestar(arguments[0])", drawBatch);
190+
executeCanvasScript("drawBatchTestar(arguments[0])", drawBatch);
185191
drawBatch.clear();
186192
}
187193
}
@@ -216,4 +222,19 @@ private String cssColor() {
216222
public String toString() {
217223
return "x: " + x() + ", y: " + y() + ", width: " + width() + ", height: " + height() ;
218224
}
225+
226+
private void executeCanvasScript(String script, Object... args) {
227+
try {
228+
RemoteWebDriver remoteWebDriver = WdDriver.getRemoteWebDriver();
229+
230+
if(remoteWebDriver == null) return;
231+
232+
// Add the canvas if the page doesn't have one
233+
remoteWebDriver.executeScript("addCanvasTestar()");
234+
235+
remoteWebDriver.executeScript(script, args);
236+
} catch (NullPointerException | WebDriverException ignored) {
237+
238+
}
239+
}
219240
}

0 commit comments

Comments
 (0)