Skip to content

Commit

Permalink
Headless chrome/firefox support changes and misc
Browse files Browse the repository at this point in the history
- Removed TravisCICapabilitiyBuilder -- no longer needed
- Added test for headless chrome and firefox capability builders
- Use firefox-esr instead on travisci
- extract method refactoring in Chrome and Firefox capability builder
  classes
  • Loading branch information
Doug Simmons authored and mach6 committed Jan 23, 2018
1 parent a272e63 commit 248163c
Show file tree
Hide file tree
Showing 10 changed files with 153 additions and 94 deletions.
3 changes: 2 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ jdk:
addons:
sauce_connect: true
chrome: stable
firefox: latest
firefox: latest-esr
cache:
directories:
- $HOME/.m2
Expand Down Expand Up @@ -34,6 +34,7 @@ matrix:
- env: TARGET=firefox
fast_finish: true
before_script:
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then export DISPLAY=:99.0; sh -e /etc/init.d/xvfb start; sleep 3; fi
- echo "MAVEN_OPTS='-Xmx1g -Xms256m'" > ~/.mavenrc
script:
- |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,7 @@ public DesiredCapabilities getCapabilities(DesiredCapabilities capabilities) {
System.setProperty(SeLionConstants.WEBDRIVER_CHROME_DRIVER_PROPERTY, getBinaryPath());
}
capabilities.setBrowserName(DesiredCapabilities.chrome().getBrowserName());
String userAgent = getUserAgent();
ChromeOptions options = new ChromeOptions();
options.addArguments("--test-type");
options.addArguments("--ignore-certificate-errors");
if ((userAgent != null) && (!userAgent.trim().isEmpty())) {
options.addArguments("--user-agent=" + userAgent);
}
options.setHeadless(Boolean.getBoolean(getLocalConfigProperty(ConfigProperty.BROWSER_RUN_HEADLESS)));
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
capabilities.setCapability(ChromeOptions.CAPABILITY, getDefaultChromeOptions());
if (ProxyHelper.isProxyServerRequired()) {
capabilities.setCapability(CapabilityType.PROXY, ProxyHelper.createProxyObject());
}
Expand All @@ -58,4 +50,20 @@ private String getBinaryPath() {
return System.getProperty(SeLionConstants.WEBDRIVER_CHROME_DRIVER_PROPERTY,
Config.getConfigProperty(ConfigProperty.SELENIUM_CHROMEDRIVER_PATH));
}

