Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
Make the timeout period for webdriver waits configurable
Browse files Browse the repository at this point in the history
Use -Dwebdriver.wait to set the maximum condition waiting period.
  • Loading branch information
djansen-redhat committed Oct 9, 2014
1 parent c38332c commit 6ec5a96
Show file tree
Hide file tree
Showing 37 changed files with 164 additions and 145 deletions.
2 changes: 2 additions & 0 deletions functional-test/pom.xml
Expand Up @@ -54,6 +54,7 @@
<webdriver.display>:0</webdriver.display>
<webdriver.log>${project.build.directory}/webdriver.log</webdriver.log>
<webdriver.screenshot.dir>${project.build.directory}/screenshots</webdriver.screenshot.dir>
<webdriver.wait>10</webdriver.wait>
<googleopenid.credentials>zanata.user.1:</googleopenid.credentials>
<!-- on jenkins, this needs to be set to empty - so that cargo can shutdown. see http://stackoverflow.com/questions/1096642/tomcat-failed-to-shutdown -->
<cargo.debug.jvm.args>
Expand Down Expand Up @@ -695,6 +696,7 @@
<echo>-Dwebdriver.display=display to run test browser in, for Xnest or otherwise. Default is :0.</echo>
<echo>-Dwebdriver.chrome.bin=full path to chrome binary.</echo>
<echo>-Dwebdriver.chrome.driver=full path to chromedriver binary.</echo>
<echo>-Dwebdriver.wait=global wait time in seconds for element searches. Default is 10.</echo>
<echo>==========================================================</echo>
<echo>to ask cargo to start up then wait so that tests can be run manually: mvn clean package cargo:run -Dfunctional-test -Dmysql.port=13306</echo>
</target>
Expand Down
44 changes: 25 additions & 19 deletions functional-test/src/main/java/org/zanata/page/AbstractPage.java
Expand Up @@ -35,7 +35,6 @@
import org.zanata.util.WebElementUtil;

import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Predicate;

