Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
wakaleo committed Jul 17, 2023
2 parents 29db19f + a46a7df commit 2284b66
Show file tree
Hide file tree
Showing 7 changed files with 244 additions and 1 deletion.
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,7 @@
<module>serenity-cli</module>
<module>serenity-screenplay-playwright</module>
<module>serenity-bitbar</module>
<module>serenity-selenoid</module>
</modules>
<profiles>
<profile>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public static ConditionalPerformable whether(Question<Boolean> condition) {
return new ConditionalPerformableOnQuestion(condition);
}

public static <T> ConditionalPerformable whether(Question<T> question, Matcher<T> matcher) {
public static <T> ConditionalPerformable whether(Question<? extends T> question, Matcher<T> matcher) {
Question<Boolean> condition = actor -> matcher.matches(question.answeredBy(actor));

return new ConditionalPerformableOnQuestion(condition);
Expand Down
68 changes: 68 additions & 0 deletions serenity-selenoid/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.serenity-bdd</groupId>
<artifactId>serenity-bdd</artifactId>
<version>3.9.2-SNAPSHOT</version>
</parent>

<artifactId>serenity-selenoid</artifactId>
<packaging>jar</packaging>
<name>Serenity Screenplay selenoid Integration</name>


<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>



<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Automatic-Module-Name>com.serenitybdd.serenityselenoid</Automatic-Module-Name>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>serenity-core</artifactId>
<version>${project.version}</version>
</dependency>
<!-- Unit testing -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>serenity-junit</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package net.serenitybdd.plugins.selenoid;

import net.serenitybdd.core.webdriver.RemoteDriver;
import net.serenitybdd.core.webdriver.enhancers.AfterAWebdriverScenario;
import net.thucydides.core.model.TestOutcome;
import net.thucydides.core.util.EnvironmentVariables;
import org.openqa.selenium.WebDriver;

public class AfterASelenoidScenario implements AfterAWebdriverScenario {

@Override
public void apply(EnvironmentVariables environmentVariables, TestOutcome testOutcome, WebDriver driver) {
if ((driver == null) || (!RemoteDriver.isARemoteDriver(driver))) {
return;
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package net.serenitybdd.plugins.selenoid;

import net.serenitybdd.core.webdriver.driverproviders.CapabilityValue;
import net.serenitybdd.core.webdriver.enhancers.BeforeAWebdriverScenario;
import net.thucydides.core.model.TestOutcome;
import net.thucydides.core.util.EnvironmentVariables;
import net.thucydides.core.webdriver.SupportedWebDriver;
import org.openqa.selenium.MutableCapabilities;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.util.*;

import static net.serenitybdd.plugins.selenoid.SerenitySelenoidUtil.SELENOID;

public class BeforeASelenoidScenario implements BeforeAWebdriverScenario {

public static final List<String> capability = Arrays.asList(CapabilityType.BROWSER_NAME, CapabilityType.BROWSER_VERSION, CapabilityType.PLATFORM_NAME);


@Override
public MutableCapabilities apply(EnvironmentVariables environmentVariables, SupportedWebDriver driver, TestOutcome testOutcome, MutableCapabilities capabilities) {

if (driver != SupportedWebDriver.REMOTE) {
return capabilities;
}
Map<String, Object> SELENOID_PROPERTIES_MAP = new HashMap<>();
String name = SerenitySelenoidUtil.getName(testOutcome);
SELENOID_PROPERTIES_MAP.put("name", name);
SELENOID_PROPERTIES_MAP.put("videoName", SerenitySelenoidUtil.getVideoName(name));

DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
Properties selenoidProperties = environmentVariables.getPropertiesWithPrefix(SELENOID);
for (String propertyName : selenoidProperties.stringPropertyNames()) {
String unPrefixedPropertyName = SerenitySelenoidUtil.unprefixed(propertyName);
Object value = CapabilityValue.fromString(selenoidProperties.getProperty(propertyName));
capability.stream().filter(k -> k.equalsIgnoreCase(unPrefixedPropertyName)).forEach(k -> desiredCapabilities.setCapability(k, value));
SELENOID_PROPERTIES_MAP.put(unPrefixedPropertyName, value);
}

SerenitySelenoidUtil.linkVideoToSerenityReport(testOutcome, SerenitySelenoidUtil.getVideoName(name));


capabilities.setCapability("selenoid:options", SELENOID_PROPERTIES_MAP);
capabilities.merge(desiredCapabilities);
return capabilities;
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package net.serenitybdd.plugins.selenoid;

import net.thucydides.core.environment.SystemEnvironmentVariables;
import net.thucydides.core.model.ExternalLink;
import net.thucydides.core.model.TestOutcome;
import net.thucydides.core.util.EnvironmentVariables;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.MalformedURLException;
import java.net.URL;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;


public class SerenitySelenoidUtil {

private static final Logger LOGGER = LoggerFactory.getLogger(SerenitySelenoidUtil.class);

public static final String SELENOID = "selenoid.";

public static EnvironmentVariables env = SystemEnvironmentVariables.currentEnvironmentVariables();

public static String getName(TestOutcome testOutcome) {
return String.format("%s-%s-%s", getVideoDataPrefix(), testOutcome.getStoryTitle(), testOutcome.getTitle());

}

public static String getVideoName(String name) {
return String.format("%s%s", name, getVideoNameSuffix());
}

public static String getVideoDataPrefix() {
String dataFormat = env.getProperty(SELENOID + "videoDataPrefixFormat", "yyyy-MM-dd");
return DateTimeFormatter.ofPattern(dataFormat).format(LocalDateTime.now(ZoneId.systemDefault()));
}

public static String getVideoNameSuffix() {
return env.getProperty(SELENOID + "videoSuffix", ".mp4");
}

protected static void linkVideoToSerenityReport(TestOutcome testOutcome, String link) {
try {
URL url = new URL(env.getProperty("webdriver.remote.url"));
String videoLinkPrefix = env.getProperty(SELENOID + "videoLinkPrefix", String.format("%s:%s:8080/video", url.getProtocol(), url.getHost()));
testOutcome.setLink(new ExternalLink(String.format("%s/%s", videoLinkPrefix, link), "BrowserStack"));
} catch (MalformedURLException e) {
LOGGER.error("Set video link error. {}", e.getMessage());
}

}

protected static String unprefixed(String propertyName) {
return propertyName.replace(SELENOID, "");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package net.serenitybdd.plugins.selenoid;

import net.serenitybdd.core.webdriver.driverproviders.AddCustomDriverCapabilities;
import net.thucydides.core.environment.MockEnvironmentVariables;
import net.thucydides.core.model.Story;
import net.thucydides.core.model.TestOutcome;
import net.thucydides.core.util.EnvironmentVariables;
import net.thucydides.core.webdriver.SupportedWebDriver;
import org.junit.Test;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.util.HashMap;

import static org.assertj.core.api.Assertions.assertThat;

public class WhenAddingSelenoidCapabilities {

EnvironmentVariables environmentVariables = new MockEnvironmentVariables();

@Test
public void shouldAddTheNameOfTheTest() {

// Given
DesiredCapabilities capabilities = new DesiredCapabilities();
TestOutcome testOutcome = TestOutcome.forTestInStory("serenity_selenoid_test", Story.called("Sample story"));
String name = SerenitySelenoidUtil.getName(testOutcome);

AddCustomDriverCapabilities.from(environmentVariables)
.withTestDetails(SupportedWebDriver.REMOTE, testOutcome)
.to(capabilities);
Object capability = capabilities.getCapability("selenoid:options");
assertThat(((HashMap) capability).get("name")).isEqualTo(name);
}

@Test
public void shouldAddZaleniumPropertiesFromTheEnvironmentConfiguration() {

// Given
DesiredCapabilities capabilities = new DesiredCapabilities();
TestOutcome testOutcome = TestOutcome.forTestInStory("serenity_selenoid_test", Story.called("Sample story"));
environmentVariables.setProperty("selenoid.enableVNC", "true");

AddCustomDriverCapabilities.from(environmentVariables).withTestDetails(SupportedWebDriver.REMOTE, testOutcome).to(capabilities);
Object capability = capabilities.getCapability("selenoid:options");
assertThat(((HashMap) capability).get("enableVNC")).isEqualTo(true);

}

}

0 comments on commit 2284b66

Please sign in to comment.