diff --git a/.travis.yml b/.travis.yml index 9ba565b8586..7fa8e156ab0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -67,8 +67,7 @@ before_install: - echo 'R_LIBS=~/R' > ~/.Renviron - R -e "install.packages('knitr', repos = 'http://cran.us.r-project.org', lib='~/R')" - export R_LIBS='~/R' - - "export DISPLAY=:99.0" - - "sh -e /etc/init.d/xvfb start" + - "/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1600x1024x16" install: - mvn $BUILD_FLAG $PROFILE -B diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java b/zeppelin-server/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java index a86d08b212a..7502c57eb17 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java @@ -22,6 +22,9 @@ import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.FileUtils; import org.openqa.selenium.*; +import org.openqa.selenium.logging.LogEntries; +import org.openqa.selenium.logging.LogEntry; +import org.openqa.selenium.logging.LogType; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.FluentWait; import org.openqa.selenium.support.ui.Wait; @@ -30,6 +33,7 @@ import org.slf4j.LoggerFactory; import java.io.File; +import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -75,7 +79,7 @@ protected void runParagraph(int paragraphNo) { protected String getParagraphXPath(int paragraphNo) { - return "//div[@ng-controller=\"ParagraphCtrl\"][" + paragraphNo + "]"; + return "(//div[@ng-controller=\"ParagraphCtrl\"])[" + paragraphNo + "]"; } protected boolean waitForParagraph(final int paragraphNo, final String state) { @@ -151,6 +155,10 @@ protected void deleteTestNotebook(final WebDriver driver) { protected void handleException(String message, Exception e) throws Exception { LOG.error(message, e); + LogEntries logEntries = driver.manage().logs().get(LogType.BROWSER); + for (LogEntry entry : logEntries) { + LOG.error(new Date(entry.getTimestamp()) + " " + entry.getLevel() + " " + entry.getMessage()); + } File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); LOG.error("ScreenShot::\ndata:image/png;base64," + new String(Base64.encodeBase64(FileUtils.readFileToByteArray(scrFile)))); throw e; diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index 21a17b221de..591705abf54 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -435,7 +435,7 @@ angular.module('zeppelinWebApp') if (statusChanged || resultRefreshed) { // when last paragraph runs, zeppelin automatically appends new paragraph. // this broadcast will focus to the newly inserted paragraph - var paragraphs = angular.element('div[id$="_paragraphColumn_main"'); + var paragraphs = angular.element('div[id$="_paragraphColumn_main"]'); if (paragraphs.length >= 2 && paragraphs[paragraphs.length-2].id.startsWith($scope.paragraph.id)) { // rendering output can took some time. So delay scrolling event firing for sometime. setTimeout(function() { @@ -443,7 +443,6 @@ angular.module('zeppelinWebApp') }, 500); } } - } }); @@ -523,7 +522,7 @@ angular.module('zeppelinWebApp') }; $scope.removeParagraph = function() { - var paragraphs = angular.element('div[id$="_paragraphColumn_main"'); + var paragraphs = angular.element('div[id$="_paragraphColumn_main"]'); if (paragraphs[paragraphs.length-1].id.startsWith($scope.paragraph.id)) { BootstrapDialog.alert({ closable: true, @@ -905,7 +904,7 @@ angular.module('zeppelinWebApp') $rootScope.$on('scrollToCursor', function(event) { // scroll on 'scrollToCursor' event only when cursor is in the last paragraph - var paragraphs = angular.element('div[id$="_paragraphColumn_main"'); + var paragraphs = angular.element('div[id$="_paragraphColumn_main"]'); if (paragraphs[paragraphs.length-1].id.startsWith($scope.paragraph.id)) { $scope.scrollToCursor($scope.paragraph.id, 0); }