/**
Expand All @@ -45,13 +44,13 @@
@Slf4j
public class AbstractPage {
private final WebDriver driver;
private final FluentWait<WebDriver> ajaxWaitForTenSec;
private final FluentWait<WebDriver> ajaxWaitForSec;

public AbstractPage(final WebDriver driver) {
PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10),
this);
this.driver = driver;
ajaxWaitForTenSec = WebElementUtil.waitForTenSeconds(driver);
ajaxWaitForSec = WebElementUtil.waitForAMoment(driver);
waitForPageSilence();
}

Expand All @@ -78,8 +77,8 @@ public String getUrl() {
return driver.getCurrentUrl();
}

public FluentWait<WebDriver> waitForTenSec() {
return ajaxWaitForTenSec;
public FluentWait<WebDriver> waitForAMoment() {
return ajaxWaitForSec;
}

/**
Expand All @@ -89,7 +88,7 @@ public FluentWait<WebDriver> waitForTenSec() {
*/
public void waitForPage(List<By> elementBys) {
for (final By by : elementBys) {
waitForTenSec().until(new Function<WebDriver, WebElement>() {
waitForAMoment().until(new Function<WebDriver, WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
return getDriver().findElement(by);
Expand All @@ -99,12 +98,13 @@ public WebElement apply(WebDriver driver) {
}

public Alert switchToAlert() {
return waitForTenSec().until(new Function<WebDriver, Alert>() {
return waitForAMoment().until(new Function<WebDriver, Alert>() {
@Override
public Alert apply(WebDriver driver) {
try {
return getDriver().switchTo().alert();
} catch (NoAlertPresentException noAlertPresent) {
}
catch (NoAlertPresentException noAlertPresent) {
return null;
}
}
Expand All @@ -113,14 +113,14 @@ public Alert apply(WebDriver driver) {

protected <P extends AbstractPage> P refreshPageUntil(P currentPage,
Predicate<WebDriver> predicate) {
waitForTenSec().until(predicate);
waitForAMoment().until(predicate);
PageFactory.initElements(driver, currentPage);
return currentPage;
}

protected <P extends AbstractPage, T> T refreshPageUntil(P currentPage,
Function<WebDriver, T> function) {
T done = waitForTenSec().until(function);
T done = waitForAMoment().until(function);
PageFactory.initElements(driver, currentPage);
return done;
}
Expand All @@ -136,7 +136,7 @@ protected <P extends AbstractPage, T> T refreshPageUntil(P currentPage,
*/
public <T> void
waitFor(final Callable<T> callable, final Matcher<T> matcher) {
waitForTenSec().until(new Predicate<WebDriver>() {
waitForAMoment().until(new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver input) {
try {
Expand All @@ -146,7 +146,8 @@ public boolean apply(WebDriver input) {
new Description.NullDescription());
}
return matcher.matches(result);
} catch (Exception e) {
}
catch (Exception e) {
log.warn("exception", e);
return false;
}
Expand All @@ -160,26 +161,31 @@ public boolean apply(WebDriver input) {
*/
public void waitForPageSilence() {
// Wait for jQuery calls to be 0
waitForTenSec().until(new Predicate<WebDriver>() {
waitForAMoment().until(new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver input) {
int ajaxCalls;
int jQueryCalls;
try {
jQueryCalls = Integer.parseInt(
((JavascriptExecutor) getDriver())
.executeScript("return jQuery.active")
.toString());
} catch (WebDriverException jCall) {
.executeScript("return jQuery.active")
.toString()
);
}
catch (WebDriverException jCall) {
jQueryCalls = 0;
}

try {
ajaxCalls = Integer.parseInt(
((JavascriptExecutor) getDriver())
.executeScript("return Ajax.activeRequestCount")
.toString());
} catch (WebDriverException jCall) {
.executeScript(
"return Ajax.activeRequestCount")
.toString()
);
}
catch (WebDriverException jCall) {
ajaxCalls = 0;
}
return ajaxCalls + jQueryCalls == 0;
Expand Down
10 changes: 5 additions & 5 deletions functional-test/src/main/java/org/zanata/page/BasePage.java
Expand Up @@ -103,14 +103,14 @@ private void clickNavMenuItem(final WebElement menuItem) {
getDriver().findElement(By.id("nav-main"))
.findElement(By.tagName("a")).click();
}
waitForTenSec().until(new Predicate<WebDriver>() {
waitForAMoment().until(new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver input) {
return menuItem.isDisplayed();
}
});
// The notifications can sometimes get in the way
waitForTenSec().until(ExpectedConditions.elementToBeClickable(menuItem));
waitForAMoment().until(ExpectedConditions.elementToBeClickable(menuItem));
menuItem.click();
}

Expand Down Expand Up @@ -257,7 +257,7 @@ public ProjectsPage submitSearch() {

public BasePage waitForSearchListContains(final String expected) {
log.info("Wait for Project search list contains {}", expected);
waitForTenSec().until(new Predicate<WebDriver>() {
waitForAMoment().until(new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver input) {
return getProjectSearchAutocompleteItems().contains(expected);
Expand All @@ -275,7 +275,7 @@ public List<String> getProjectSearchAutocompleteItems() {
public ProjectVersionsPage clickSearchEntry(final String searchEntry) {
log.info("Click Projects search result {}", searchEntry);
WebElement searchItem =
waitForTenSec().until(new Function<WebDriver, WebElement>() {
waitForAMoment().until(new Function<WebDriver, WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
List<WebElement> items =
Expand All @@ -296,7 +296,7 @@ public WebElement apply(WebDriver driver) {
}

public void clickWhenTabEnabled(final WebElement tab) {
waitForTenSec().until(new Predicate<WebDriver>() {
waitForAMoment().until(new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver input) {
waitForPageSilence();
Expand Down
10 changes: 5 additions & 5 deletions functional-test/src/main/java/org/zanata/page/CorePage.java
Expand Up @@ -130,14 +130,14 @@ public String getNotificationMessage() {

public boolean expectNotification(final String notification) {
log.info("Wait for notification {}", notification);
return waitForTenSec().until(new Function<WebDriver, Boolean>() {
return waitForAMoment().until(new Function<WebDriver, Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
List<WebElement> messages = getDriver()
.findElement(By.id("messages"))
.findElements(By.tagName("li"));
List<String> notifications = new ArrayList<String>();
for( WebElement message : messages ) {
for (WebElement message : messages) {
notifications.add(message.getText().trim());
}
return notifications.contains(notification);
Expand All @@ -146,7 +146,7 @@ public Boolean apply(WebDriver driver) {
}

public List<String> expectFieldError(final String expected) {
waitForTenSec().until(new Predicate<WebDriver>() {
waitForAMoment().until(new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver input) {
return waitForFieldErrors().contains(expected);
Expand All @@ -157,7 +157,7 @@ public boolean apply(WebDriver input) {

public List<String> waitForErrors() {
log.info("Query page errors list");
waitForTenSec().until(new Function<WebDriver, WebElement>() {
waitForAMoment().until(new Function<WebDriver, WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
return getDriver().findElement(
Expand Down Expand Up @@ -202,7 +202,7 @@ public void defocus() {

public List<String> waitForFieldErrors() {
log.info("Query field errors");
waitForTenSec().until(new Function<WebDriver, WebElement>() {
waitForAMoment().until(new Function<WebDriver, WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
return getDriver().findElement(By.className("message--danger"));
Expand Down
Expand Up @@ -44,6 +44,7 @@
import static org.zanata.util.Constants.chrome;
import static org.zanata.util.Constants.firefox;
import static org.zanata.util.Constants.webDriverType;
import static org.zanata.util.Constants.webDriverWait;
import static org.zanata.util.Constants.zanataInstance;

@Slf4j
Expand All @@ -53,15 +54,17 @@ public enum WebDriverFactory {
private volatile WebDriver driver = createDriver();
private DriverService driverService;
private TestEventForScreenshotListener eventListener;
private int webdriverWait;

public WebDriver getDriver() {
return driver;
}

public WebDriver createDriver() {
WebDriver driver = createPlainDriver();
webdriverWait = Integer.parseInt(PropertiesHolder
.getProperty(webDriverWait.value()));
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

Runtime.getRuntime().addShutdownHook(new ShutdownHook());
return driver;
}
Expand All @@ -70,6 +73,10 @@ public String getHostUrl() {
return PropertiesHolder.getProperty(zanataInstance.value());
}

public int getWebDriverWait() {
return webdriverWait;
}

public void updateListenerTestName(String testName) {
if (eventListener == null && ScreenshotDirForTest.isScreenshotEnabled()) {
eventListener = new TestEventForScreenshotListener(driver);
Expand All @@ -78,7 +85,6 @@ public void updateListenerTestName(String testName) {
eventListener.updateTestID(testName);
}


private WebDriver enableScreenshots() {
log.debug("Enabling screenshot module...");
return EventFiringWebDriver.class.cast(driver).register(eventListener);
Expand Down
Expand Up @@ -140,7 +140,7 @@ public RegisterPage setFields(Map<String, String> fields) {

public List<String> waitForErrors() {
log.info("Query errors");
waitForTenSec().until(new Function<WebDriver, WebElement>() {
waitForAMoment().until(new Function<WebDriver, WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
return getDriver().findElement(
Expand Down
Expand Up @@ -81,7 +81,7 @@ public Map<String, String> getLanguageDetails() {
log.info("Query language details");
Map<String, String> map = new HashMap();
// Wait for the fields to be populated
waitForTenSec().until(new Predicate<WebDriver>() {
waitForAMoment().until(new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver input) {
List<WebElement> thisElement = getDriver()
Expand Down
Expand Up @@ -49,7 +49,7 @@ public EditHomeContentPage(final WebDriver driver) {
public EditHomeContentPage enterText(String text) {
log.info("Enter homepage code\n{}", text);
// Switch to the CKEditor frame
getDriver().switchTo().frame(waitForTenSec().until(new Function<WebDriver, WebElement>() {
getDriver().switchTo().frame(waitForAMoment().until(new Function<WebDriver, WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
return getDriver().findElement(
Expand All @@ -58,7 +58,7 @@ public WebElement apply(WebDriver driver) {
}
}));

WebElement textEdit = waitForTenSec().until(new Function<WebDriver, WebElement>() {
WebElement textEdit = waitForAMoment().until(new Function<WebDriver, WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
System.out.println(getDriver().findElements(By.tagName("body")).size());
Expand Down
Expand Up @@ -73,7 +73,7 @@ public ManageLanguageTeamMemberPage manageTeamMembersFor(

private TableRow findRowByLocale(final String localeId) {
TableRow matchedRow =
waitForTenSec().until(new Function<WebDriver, TableRow>() {
waitForAMoment().until(new Function<WebDriver, TableRow>() {
@Override
public TableRow apply(WebDriver driver) {
List<TableRow> tableRows =
Expand Down
Expand Up @@ -58,15 +58,15 @@ public ManageLanguageTeamMemberPage joinLanguageTeam() {
// Waiting 10 seconds for an element to be present on the page, checking
// for its presence once every 1 second.
WebElement joinLanguageTeamLink =
waitForTenSec().until(new Function<WebDriver, WebElement>() {
waitForAMoment().until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By
.linkText("Join Language Team"));
}
});
joinLanguageTeamLink.click();
// we need to wait for this join to finish before returning the page
waitForTenSec().until(new Function<WebDriver, Boolean>() {
waitForAMoment().until(new Function<WebDriver, Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
List<WebElement> joinLanguageTeam =
Expand All @@ -80,7 +80,7 @@ public Boolean apply(WebDriver driver) {
public ManageLanguageTeamMemberPage clickAddTeamMember() {
log.info("Click Add Team Member");
WebElement addTeamMemberLink =
waitForTenSec().until(new Function<WebDriver, WebElement>() {
waitForAMoment().until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("addTeamMemberLink"));
}
Expand All @@ -96,7 +96,7 @@ public ManageLanguageTeamMemberPage searchPersonAndAddToTeam(
getDriver().findElement(By.id("userAddPanel_container"));

WebElement searchInput =
waitForTenSec().until(new Function<WebDriver, WebElement>() {
waitForAMoment().until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return addUserPanel.findElement(By
.id("searchForm:searchField"));
Expand All @@ -107,7 +107,7 @@ public WebElement apply(WebDriver driver) {
getDriver().findElement(By.id("searchForm:searchBtn"));
searchButton.click();

return waitForTenSec().until(
return waitForAMoment().until(
new Function<WebDriver, ManageLanguageTeamMemberPage>() {
@Override
public ManageLanguageTeamMemberPage apply(WebDriver driver) {
Expand Down
Expand Up @@ -75,7 +75,7 @@ public boolean allActionsSelected() {
public ManageSearchPage performSelectedActions() {
log.info("Click Perform Actions");
getDriver().findElement(By.id("form:reindex")).click();
waitForTenSec().until(new Predicate<WebDriver>() {
waitForAMoment().until(new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver input) {
// The Abort button will display
Expand All @@ -87,7 +87,7 @@ public boolean apply(WebDriver input) {

public ManageSearchPage waitForActionsToFinish() {
log.info("Wait: all actions are finished");
waitForTenSec().until(new Predicate<WebDriver>() {
waitForAMoment().until(new Predicate<WebDriver>() {
@Override
public boolean apply(WebDriver input) {
// once the button re-appears, it means the reindex is done.
Expand Down

0 comments on commit 6ec5a96

Please sign in to comment.