Skip to content
50 changes: 46 additions & 4 deletions src/main/java/aquality/selenium/browser/Browser.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;

public class Browser {
private final Logger logger = Logger.getInstance();
Expand Down Expand Up @@ -175,20 +176,61 @@ public byte[] getScreenshot() {
return getDriver().getScreenshotAs(OutputType.BYTES);
}


/**
* Executes JS (jQuery) script asynchronous.
*
* @param script Java Script
* @param arguments Arguments for the script (web elements, values etc.
* @return Result object of script execution
*/
public Object executeAsyncScript(final String script, Object... arguments) {
return executeJavaScript(() -> getDriver().executeAsyncScript(script, arguments));
}

/**
* Executes JS (jQuery) script from the resource file asynchronous.
* To see the list of scripts see {@link JavaScript}
* JS files can be found in ~/resources/js/
*
* @param scriptName {@link JavaScript}
* @param args List of script arguments. This list is unique for each script.
* @return Result object of script execution
*/
public Object executeAsyncScript(JavaScript scriptName, Object... args) {
return executeAsyncScript(scriptName.getScript(), args);
}

/**
* Execute JS (jQuery) script.
* Executes JS (jQuery) script from the File asynchronous.
*
* @param file Java Script file
* @param arguments Arguments for the script (web elements, values etc.
* @throws IOException in case of problems with the File
* @return Result object of script execution
*/
public Object executeAsyncScript(final File file, Object... arguments) throws IOException {
return executeAsyncScript(IOUtils.toString(file.toURI(), StandardCharsets.UTF_8.name()), arguments);
}

/**
* Executes JS (jQuery) script.
*
* @param script Java Script
* @param arguments Arguments for the script (web elements, values etc.
* @return Result object of script execution
*/
public Object executeScript(final String script, Object... arguments) {
Object result = getDriver().executeScript(script, arguments);
return executeJavaScript(() -> getDriver().executeScript(script, arguments));
}

private Object executeJavaScript(Supplier<Object> executeScriptFunc){
Object result = executeScriptFunc.get();
return result instanceof Boolean ? Boolean.parseBoolean(result.toString()) : result;
}

/**
* Execute JS (jQuery) script from the resource file.
* Executes JS (jQuery) script from the resource file.
* To see the list of scripts see {@link JavaScript}
* JS files can be found in ~/resources/js/
*
Expand All @@ -201,7 +243,7 @@ public Object executeScript(JavaScript scriptName, Object... args) {
}

/**
* Execute JS (jQuery) script from the File.
* Executes JS (jQuery) script from the File.
*
* @param file Java Script file
* @param arguments Arguments for the script (web elements, values etc.
Expand Down
37 changes: 33 additions & 4 deletions src/test/java/tests/integration/BrowserTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,17 @@

import aquality.selenium.browser.BrowserName;
import aquality.selenium.browser.JavaScript;
import aquality.selenium.configuration.Configuration;
import aquality.selenium.utils.JsonFile;
import automationpractice.forms.SliderForm;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.*;
import org.testng.Assert;
import org.testng.annotations.Test;
import tests.BaseTest;
import theinternet.TheInternetPage;
import theinternet.forms.DynamicContentForm;
import theinternet.forms.FormAuthenticationForm;
import utils.TimeUtil;

import java.io.IOException;
import java.io.UncheckedIOException;
Expand Down Expand Up @@ -104,6 +103,32 @@ public void testShouldBePossibleToExecuteJavaScript(){
Assert.assertEquals(currentUrl, url);
}

@Test
public void testShouldBePossibleToExecuteJavaScriptAsync(){
String url = new DynamicContentForm().getUrl();
getBrowser().goTo(url);
getBrowser().waitForPageToLoad();

long expectedDurationInSeconds = 1;
long operationDurationInSeconds = 1;
double startTimeSeconds = TimeUtil.getCurrentTimeInSeconds();
getBrowser().executeAsyncScript(getAsyncTimeoutJavaScript(expectedDurationInSeconds));
double durationSeconds = TimeUtil.getCurrentTimeInSeconds() - startTimeSeconds;

Assert.assertTrue(durationSeconds < (expectedDurationInSeconds + operationDurationInSeconds) &&
durationSeconds >= expectedDurationInSeconds);
}

@Test (expectedExceptions = ScriptTimeoutException.class)
public void testScriptTimeoutExeceptionShouldBeThrownIfScriptTimeoutIsOver(){
String url = new DynamicContentForm().getUrl();
getBrowser().goTo(url);
getBrowser().waitForPageToLoad();

long expectedDurationInSeconds = Configuration.getInstance().getTimeoutConfiguration().getScript() + 1;
getBrowser().executeAsyncScript(getAsyncTimeoutJavaScript(expectedDurationInSeconds));
}

@Test
public void testShouldBePossibleToExecuteJavaScriptFile() throws IOException {
String url = new DynamicContentForm().getUrl();
Expand Down Expand Up @@ -198,4 +223,8 @@ private JsonFile getSettings() {
throw new UncheckedIOException(e);
}
}

private String getAsyncTimeoutJavaScript(double expectedDurationInSeconds){
return "window.setTimeout(arguments[arguments.length - 1], " + expectedDurationInSeconds*1000 + ");";
}
}