Helper class for generating debug identifiers.
+ * + * @author + * Riccardo Nimser + */ +public class DebugIdHelper { + /** + *Creates a debug identifier for the given enum value. The identifier is the camel cased name of the enum value + * as declared in its enum declaration. The name is split into single words using the underscore.
+ * + * @param value + * The enum value for which the identfier should be created. + * @return + * A debug identifier for the given enum value. + */ + public staticCreates a debug identifier for the given name. The name is splited into single words using all whitespace + * characters.
+ * + * @param value + * The name for which the identifier should be created. + * @return + * A debug identifier for the given enum value. + */ + public static String createDebugId(String name) { + return createDebugId(name, "\\s"); + } + + private static String createDebugId(String name, String splitRegex) { + StringBuilder builder = new StringBuilder(); + + for (String token : name.split(splitRegex)) { + builder.append(token.substring(0, 1).toUpperCase()); + builder.append(token.substring(1, token.length()).toLowerCase()); + } + return builder.toString(); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/AbstractCompetitorLeaderboardChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/AbstractCompetitorLeaderboardChart.java index 0123c90f005..da1b2b0303f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/AbstractCompetitorLeaderboardChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/charts/AbstractCompetitorLeaderboardChart.java @@ -159,6 +159,7 @@ public abstract class AbstractCompetitorLeaderboardChartCreates an XPath 1.0 predicate that matches if an element has the given style sheet class in its "class" + * attribute.
+ * + * @param className + * The name of the style sheet class to check for. + * @return + * An XPath predicate that matches if an element has the given style sheet class in its "class" attribute. + */ + public static String containsCSSClassPredicate(String className) { + return "contains(concat(' ',normalize-space(@class),' '),' " + className + " ')"; + } + + public static String containsCSSClassesPredicate(String... classNames) { + StringBuilder builder = new StringBuilder(70 * classNames.length); + for(String className : classNames) { + builder.append(containsCSSClassPredicate(className)); + builder.append(" and "); + } + return builder.substring(0, builder.length() - 5); + } + public static ListSelects the specified entry.
* @@ -261,27 +285,17 @@ public abstract class CellTablePOReturns an identifier for data entry that uniquely identifies the entry in the containing table. The default + * implementation simply returns the underlying web element, but subclasses should overwrite this method and + * return a more meaningful value. An example would be the String value of one ore more columns.
+ * + * @return + * An identifier that uniquely identifies the entry in the containing table. + */ + public Object getIdentifier() { + // TODO: Test if its valid to return the context (the web element) + // To verify this take the key of an entry and ask the table for the entry with this key! + return this.context; + } + public boolean isSelected() { return CSSHelper.hasCSSClass((WebElement) this.context, CellTablePO.SELECTED_ROW_CSS_CLASS); } @@ -68,26 +81,33 @@ public class DataEntryPO extends CellTableRowPO { } protected Action getSelectAction() { - HasInputDevices devices = (HasInputDevices) this.driver; - Mouse mouse = devices.getMouse(); - Locatable locatable = getLocatableForSelect(); + Actions actions = new Actions(this.driver); + actions.moveToElement(getElementForSelect(), 1, 1); + actions.click(); - CompositeAction action = new CompositeAction(); - action.addAction(new MoveToOffsetAction(mouse, locatable, 1, 1)); - action.addAction(new ClickAction(mouse, null)); - - return action; + return actions.build(); } - protected Locatable getLocatableForSelect() { - return (Locatable) (this.columns.isEmpty() ? this.context : this.columns.get(0)); + /** + *Returns the element on which to click to select or deselect the data entry in the table. The default + * implementation returns the first column or the row if there are no columns. It may be necessary to overwrite + * this method for the case the first column contains a widget that should not be clicked accidentally.
+ * + * @return + * The element on which to click to select or deselect the data entry in the table. + */ + protected WebElement getElementForSelect() { + return (this.columns.isEmpty() ? getWebElement() : this.columns.get(0)); } protected Action getModifiedSelectAction() { - CompositeAction action = getModifiedCompositeActionAction(); - action.addAction(getSelectAction()); + Actions actions = new Actions(this.driver); + actions.keyDown(Keys.CONTROL); + actions.moveToElement(getElementForSelect(), 1, 1); + actions.click(); + actions.keyUp(Keys.CONTROL); - return action; + return actions.build(); } protected CompositeAction getModifiedCompositeActionAction() { diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/gwt/GenericCellTablePO.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/gwt/GenericCellTablePO.java index 745b511ec2d..3941f2198f8 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/gwt/GenericCellTablePO.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/gwt/GenericCellTablePO.java @@ -65,19 +65,19 @@ public class GenericCellTablePOThe page object representing the leaderboard.
@@ -19,9 +19,9 @@ import com.sap.sailing.selenium.pages.common.HTMLConstants; * D049941 */ public class LeaderboardPage extends HostPage { - private static final String PAGE_TITLE = "SAP Sailing Analytics Leaderboard"; //$NON-NLS-1$ private static final String LEADERBOAR_PARAMTER_NAME = "name"; //$NON-NLS-1$ + private static final String SHOW_RACE_DETAILS_PARAMTER_NAME = "showRaceDetails"; //$NON-NLS-1$ private static final String AUTO_REFRESH_ENABLED_IMAGE = "url(\"data:image/png;base64," + //$NON-NLS-1$ "iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAR0lEQVR42mOoqan5T2vMMGoJxZZUV1fPB9IOWDC" + //$NON-NLS-1$ @@ -32,6 +32,10 @@ public class LeaderboardPage extends HostPage { "nDQxAAKQDgBbep6klIFBfXy9QW1vbT1NLYKCqqsoAKH6eppbAADD4CoDy72lqCTQIFYhNGGRbAgPEJAyKLSEmYV" + //$NON-NLS-1$ "DFEhgAWpQwdH1C0ziheeqiaT6haY6nedlF01KYXvXJaB0/MJYAANIIBwANoTb3AAAAAElFTkSuQmCC\")"; //$NON-NLS-1$ + public static LeaderboardPage goToPage(WebDriver driver, String root, String leaderboard) { + return goToPage(driver, root, leaderboard, false); + } + /** *Goes to the specified leaderboard and returns the representing page object.
* @@ -44,29 +48,49 @@ public class LeaderboardPage extends HostPage { * @return * The page object for the administration console. */ - public static LeaderboardPage goToPage(WebDriver driver, String root, String leaderboard) { + public static LeaderboardPage goToPage(WebDriver driver, String root, String leaderboard, boolean raceDetails) { driver.get(root + "gwt/Leaderboard.html?" + getLeaderboard(leaderboard) + //$NON-NLS-1$ - "&" + getGWTCodeServer()); //$NON-NLS-1$ + "&" + getGWTCodeServer() + "&" + getShowRaceDeatails(raceDetails)); //$NON-NLS-1$ - return new LeaderboardPage(driver); + return new LeaderboardPage(driver, leaderboard); } private static String getLeaderboard(String leaderboard) { return LEADERBOAR_PARAMTER_NAME + "=" + leaderboard; //$NON-NLS-1$ } - @FindBy(how = BySeleniumId.class, using = "AutoRefreshToggleButton") - private WebElement autoRefreshToggleButton; + private static String getShowRaceDeatails(boolean raceDetails) { + return SHOW_RACE_DETAILS_PARAMTER_NAME + "=" + raceDetails; //$NON-NLS-1$ + } - @FindBy(how = BySeleniumId.class, using = "LeaderboardTable") - private WebElement leaderboardTable; + @FindBy(how = BySeleniumId.class, using = "LeaderboardDisplayCheckBox") + private WebElement leaderboardDisplayCheckBox; - private LeaderboardPage(WebDriver driver) { + @FindBy(how = BySeleniumId.class, using = "LeaderboardSettingsButton") + private WebElement leaderboardSettingsButton; + + @FindBy(how = BySeleniumId.class, using = "CompetitorChartsDisplayCheckBox") + private WebElement competitorChartsDisplayCheckBox; + + @FindBy(how = BySeleniumId.class, using = "CompetitorChartsSettingsButton") + private WebElement competitorChartsSettingsButton; + + @FindBy(how = BySeleniumId.class, using = "PlayAndPauseAnchor") + private WebElement playAndPauseAnchor; + + @FindBy(how = BySeleniumId.class, using = "LeaderboardCellTable") + private WebElement leaderboardCellTable; + + private LeaderboardPage(WebDriver driver, String leaderboard) { super(driver); + + if(!this.driver.getTitle().equals(leaderboard)) { + throw new IllegalStateException("This is not the leaderboard"); //$NON-NLS-1$ + } } public boolean isAutoRefreshEnabled() { - WebElement image = this.autoRefreshToggleButton.findElement(By.tagName(HTMLConstants.IMAGE_TAG_NAME)); + WebElement image = this.playAndPauseAnchor.findElement(By.tagName(HTMLConstants.IMAGE_TAG_NAME)); String background = image.getCssValue(CSSConstants.CSS_BACKGROUND_IMAGE); if(AUTO_REFRESH_ENABLED_IMAGE.equals(background)) @@ -78,18 +102,60 @@ public class LeaderboardPage extends HostPage { throw new RuntimeException("Can not determine auto refresh state"); //$NON-NLS-1$ } - public void setAutoRefreshEnabled(boolean enabled) { - if(isAutoRefreshEnabled() != enabled) - this.autoRefreshToggleButton.click(); + public void refresh() { + JavascriptExecutor executor = (JavascriptExecutor) driver; + Long finishedCalls = (Long) executor.executeScript( + "return window.PENDING_AJAX_CALLS.numberOfFinishedCalls(arguments[0])", "loadLeaderboardData"); + + this.playAndPauseAnchor.click(); + + waitForAjaxRequestsExecuted("loadLeaderboardData", finishedCalls.intValue() + 1); + + this.playAndPauseAnchor.click(); } - /** - *Verifies that the current page is the leaderboard by checking the title of the page.
- */ + public CompetitorChartsSettingsDialogPO getCompetitorChartsSettings() { + this.competitorChartsSettingsButton.click(); + + return new CompetitorChartsSettingsDialogPO(this.driver, + findElementBySeleniumId(this.driver, "CompetitorChartsSettingsDialog")); + } + + public LeaderboardSettingsDialogPO getLeaderboardSettings() { + this.leaderboardSettingsButton.click(); + + return new LeaderboardSettingsDialogPO(this.driver, + findElementBySeleniumId(this.driver, "LeaderboardSettingsDialog")); + } + + public LeaderboardTablePO getLeaderboardTable() { + return new LeaderboardTablePO(this.driver, this.leaderboardCellTable); + } + + public void showCompetitorChart(String chart) { + this.competitorChartsSettingsButton.click(); + CompetitorChartsSettingsDialogPO dialog = new CompetitorChartsSettingsDialogPO(this.driver, + findElementBySeleniumId(this.driver, "CompetitorChartsSettingsDialog")); + dialog.selectChartType(chart); + + CheckBoxPO checkbox = new CheckBoxPO(this.driver, this.competitorChartsDisplayCheckBox); + checkbox.setSelected(true); + } + + public void hideCompetitorChart() { + CheckBoxPO checkbox = new CheckBoxPO(this.driver, this.competitorChartsDisplayCheckBox); + checkbox.setSelected(false); + } + +// public LineChart getCompetitorChart() { +// return new LineChart(this.driver, findElementBySeleniumId("CompetitorChart")); +// } + @Override - protected void verify() { - if(!PAGE_TITLE.equals(this.driver.getTitle())) { - throw new IllegalStateException("This is not the leaderboard"); //$NON-NLS-1$ - } + protected void initElements() { + super.initElements(); + + // Wait for the initial loading of the data + waitForAjaxRequestsExecuted("loadLeaderboardData", 1); } } diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/leaderboard/LeaderboardSettingsDialogPO.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/leaderboard/LeaderboardSettingsDialogPO.java new file mode 100644 index 00000000000..9922a72e74b --- /dev/null +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/leaderboard/LeaderboardSettingsDialogPO.java @@ -0,0 +1,110 @@ +package com.sap.sailing.selenium.pages.leaderboard; + +import java.util.List; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +import com.sap.sailing.selenium.core.BySeleniumId; +import com.sap.sailing.selenium.core.FindBy; +import com.sap.sailing.selenium.pages.common.CSSHelper; +import com.sap.sailing.selenium.pages.common.DataEntryDialogPO; +import com.sap.sailing.selenium.pages.gwt.CheckBoxPO; +import com.sap.sailing.selenium.pages.gwt.RadioButtonPO; + +public class LeaderboardSettingsDialogPO extends DataEntryDialogPO { + @FindBy(how = BySeleniumId.class, using = "RaceSelectionSettingsPanel") + private WebElement raceSelectionSettingsPanel; + + @FindBy(how = BySeleniumId.class, using = "ExplicitRaceSelectionRadioButton") + private WebElement explicitRaceSelectionRadioButton; + + @FindBy(how = BySeleniumId.class, using = "MostCurrentRacesSelectionRadioButton") + private WebElement mostCurrentRacesSelectionRadioButton; + + @FindBy(how = BySeleniumId.class, using = "OverallDetailsSettingsPanel") + private WebElement overallDetailsSettingsPanel; + + @FindBy(how = BySeleniumId.class, using = "RaceDetailsSettingsPanel") + private WebElement raceDetailsSettingsPanel; + + @FindBy(how = BySeleniumId.class, using = "LegDetailsSettingsPanel") + private WebElement legDetailsSettingsPanel; + + @FindBy(how = BySeleniumId.class, using = "ManeuverSettingsPanel") + private WebElement maneuverSettingsPanel; + + public LeaderboardSettingsDialogPO(WebDriver driver, WebElement element) { + super(driver, element); + } + + public void setRacesToDisplay(ListTest for the correct start and stop of a tracking.
*/ @Test public void testStartAndStopTrackingWithCorrectRegatta() { + RegattaDescriptor bmwCupDescriptor = new RegattaDescriptor(BMW_CUP_EVENT, BMW_CUP_BOAT_CLASS); + AdminConsolePage adminConsole = AdminConsolePage.goToPage(getWebDriver(), getContextRoot()); + RegattaStructureManagementPanelPO regattaStructure = adminConsole.goToRegattaStructure(); + regattaStructure.createRegatta(bmwCupDescriptor); + TracTracEventManagementPanelPO tracTracEvents = adminConsole.goToTracTracEvents(); tracTracEvents.listTrackableRaces(BMW_CUP_JSON_URL); - // TODO: Complete the test case! - //tracTracEvents.startTracking(BMW_CUP_RACE_8, BMW_CUP_REGATTA, false, false, false); + tracTracEvents.setReggataForTracking(bmwCupDescriptor); + tracTracEvents.setTrackSettings(false, false, false); + tracTracEvents.startTrackingForRace(this.trackableRace); - //assertThat(tracTracEvents.getTrackedRaces(), hasItem(12)); + TrackedRacesListPO trackedRacesList = tracTracEvents.getTrackedRacesList(); + trackedRacesList.waitForTrackedRace(this.trackedRace, Status.TRACKING); - //tracTracEvents.stopTracking("BMW_CUP_RACE_8"); + assertThat(trackedRacesList.getStatus(this.trackedRace), equalTo(Status.TRACKING)); - //assertThat(tracTracEvents.getTrackedRaces(), not(hasItem(12))); + trackedRacesList.stopTracking(this.trackedRace); + trackedRacesList.waitForTrackedRace(this.trackedRace, Status.FINISHED); + + assertThat(trackedRacesList.getStatus(this.trackedRace), equalTo(Status.FINISHED)); + } + + @Test + public void testStartTrackingWithDefaultReggataWhileReggataForBoatClassExists() { + AdminConsolePage adminConsole = AdminConsolePage.goToPage(getWebDriver(), getContextRoot()); + + RegattaStructureManagementPanelPO regattaStructure = adminConsole.goToRegattaStructure(); + regattaStructure.createRegatta(new RegattaDescriptor(BMW_CUP_EVENT, BMW_CUP_BOAT_CLASS)); + + TracTracEventManagementPanelPO tracTracEvents = adminConsole.goToTracTracEvents(); + tracTracEvents.listTrackableRaces(BMW_CUP_JSON_URL); + + tracTracEvents.setReggataForTracking(DEFAULT_REGATTA); + tracTracEvents.setTrackSettings(false, false, false); + tracTracEvents.startTrackingForRace(this.trackableRace); + + TargetLocator locator = getWebDriver().switchTo(); + Alert alert = locator.alert(); + String text = alert.getText(); + + alert.dismiss(); + + String message = "There is at least one regatta for the selected boat classes. Do you really want " + + "to use the 'no regatta' selection?"; + + assertThat(text, containsString("WARNING")); + assertThat(text, containsString(message)); + } + + @Test + public void testStartTrackingWithReggataAndNoneMatchingBoatClass() { + RegattaDescriptor bmwCupDescriptor = new RegattaDescriptor(BMW_CUP_EVENT, BMW_CUP_BOAT_CLASS); + RegattaDescriptor idm2013Descriptor = new RegattaDescriptor(IDM_2013_EVENT, IDM_2013_BOAT_CLASS); + + AdminConsolePage adminConsole = AdminConsolePage.goToPage(getWebDriver(), getContextRoot()); + + RegattaStructureManagementPanelPO regattaStructure = adminConsole.goToRegattaStructure(); + regattaStructure.createRegatta(bmwCupDescriptor); + regattaStructure.createRegatta(idm2013Descriptor); + + TracTracEventManagementPanelPO tracTracEvents = adminConsole.goToTracTracEvents(); + tracTracEvents.listTrackableRaces(BMW_CUP_JSON_URL); + + tracTracEvents.setReggataForTracking(idm2013Descriptor); + tracTracEvents.setTrackSettings(false, false, false); + tracTracEvents.startTrackingForRace(this.trackableRace); + + TargetLocator locator = getWebDriver().switchTo(); + Alert alert = locator.alert(); + String text = alert.getText(); + + alert.dismiss(); + + String message = String.format("The selected races contain boat classes which are not the same as " + + "the boat class '%s' of the selected regatta. Do you really want to use the regatta '%s'?", + IDM_2013_BOAT_CLASS, IDM_2013_REGATTA); + + assertThat(text, containsString("WARNING")); + assertThat(text, containsString(message)); } } diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestColumnsInLeaderboard.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestColumnsInLeaderboard.java new file mode 100644 index 00000000000..cff94a91402 --- /dev/null +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestColumnsInLeaderboard.java @@ -0,0 +1,126 @@ +package com.sap.sailing.selenium.test.leaderboard; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +import com.sap.sailing.selenium.pages.adminconsole.AdminConsolePage; +import com.sap.sailing.selenium.pages.adminconsole.leaderboard.LeaderboardConfigurationPanelPO; +import com.sap.sailing.selenium.pages.adminconsole.leaderboard.LeaderboardDetailsPanelPO; +import com.sap.sailing.selenium.pages.adminconsole.leaderboard.LeaderboardDetailsPanelPO.RaceDescriptor; +import com.sap.sailing.selenium.pages.adminconsole.regatta.RegattaDetailsCompositePO; +import com.sap.sailing.selenium.pages.adminconsole.regatta.RegattaListCompositePO.RegattaDescriptor; +import com.sap.sailing.selenium.pages.adminconsole.regatta.RegattaStructureManagementPanelPO; +import com.sap.sailing.selenium.pages.adminconsole.regatta.SeriesEditDialogPO; +import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesListPO; +import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesListPO.Status; +import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesListPO.TrackedRaceDescriptor; +import com.sap.sailing.selenium.pages.adminconsole.tractrac.TracTracEventManagementPanelPO; +import com.sap.sailing.selenium.pages.adminconsole.tractrac.TracTracEventManagementPanelPO.TrackableRaceDescriptor; +import com.sap.sailing.selenium.pages.leaderboard.LeaderboardPage; +import com.sap.sailing.selenium.pages.leaderboard.LeaderboardSettingsDialogPO; +import com.sap.sailing.selenium.pages.leaderboard.LeaderboardTablePO; +import com.sap.sailing.selenium.pages.leaderboard.LeaderboardTablePO.LeaderboardEntry; +import com.sap.sailing.selenium.test.AbstractSeleniumTest; + +public class TestColumnsInLeaderboard extends AbstractSeleniumTest { + private static final String KIELER_WOCHE_2013_JSON_URL = + "http://secondary.traclive.dk/events/event_20130621_KielerWoch/jsonservice.php"; //$NON-NLS-1$ + + private static final String REGATTA = "KW 2013 Offshore Kaiser-Pokal"; //$NON-NLS-1$ + + private static final String LEADERBOARD = "KW 2013 Offshore Kaiser-Pokal (ORC)"; //$NON-NLS-1$ + + private static final String EVENT = "Kieler Woche 2013"; //$NON-NLS-1$ + private static final String BOAT_CLASS = "ORC"; //$NON-NLS-1$ + private static final String RACE = "Kaiserpokal"; //$NON-NLS-1$ + + private RegattaDescriptor regatta; + + private TrackableRaceDescriptor trackableRace; + private TrackedRaceDescriptor trackedRace; + private RaceDescriptor raceColumn; + + + @Before + public void setUp() { + this.regatta = new RegattaDescriptor(REGATTA, BOAT_CLASS); + + this.trackableRace = new TrackableRaceDescriptor(EVENT, RACE, BOAT_CLASS); + this.trackedRace = new TrackedRaceDescriptor(this.regatta.toString(), BOAT_CLASS, RACE); + this.raceColumn = new RaceDescriptor("R1", "Default", false, false, 0.0); + + clearState(getContextRoot()); + configureLeaderboard(); + } + + @Test + public void testCorrectDisplayOfAllColumns() { + LeaderboardPage leaderboard = LeaderboardPage.goToPage(getWebDriver(), getContextRoot(), LEADERBOARD, true); + LeaderboardTablePO leaderboardTabel = leaderboard.getLeaderboardTable(); + + LeaderboardSettingsDialogPO settings = leaderboard.getLeaderboardSettings(); + settings.setRacesToDisplay(leaderboardTabel.getRaceNames()); + settings.showAllOverallDetails(); + settings.showAllRaceDetails(); + settings.showAllLegDetails(); + settings.showAllManeuverDetails(); + settings.pressOk(); + + boolean stateHasChanged; + + do { + ListDecorator for asynchronous remote procedure calls which should be marked as pending until they complete. * Such calls will be marked using a counter, which is necessary in UI tests to be able able to tell exactly when an * asynchronous request has finished. With this counter a test which triggers a request (which can cause additional - * request) can wait until the requests have finished. It's guaranteed that the counter is decremented no matter if + * requests) can wait until the requests have finished. It's guaranteed that the counter is decremented no matter if * the call was successful or not.
* *Note: Since the counter for pending Ajax requests is incremented as soon as an instance of this class is created
diff --git a/java/org.openqa.selenium.osgi/.classpath b/java/org.openqa.selenium.osgi/.classpath
index 59bd94e2a9e..ba51e2993d9 100644
--- a/java/org.openqa.selenium.osgi/.classpath
+++ b/java/org.openqa.selenium.osgi/.classpath
@@ -1,6 +1,7 @@