/*
* Returns the default {@link ChromeOptions} used by this capabilities builder
*/
private ChromeOptions getDefaultChromeOptions() {
final String userAgent = getUserAgent();
final ChromeOptions options = new ChromeOptions();
options.addArguments("--test-type");
options.addArguments("--ignore-certificate-errors");
if ((userAgent != null) && (!userAgent.trim().isEmpty())) {
options.addArguments("--user-agent=" + userAgent);
}
options.setHeadless(Boolean.parseBoolean(getLocalConfigProperty(ConfigProperty.BROWSER_RUN_HEADLESS)));

return options;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@

/**
* This class represents the capabilities that are specific to firefox.
*
*/
class FireFoxCapabilitiesBuilder extends DefaultCapabilitiesBuilder {

Expand All @@ -51,15 +50,23 @@ public DesiredCapabilities getCapabilities(DesiredCapabilities capabilities) {
if (isLocalRun() && StringUtils.isNotBlank(geckoDriverPath)) {
System.setProperty(SeLionConstants.WEBDRIVER_GECKO_DRIVER_PROPERTY, geckoDriverPath);
}
FirefoxOptions options = new FirefoxOptions();
options.setLogLevel(FirefoxDriverLogLevel.INFO);
options.setHeadless(Boolean.getBoolean(getLocalConfigProperty(ConfigProperty.BROWSER_RUN_HEADLESS)));
capabilities.setCapability(FirefoxOptions.FIREFOX_OPTIONS, options);
capabilities.setCapability(FirefoxOptions.FIREFOX_OPTIONS, getDefaultFirefoxOptions());
}

return capabilities;
}

/*
* Returns the default {@link FirefoxOptions} used by this capabilities builder.
*/
private FirefoxOptions getDefaultFirefoxOptions() {
FirefoxOptions options = new FirefoxOptions();
options.setLogLevel(FirefoxDriverLogLevel.INFO);
options.setHeadless(Boolean.parseBoolean(getLocalConfigProperty(ConfigProperty.BROWSER_RUN_HEADLESS)));

return options;
}

private FirefoxProfile getProfile(String dirName) {
logger.entering(dirName);
FirefoxProfile profile = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,22 @@
package com.paypal.selion.internal.platform.grid.browsercapabilities;

import com.google.common.collect.ImmutableList;
import com.paypal.selion.annotations.WebTest;
import com.paypal.selion.platform.grid.browsercapabilities.DefaultCapabilitiesBuilder;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.collections.Lists;

import java.util.List;
import java.util.Map;

public class HeadlessChromeCapabilitiesBuilder extends ChromeCapabilitiesBuilder {
/**
* An optional {@link DefaultCapabilitiesBuilder} which can be used to force a single browser=chrome {@link WebTest}
* to be run in headless mode.
*/
public final class HeadlessChromeCapabilitiesBuilder extends ChromeCapabilitiesBuilder {
@Override
@SuppressWarnings("unchecked")
public DesiredCapabilities getCapabilities(DesiredCapabilities capabilities) {
super.getCapabilities(capabilities);
Map<String, Object> existing =
Expand All @@ -33,7 +40,7 @@ public DesiredCapabilities getCapabilities(DesiredCapabilities capabilities) {
// existing.get("args") is an immutable list.
// so we need to declare a new one and copy the values in, when present
List<String> args = Lists.newArrayList();
if (existing.containsKey("args")) {
if (existing != null && existing.containsKey("args")) {
args.addAll((List<String>) existing.get("args"));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,16 @@

package com.paypal.selion.internal.platform.grid.browsercapabilities;

import com.paypal.selion.annotations.WebTest;
import com.paypal.selion.platform.grid.browsercapabilities.DefaultCapabilitiesBuilder;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.remote.DesiredCapabilities;

public class HeadlessFirefoxCapabilitiesBuilder extends FireFoxCapabilitiesBuilder {
/**
* An optional {@link DefaultCapabilitiesBuilder} which can be used to force a single browser=firefox {@link WebTest}
* to be run in headless mode.
*/
public final class HeadlessFirefoxCapabilitiesBuilder extends FireFoxCapabilitiesBuilder {
@Override
public DesiredCapabilities getCapabilities(DesiredCapabilities capabilities) {
super.getCapabilities(capabilities);
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*-------------------------------------------------------------------------------------------------------------------*\
| Copyright (C) 2017 PayPal |
| |
| 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. |
\*-------------------------------------------------------------------------------------------------------------------*/

package com.paypal.selion.internal.platform.grid.browsercapabilities;

import static org.testng.Assert.*;

import com.paypal.selion.configuration.Config;
import com.paypal.selion.configuration.ConfigManager;
import com.paypal.selion.configuration.LocalConfig;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.ITestContext;
import org.testng.annotations.Test;

import java.util.List;
import java.util.Map;


public class HeadlessChromeCapabilitiesBuilderTest {
@Test
public void testIsHeadless(ITestContext ctx) {
//first set a local config to not run this @test headless
LocalConfig lc = new LocalConfig();
lc.setConfigProperty(Config.ConfigProperty.BROWSER_RUN_HEADLESS, "false");
ConfigManager.addConfig(ctx.getCurrentXmlTest().getName(), lc);

DesiredCapabilities capabilities =
new HeadlessChromeCapabilitiesBuilder().getCapabilities(new DesiredCapabilities());

//assert the capabilities returned includes the '--headless' argument.
assertNotNull(capabilities.getCapability(ChromeOptions.CAPABILITY));

Map<String, List<String>> chromeOptionsMap =
(Map<String, List<String>>) capabilities.getCapability(ChromeOptions.CAPABILITY);
assertTrue(chromeOptionsMap.containsKey("args"));
assertTrue(chromeOptionsMap.get("args").contains("--headless"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*-------------------------------------------------------------------------------------------------------------------*\
| Copyright (C) 2017 PayPal |
| |
| 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. |
\*-------------------------------------------------------------------------------------------------------------------*/

package com.paypal.selion.internal.platform.grid.browsercapabilities;

import static org.testng.Assert.*;

import com.paypal.selion.configuration.Config;
import com.paypal.selion.configuration.ConfigManager;
import com.paypal.selion.configuration.LocalConfig;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.ITestContext;
import org.testng.annotations.Test;

import java.util.List;
import java.util.Map;


public class HeadlessFirefoxCapabilitiesBuilderTest {
@Test
public void testIsHeadless(ITestContext ctx) {
//first set a local config to not run this @test headless
LocalConfig lc = new LocalConfig();
lc.setConfigProperty(Config.ConfigProperty.BROWSER_RUN_HEADLESS, "false");
ConfigManager.addConfig(ctx.getCurrentXmlTest().getName(), lc);

DesiredCapabilities capabilities =
new HeadlessFirefoxCapabilitiesBuilder().getCapabilities(new DesiredCapabilities());

//assert the capabilities returned includes the '-headless' argument.
assertNotNull(capabilities.getCapability(FirefoxOptions.FIREFOX_OPTIONS));

Map<String, List<String>> firefoxOptionsMap =
(Map<String, List<String>>) capabilities.getCapability(FirefoxOptions.FIREFOX_OPTIONS);
assertTrue(firefoxOptionsMap.containsKey("args"));
assertTrue(firefoxOptionsMap.get("args").contains("-headless"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,8 @@ public void testCapabilityBuilderViaAnnotation() throws Exception {

assertEquals(caps.getCapability(CapabilityType.BROWSER_NAME), "chrome");

Map<String, List<String>> chromeOptions = (Map<String, List<String>>) caps.asMap().get(ChromeOptions.CAPABILITY);
List<String> args = chromeOptions.get("args");
Map<String, ?> chromeOptions = (Map<String, ?>) caps.getCapability(ChromeOptions.CAPABILITY);
List<String> args = (List<String>) chromeOptions.get("args");
assertEquals(args.size(), 1);
assertEquals(args.get(0), "--bogus-arg");
}
Expand All @@ -100,7 +100,7 @@ public void testCapabilityBuilderInline() throws Exception {
caps.merge(new ChromeOptionsOverrideCapabilities().createCapabilities());
assertEquals(caps.getCapability(CapabilityType.BROWSER_NAME), "chrome");

Map<String, List<String>> chromeOptions = (Map<String, List<String>>)
Map<String, ?> chromeOptions = (Map<String, ?>)
Grid.getWebTestSession().getAdditionalCapabilities().getCapability(ChromeOptions.CAPABILITY);
List<String> args = (List<String>) chromeOptions.get("args");
assertEquals(args.size(), 1);
Expand Down
4 changes: 1 addition & 3 deletions utilities/travis-run-chrome-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,5 @@ if [ "$USE_SAUCELABS" = true ]; then
mvn test -pl client -B -V -DsuiteXmlFile=Chrome-Suite.xml -DSELION_BROWSER_RUN_HEADLESS=true && exit $?
else
mvn test -pl client -B -V -DsuiteXmlFile=Chrome-Suite.xml -DSELION_BROWSER_RUN_HEADLESS=true \
-DSELION_SELENIUM_RUN_LOCALLY=true -DSELION_DOWNLOAD_DEPENDENCIES=true \
-DSELION_SELENIUM_CUSTOM_CAPABILITIES_PROVIDER=com.paypal.selion.TravisCICapabilityBuilder \
-DBROWSER_PATH=`which google-chrome` && exit $?
-DSELION_SELENIUM_RUN_LOCALLY=true -DSELION_DOWNLOAD_DEPENDENCIES=true && exit $?
fi

0 comments on commit 248163c

Please sign in to comment.