org.apache.zeppelin.integration.InterpreterModeActionsIT.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.zeppelin.integration.InterpreterModeActionsIT.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.zeppelin.integration;

import org.apache.commons.lang.StringUtils;
import org.apache.zeppelin.CommandExecutor;
import org.apache.zeppelin.ProcessData;
import org.apache.zeppelin.AbstractZeppelinIT;
import org.apache.zeppelin.WebDriverManager;
import org.apache.zeppelin.ZeppelinITUtils;
import org.apache.zeppelin.conf.ZeppelinConfiguration;
import org.hamcrest.CoreMatchers;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ErrorCollector;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.TimeoutException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;

import static org.junit.Assert.assertTrue;

public class InterpreterModeActionsIT extends AbstractZeppelinIT {
    private static final Logger LOG = LoggerFactory.getLogger(InterpreterModeActionsIT.class);

    @Rule
    public ErrorCollector collector = new ErrorCollector();
    static String shiroPath;
    static String authShiro = "[users]\n" + "admin = password1, admin\n" + "user1 = password2, admin\n"
            + "user2 = password3, admin\n" + "[main]\n"
            + "sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager\n"
            + "securityManager.sessionManager = $sessionManager\n"
            + "securityManager.sessionManager.globalSessionTimeout = 86400000\n" + "shiro.loginUrl = /api/login\n"
            + "[roles]\n" + "admin = *\n" + "[urls]\n" + "/api/version = anon\n" + "/api/cluster/address = anon\n"
            + "/** = authc";

    static String originalShiro = "";
    static String interpreterOptionPath = "";
    static String originalInterpreterOption = "";

    static String cmdPsPython = "ps aux | grep 'zeppelin_ipython' | grep -v 'grep' | wc -l";
    static String cmdPsInterpreter = "ps aux | grep 'zeppelin/interpreter/python/*' |"
            + " sed -E '/grep|local-repo/d' | wc -l";

    @BeforeClass
    public static void startUp() {
        try {
            System.setProperty(ZeppelinConfiguration.ConfVars.ZEPPELIN_HOME.getVarName(),
                    new File("../").getAbsolutePath());
            ZeppelinConfiguration conf = ZeppelinConfiguration.create();
            shiroPath = conf.getRelativeDir(String.format("%s/shiro.ini", conf.getConfDir()));
            interpreterOptionPath = conf.getRelativeDir(String.format("%s/interpreter.json", conf.getConfDir()));
            File shiroFile = new File(shiroPath);
            if (shiroFile.exists()) {
                originalShiro = StringUtils.join(FileUtils.readLines(shiroFile, "UTF-8"), "\n");
            }
            FileUtils.write(shiroFile, authShiro, "UTF-8");

            File interpreterOptionFile = new File(interpreterOptionPath);
            if (interpreterOptionFile.exists()) {
                originalInterpreterOption = StringUtils.join(FileUtils.readLines(interpreterOptionFile, "UTF-8"),
                        "\n");
            }
        } catch (IOException e) {
            LOG.error("Error in InterpreterModeActionsIT startUp::", e);
        }
        ZeppelinITUtils.restartZeppelin();
        driver = WebDriverManager.getWebDriver();
    }

    @AfterClass
    public static void tearDown() {
        try {
            if (!StringUtils.isBlank(shiroPath)) {
                File shiroFile = new File(shiroPath);
                if (StringUtils.isBlank(originalShiro)) {
                    FileUtils.deleteQuietly(shiroFile);
                } else {
                    FileUtils.write(shiroFile, originalShiro, "UTF-8");
                }
            }
            if (!StringUtils.isBlank(interpreterOptionPath)) {
                File interpreterOptionFile = new File(interpreterOptionPath);
                if (StringUtils.isBlank(originalInterpreterOption)) {
                    FileUtils.deleteQuietly(interpreterOptionFile);
                } else {
                    FileUtils.write(interpreterOptionFile, originalInterpreterOption, "UTF-8");
                }
            }
        } catch (IOException e) {
            LOG.error("Error in InterpreterModeActionsIT tearDown::", e);
        }
        ZeppelinITUtils.restartZeppelin();
        driver.quit();
    }

    private void authenticationUser(String userName, String password) {
        pollingWait(By.xpath("//div[contains(@class, 'navbar-collapse')]//li//button[contains(.,'Login')]"),
                MAX_BROWSER_TIMEOUT_SEC).click();
        ZeppelinITUtils.sleep(500, false);
        pollingWait(By.xpath("//*[@id='userName']"), MAX_BROWSER_TIMEOUT_SEC).sendKeys(userName);
        pollingWait(By.xpath("//*[@id='password']"), MAX_BROWSER_TIMEOUT_SEC).sendKeys(password);
        pollingWait(By.xpath("//*[@id='loginModalContent']//button[contains(.,'Login')]"), MAX_BROWSER_TIMEOUT_SEC)
                .click();
        ZeppelinITUtils.sleep(1000, false);
    }

    private void logoutUser(String userName) throws URISyntaxException {
        ZeppelinITUtils.sleep(500, false);
        driver.findElement(
                By.xpath("//div[contains(@class, 'navbar-collapse')]//li[contains(.,'" + userName + "')]")).click();
        ZeppelinITUtils.sleep(500, false);
        driver.findElement(By.xpath("//div[contains(@class, 'navbar-collapse')]//li[contains(.,'" + userName
                + "')]//a[@ng-click='navbar.logout()']")).click();
        ZeppelinITUtils.sleep(2000, false);
        if (driver.findElement(By.xpath("//*[@id='loginModal']//div[contains(@class, 'modal-header')]/button"))
                .isDisplayed()) {
            driver.findElement(By.xpath("//*[@id='loginModal']//div[contains(@class, 'modal-header')]/button"))
                    .click();
        }
        driver.get(new URI(driver.getCurrentUrl()).resolve("/#/").toString());
        ZeppelinITUtils.sleep(500, false);
    }

    private void setPythonParagraph(int num, String text) {
        setTextOfParagraph(num, "%python\\n " + text);
        runParagraph(num);
        try {
            waitForParagraph(num, "FINISHED");
        } catch (TimeoutException e) {
            waitForParagraph(num, "ERROR");
            collector.checkThat("Exception in InterpreterModeActionsIT while setPythonParagraph", "ERROR",
                    CoreMatchers.equalTo("FINISHED"));
        }
    }

    @Test
    public void testGloballyAction() throws Exception {
        try {
            //step 1: (admin) login, set 'globally in shared' mode of python interpreter, logout
            InterpreterModeActionsIT interpreterModeActionsIT = new InterpreterModeActionsIT();
            interpreterModeActionsIT.authenticationUser("admin", "password1");
            pollingWait(By.xpath("//div/button[contains(@class, 'nav-btn dropdown-toggle ng-scope')]"),
                    MAX_BROWSER_TIMEOUT_SEC).click();
            clickAndWait(By.xpath("//li/a[contains(@href, '#/interpreter')]"));
            pollingWait(By.xpath("//input[contains(@ng-model, 'searchInterpreter')]"), MAX_BROWSER_TIMEOUT_SEC)
                    .sendKeys("python");
            ZeppelinITUtils.sleep(500, false);
            clickAndWait(By.xpath("//div[contains(@id, 'python')]//button[contains(@ng-click, 'valueform.$show();\n"
                    + "                  copyOriginInterpreterSettingProperties(setting.id)')]"));
            clickAndWait(By.xpath("//div[contains(@id, 'python')]/div[2]/div/div/div[1]/span[1]/button"));
            clickAndWait(By.xpath("//div[contains(@id, 'python')]//li/a[contains(.,'Globally')]"));
            JavascriptExecutor jse = (JavascriptExecutor) driver;
            jse.executeScript("window.scrollBy(0,250)", "");
            ZeppelinITUtils.sleep(500, false);
            clickAndWait(By.xpath("//div[contains(@id, 'python')]//div/form/button[contains(@type, 'submit')]"));
            clickAndWait(By.xpath(
                    "//div[@class='modal-dialog']//div[@class='bootstrap-dialog-footer-buttons']//button[contains(., 'OK')]"));
            clickAndWait(By.xpath("//a[@class='navbar-brand navbar-title'][contains(@href, '#/')]"));
            interpreterModeActionsIT.logoutUser("admin");
            //step 2: (user1) login, create a new note, run two paragraph with 'python', check result, check process, logout
            //paragraph: Check if the result is 'user1' in the second paragraph
            //System: Check if the number of python interpreter process is '1'
            //System: Check if the number of python process is '1'
            interpreterModeActionsIT.authenticationUser("user1", "password2");
            By locator = By
                    .xpath("//div[contains(@class, 'col-md-4')]/div/h5/a[contains(.,'Create new" + " note')]");
            WebElement element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                createNewNote();
            }
            String user1noteId = driver.getCurrentUrl().substring(driver.getCurrentUrl().lastIndexOf("/") + 1);
            waitForParagraph(1, "READY");
            interpreterModeActionsIT.setPythonParagraph(1, "user=\"user1\"");
            waitForParagraph(2, "READY");
            interpreterModeActionsIT.setPythonParagraph(2, "print user");
            collector.checkThat("The output field paragraph contains",
                    driver.findElement(
                            By.xpath(getParagraphXPath(2) + "//div[contains(@class, 'text plainTextContent')]"))
                            .getText(),
                    CoreMatchers.equalTo("user1"));
            String resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsPython, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python process is", resultProcessNum, CoreMatchers.equalTo("1"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsInterpreter, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python interpreter process is", resultProcessNum,
                    CoreMatchers.equalTo("1"));

            interpreterModeActionsIT.logoutUser("user1");

            //step 3: (user2) login, create a new note, run two paragraph with 'python', check result, check process, logout
            //paragraph: Check if the result is 'user2' in the second paragraph
            //System: Check if the number of python interpreter process is '1'
            //System: Check if the number of python process is '1'
            interpreterModeActionsIT.authenticationUser("user2", "password3");
            locator = By.xpath("//div[contains(@class, 'col-md-4')]/div/h5/a[contains(.,'Create new" + " note')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                createNewNote();
            }
            waitForParagraph(1, "READY");
            interpreterModeActionsIT.setPythonParagraph(1, "user=\"user2\"");
            waitForParagraph(2, "READY");
            interpreterModeActionsIT.setPythonParagraph(2, "print user");
            collector.checkThat("The output field paragraph contains",
                    driver.findElement(
                            By.xpath(getParagraphXPath(2) + "//div[contains(@class, 'text plainTextContent')]"))
                            .getText(),
                    CoreMatchers.equalTo("user2"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsPython, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python process is", resultProcessNum, CoreMatchers.equalTo("1"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsInterpreter, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python interpreter process is", resultProcessNum,
                    CoreMatchers.equalTo("1"));
            interpreterModeActionsIT.logoutUser("user2");

            //step 4: (user1) login, come back note user1 made, run second paragraph, check result, check process,
            //restart python interpreter, check process again, logout
            //paragraph: Check if the result is 'user2' in the second paragraph
            //System: Check if the number of python interpreter process is '1'
            //System: Check if the number of python process is '1'
            interpreterModeActionsIT.authenticationUser("user1", "password2");
            locator = By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user1noteId + "')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                pollingWait(By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user1noteId + "')]"),
                        MAX_BROWSER_TIMEOUT_SEC).click();
            }
            waitForParagraph(2, "FINISHED");
            runParagraph(2);
            try {
                waitForParagraph(2, "FINISHED");
            } catch (TimeoutException e) {
                waitForParagraph(2, "ERROR");
                collector.checkThat("Exception in InterpreterModeActionsIT while running Python Paragraph", "ERROR",
                        CoreMatchers.equalTo("FINISHED"));
            }
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsPython, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python process is", resultProcessNum, CoreMatchers.equalTo("1"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsInterpreter, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python interpreter process is", resultProcessNum,
                    CoreMatchers.equalTo("1"));

            clickAndWait(By.xpath("//*[@id='actionbar']//span[contains(@uib-tooltip, 'Interpreter binding')]"));
            clickAndWait(
                    By.xpath("//div[@data-ng-repeat='item in interpreterBindings' and contains(., 'python')]//a"));
            clickAndWait(By.xpath(
                    "//div[@class='modal-dialog']" + "[contains(.,'Do you want to restart python interpreter?')]"
                            + "//div[@class='bootstrap-dialog-footer-buttons']//button[contains(., 'OK')]"));
            locator = By.xpath(
                    "//div[@class='modal-dialog'][contains(.,'Do you want to restart python interpreter?')]");
            LOG.info("Holding on until if interpreter restart dialog is disappeared or not testGloballyAction");
            boolean invisibilityStatus = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.invisibilityOfElementLocated(locator));
            if (invisibilityStatus == false) {
                assertTrue("interpreter setting dialog visibility status", invisibilityStatus);
            }
            locator = By.xpath("//*[@id='actionbar']//span[contains(@uib-tooltip, 'Interpreter binding')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                clickAndWait(By.xpath("//*[@id='actionbar']//span[contains(@uib-tooltip, 'Interpreter binding')]"));
            }
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsPython, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python process is", resultProcessNum, CoreMatchers.equalTo("0"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsInterpreter, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python interpreter process is", resultProcessNum,
                    CoreMatchers.equalTo("0"));
            interpreterModeActionsIT.logoutUser("user1");
        } catch (Exception e) {
            handleException("Exception in InterpreterModeActionsIT while testGloballyAction ", e);
        }
    }

    @Test
    public void testPerUserScopedAction() throws Exception {
        try {
            //step 1: (admin) login, set 'Per user in scoped' mode of python interpreter, logout
            InterpreterModeActionsIT interpreterModeActionsIT = new InterpreterModeActionsIT();
            interpreterModeActionsIT.authenticationUser("admin", "password1");
            pollingWait(By.xpath("//div/button[contains(@class, 'nav-btn dropdown-toggle ng-scope')]"),
                    MAX_BROWSER_TIMEOUT_SEC).click();

            clickAndWait(By.xpath("//li/a[contains(@href, '#/interpreter')]"));
            pollingWait(By.xpath("//input[contains(@ng-model, 'searchInterpreter')]"), MAX_BROWSER_TIMEOUT_SEC)
                    .sendKeys("python");
            ZeppelinITUtils.sleep(500, false);

            clickAndWait(By.xpath("//div[contains(@id, 'python')]//button[contains(@ng-click, 'valueform.$show();\n"
                    + "                  copyOriginInterpreterSettingProperties(setting.id)')]"));
            clickAndWait(By.xpath("//div[contains(@id, 'python')]/div[2]/div/div/div[1]/span[1]/button"));
            clickAndWait(By.xpath("//div[contains(@id, 'python')]//li/a[contains(.,'Per User')]"));
            clickAndWait(By.xpath("//div[contains(@id, 'python')]/div[2]/div/div/div[1]/span[2]/button"));
            clickAndWait(By.xpath("//div[contains(@id, 'python')]//li/a[contains(.,'scoped per user')]"));

            JavascriptExecutor jse = (JavascriptExecutor) driver;
            jse.executeScript("window.scrollBy(0,250)", "");
            ZeppelinITUtils.sleep(500, false);
            clickAndWait(By.xpath("//div[contains(@id, 'python')]//div/form/button[contains(@type, 'submit')]"));
            clickAndWait(By.xpath(
                    "//div[@class='modal-dialog']//div[@class='bootstrap-dialog-footer-buttons']//button[contains(., 'OK')]"));
            clickAndWait(By.xpath("//a[@class='navbar-brand navbar-title'][contains(@href, '#/')]"));

            interpreterModeActionsIT.logoutUser("admin");

            //step 2: (user1) login, create a new note, run two paragraph with 'python', check result, check process, logout
            //paragraph: Check if the result is 'user1' in the second paragraph
            //System: Check if the number of python interpreter process is '1'
            //System: Check if the number of python process is '1'
            interpreterModeActionsIT.authenticationUser("user1", "password2");
            By locator = By
                    .xpath("//div[contains(@class, 'col-md-4')]/div/h5/a[contains(.,'Create new" + " note')]");
            WebElement element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                createNewNote();
            }
            String user1noteId = driver.getCurrentUrl().substring(driver.getCurrentUrl().lastIndexOf("/") + 1);

            waitForParagraph(1, "READY");
            interpreterModeActionsIT.setPythonParagraph(1, "user=\"user1\"");
            waitForParagraph(2, "READY");
            interpreterModeActionsIT.setPythonParagraph(2, "print user");

            collector.checkThat("The output field paragraph contains",
                    driver.findElement(
                            By.xpath(getParagraphXPath(2) + "//div[contains(@class, 'text plainTextContent')]"))
                            .getText(),
                    CoreMatchers.equalTo("user1"));

            String resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsPython, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python process is", resultProcessNum, CoreMatchers.equalTo("1"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsInterpreter, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python interpreter process is", resultProcessNum,
                    CoreMatchers.equalTo("1"));
            interpreterModeActionsIT.logoutUser("user1");

            //step 3: (user2) login, create a new note, run two paragraph with 'python', check result, check process, logout
            //                paragraph: Check if the result is 'user2' in the second paragraph
            //System: Check if the number of python interpreter process is '1'
            //System: Check if the number of python process is '2'
            interpreterModeActionsIT.authenticationUser("user2", "password3");
            locator = By.xpath("//div[contains(@class, 'col-md-4')]/div/h5/a[contains(.,'Create new" + " note')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                createNewNote();
            }
            String user2noteId = driver.getCurrentUrl().substring(driver.getCurrentUrl().lastIndexOf("/") + 1);
            waitForParagraph(1, "READY");
            interpreterModeActionsIT.setPythonParagraph(1, "user=\"user2\"");
            waitForParagraph(2, "READY");
            interpreterModeActionsIT.setPythonParagraph(2, "print user");
            collector.checkThat("The output field paragraph contains",
                    driver.findElement(
                            By.xpath(getParagraphXPath(2) + "//div[contains(@class, 'text plainTextContent')]"))
                            .getText(),
                    CoreMatchers.equalTo("user2"));

            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsPython, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python process is", resultProcessNum, CoreMatchers.equalTo("2"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsInterpreter, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python interpreter process is", resultProcessNum,
                    CoreMatchers.equalTo("1"));
            interpreterModeActionsIT.logoutUser("user2");

            //step 4: (user1) login, come back note user1 made, run second paragraph, check result,
            //                restart python interpreter in note, check process again, logout
            //paragraph: Check if the result is 'user1' in the second paragraph
            //System: Check if the number of python interpreter process is '1'
            //System: Check if the number of python process is '1'
            interpreterModeActionsIT.authenticationUser("user1", "password2");
            locator = By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user1noteId + "')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                pollingWait(By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user1noteId + "')]"),
                        MAX_BROWSER_TIMEOUT_SEC).click();
            }
            runParagraph(2);
            try {
                waitForParagraph(2, "FINISHED");
            } catch (TimeoutException e) {
                waitForParagraph(2, "ERROR");
                collector.checkThat("Exception in InterpreterModeActionsIT while running Python Paragraph", "ERROR",
                        CoreMatchers.equalTo("FINISHED"));
            }
            collector.checkThat("The output field paragraph contains",
                    driver.findElement(
                            By.xpath(getParagraphXPath(2) + "//div[contains(@class, 'text plainTextContent')]"))
                            .getText(),
                    CoreMatchers.equalTo("user1"));

            clickAndWait(By.xpath("//*[@id='actionbar']//span[contains(@uib-tooltip, 'Interpreter binding')]"));
            clickAndWait(
                    By.xpath("//div[@data-ng-repeat='item in interpreterBindings' and contains(., 'python')]//a"));
            clickAndWait(By.xpath(
                    "//div[@class='modal-dialog']" + "[contains(.,'Do you want to restart python interpreter?')]"
                            + "//div[@class='bootstrap-dialog-footer-buttons']//button[contains(., 'OK')]"));
            locator = By.xpath(
                    "//div[@class='modal-dialog'][contains(.,'Do you want to restart python interpreter?')]");
            LOG.info(
                    "Holding on until if interpreter restart dialog is disappeared or not in testPerUserScopedAction");
            boolean invisibilityStatus = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.invisibilityOfElementLocated(locator));
            if (invisibilityStatus == false) {
                assertTrue("interpreter setting dialog visibility status", invisibilityStatus);
            }
            locator = By.xpath("//*[@id='actionbar']//span[contains(@uib-tooltip, 'Interpreter binding')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                clickAndWait(By.xpath("//*[@id='actionbar']//span[contains(@uib-tooltip, 'Interpreter binding')]"));
            }

            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsPython, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python process is", resultProcessNum, CoreMatchers.equalTo("1"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsInterpreter, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python interpreter process is", resultProcessNum,
                    CoreMatchers.equalTo("1"));
            interpreterModeActionsIT.logoutUser("user1");

            //step 5: (user2) login, come back note user2 made, restart python interpreter in note, check process, logout
            //System: Check if the number of python interpreter process is '0'
            //System: Check if the number of python process is '0'
            interpreterModeActionsIT.authenticationUser("user2", "password3");
            locator = By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user2noteId + "')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                pollingWait(By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user2noteId + "')]"),
                        MAX_BROWSER_TIMEOUT_SEC).click();
            }
            clickAndWait(By.xpath("//*[@id='actionbar']//span[contains(@uib-tooltip, 'Interpreter binding')]"));
            clickAndWait(
                    By.xpath("//div[@data-ng-repeat='item in interpreterBindings' and contains(., 'python')]//a"));
            clickAndWait(By.xpath(
                    "//div[@class='modal-dialog']" + "[contains(.,'Do you want to restart python interpreter?')]"
                            + "//div[@class='bootstrap-dialog-footer-buttons']//button[contains(., 'OK')]"));
            locator = By.xpath(
                    "//div[@class='modal-dialog'][contains(.,'Do you want to restart python interpreter?')]");
            LOG.info(
                    "Holding on until if interpreter restart dialog is disappeared or not in testPerUserScopedAction");
            invisibilityStatus = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.invisibilityOfElementLocated(locator));
            if (invisibilityStatus == false) {
                assertTrue("interpreter setting dialog visibility status", invisibilityStatus);
            }
            locator = By.xpath("//*[@id='actionbar']//span[contains(@uib-tooltip, 'Interpreter binding')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                clickAndWait(By.xpath("//*[@id='actionbar']//span[contains(@uib-tooltip, 'Interpreter binding')]"));
            }

            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsPython, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python process is", resultProcessNum, CoreMatchers.equalTo("0"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsInterpreter, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python interpreter process is", resultProcessNum,
                    CoreMatchers.equalTo("0"));
            interpreterModeActionsIT.logoutUser("user2");

            //step 6: (user1) login, come back note user1 made, run first paragraph,logout
            //        (user2) login, come back note user2 made, run first paragraph, check process, logout
            //System: Check if the number of python process is '2'
            //System: Check if the number of python interpreter process is '1'
            interpreterModeActionsIT.authenticationUser("user1", "password2");
            locator = By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user1noteId + "')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                pollingWait(By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user1noteId + "')]"),
                        MAX_BROWSER_TIMEOUT_SEC).click();
            }
            waitForParagraph(1, "FINISHED");
            runParagraph(1);
            try {
                waitForParagraph(1, "FINISHED");
            } catch (TimeoutException e) {
                waitForParagraph(1, "ERROR");
                collector.checkThat("Exception in InterpreterModeActionsIT while running Python Paragraph", "ERROR",
                        CoreMatchers.equalTo("FINISHED"));
            }
            interpreterModeActionsIT.logoutUser("user1");

            interpreterModeActionsIT.authenticationUser("user2", "password3");
            locator = By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user2noteId + "')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                pollingWait(By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user2noteId + "')]"),
                        MAX_BROWSER_TIMEOUT_SEC).click();
            }
            runParagraph(1);
            try {
                waitForParagraph(1, "FINISHED");
            } catch (TimeoutException e) {
                waitForParagraph(1, "ERROR");
                collector.checkThat("Exception in InterpreterModeActionsIT while running Python Paragraph", "ERROR",
                        CoreMatchers.equalTo("FINISHED"));
            }
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsPython, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python process is", resultProcessNum, CoreMatchers.equalTo("2"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsInterpreter, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python interpreter process is", resultProcessNum,
                    CoreMatchers.equalTo("1"));
            interpreterModeActionsIT.logoutUser("user2");

            //step 7: (admin) login, restart python interpreter in interpreter tab, check process, logout
            //System: Check if the number of python interpreter process is 0
            //System: Check if the number of python process is 0
            interpreterModeActionsIT.authenticationUser("admin", "password1");
            pollingWait(By.xpath("//div/button[contains(@class, 'nav-btn dropdown-toggle ng-scope')]"),
                    MAX_BROWSER_TIMEOUT_SEC).click();

            clickAndWait(By.xpath("//li/a[contains(@href, '#/interpreter')]"));
            pollingWait(By.xpath("//input[contains(@ng-model, 'searchInterpreter')]"), MAX_BROWSER_TIMEOUT_SEC)
                    .sendKeys("python");
            ZeppelinITUtils.sleep(500, false);

            clickAndWait(By.xpath("//div[contains(@id, 'python')]"
                    + "//button[contains(@ng-click, 'restartInterpreterSetting(setting.id)')]"));
            clickAndWait(By.xpath(
                    "//div[@class='modal-dialog']" + "[contains(.,'Do you want to restart this interpreter?')]"
                            + "//div[@class='bootstrap-dialog-footer-buttons']//button[contains(., 'OK')]"));
            locator = By.xpath(
                    "//div[@class='modal-dialog'][contains(.,'Do you want to restart python interpreter?')]");
            LOG.info(
                    "Holding on until if interpreter restart dialog is disappeared or not in testPerUserScopedAction");
            invisibilityStatus = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.invisibilityOfElementLocated(locator));
            if (invisibilityStatus == false) {
                assertTrue("interpreter setting dialog visibility status", invisibilityStatus);
            }

            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsPython, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python process is", resultProcessNum, CoreMatchers.equalTo("0"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsInterpreter, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python interpreter process is", resultProcessNum,
                    CoreMatchers.equalTo("0"));

            interpreterModeActionsIT.logoutUser("admin");

        } catch (Exception e) {
            handleException("Exception in InterpreterModeActionsIT while testPerUserScopedAction ", e);
        }
    }

    @Test
    public void testPerUserIsolatedAction() throws Exception {
        try {
            //step 1: (admin) login, set 'Per user in isolated' mode of python interpreter, logout
            InterpreterModeActionsIT interpreterModeActionsIT = new InterpreterModeActionsIT();
            interpreterModeActionsIT.authenticationUser("admin", "password1");
            pollingWait(By.xpath("//div/button[contains(@class, 'nav-btn dropdown-toggle ng-scope')]"),
                    MAX_BROWSER_TIMEOUT_SEC).click();
            clickAndWait(By.xpath("//li/a[contains(@href, '#/interpreter')]"));
            pollingWait(By.xpath("//input[contains(@ng-model, 'searchInterpreter')]"), MAX_BROWSER_TIMEOUT_SEC)
                    .sendKeys("python");
            ZeppelinITUtils.sleep(500, false);
            clickAndWait(By.xpath("//div[contains(@id, 'python')]//button[contains(@ng-click, 'valueform.$show();\n"
                    + "                  copyOriginInterpreterSettingProperties(setting.id)')]"));
            clickAndWait(By.xpath("//div[contains(@id, 'python')]/div[2]/div/div/div[1]/span[1]/button"));
            clickAndWait(By.xpath("//div[contains(@id, 'python')]//li/a[contains(.,'Per User')]"));
            clickAndWait(By.xpath("//div[contains(@id, 'python')]/div[2]/div/div/div[1]/span[2]/button"));
            clickAndWait(By.xpath("//div[contains(@id, 'python')]//li/a[contains(.,'isolated per user')]"));
            JavascriptExecutor jse = (JavascriptExecutor) driver;
            jse.executeScript("window.scrollBy(0,250)", "");
            ZeppelinITUtils.sleep(500, false);
            clickAndWait(By.xpath("//div[contains(@id, 'python')]//div/form/button[contains(@type, 'submit')]"));
            clickAndWait(By.xpath(
                    "//div[@class='modal-dialog']//div[@class='bootstrap-dialog-footer-buttons']//button[contains(., 'OK')]"));
            clickAndWait(By.xpath("//a[@class='navbar-brand navbar-title'][contains(@href, '#/')]"));
            interpreterModeActionsIT.logoutUser("admin");

            //step 2: (user1) login, create a new note, run two paragraph with 'python', check result, check process, logout
            //paragraph: Check if the result is 'user1' in the second paragraph
            //System: Check if the number of python interpreter process is '1'
            //System: Check if the number of python process is '1'
            interpreterModeActionsIT.authenticationUser("user1", "password2");
            By locator = By
                    .xpath("//div[contains(@class, 'col-md-4')]/div/h5/a[contains(.,'Create new" + " note')]");
            WebElement element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                createNewNote();
            }
            String user1noteId = driver.getCurrentUrl().substring(driver.getCurrentUrl().lastIndexOf("/") + 1);
            waitForParagraph(1, "READY");
            interpreterModeActionsIT.setPythonParagraph(1, "user=\"user1\"");
            waitForParagraph(2, "READY");
            interpreterModeActionsIT.setPythonParagraph(2, "print user");

            collector.checkThat("The output field paragraph contains",
                    driver.findElement(
                            By.xpath(getParagraphXPath(2) + "//div[contains(@class, 'text plainTextContent')]"))
                            .getText(),
                    CoreMatchers.equalTo("user1"));

            String resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsPython, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python process is", resultProcessNum, CoreMatchers.equalTo("1"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsInterpreter, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python interpreter process is", resultProcessNum,
                    CoreMatchers.equalTo("1"));
            interpreterModeActionsIT.logoutUser("user1");

            //step 3: (user2) login, create a new note, run two paragraph with 'python', check result, check process, logout
            //                paragraph: Check if the result is 'user2' in the second paragraph
            //System: Check if the number of python interpreter process is '2'
            //System: Check if the number of python process is '2'
            interpreterModeActionsIT.authenticationUser("user2", "password3");
            locator = By.xpath("//div[contains(@class, 'col-md-4')]/div/h5/a[contains(.,'Create new" + " note')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                createNewNote();
            }
            String user2noteId = driver.getCurrentUrl().substring(driver.getCurrentUrl().lastIndexOf("/") + 1);
            waitForParagraph(1, "READY");
            interpreterModeActionsIT.setPythonParagraph(1, "user=\"user2\"");
            waitForParagraph(2, "READY");
            interpreterModeActionsIT.setPythonParagraph(2, "print user");

            collector.checkThat("The output field paragraph contains",
                    driver.findElement(
                            By.xpath(getParagraphXPath(2) + "//div[contains(@class, 'text plainTextContent')]"))
                            .getText(),
                    CoreMatchers.equalTo("user2"));

            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsPython, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python process is", resultProcessNum, CoreMatchers.equalTo("2"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsInterpreter, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python interpreter process is", resultProcessNum,
                    CoreMatchers.equalTo("2"));
            interpreterModeActionsIT.logoutUser("user2");

            //step 4: (user1) login, come back note user1 made, run second paragraph, check result,
            //                restart python interpreter in note, check process again, logout
            //paragraph: Check if the result is 'user1' in the second paragraph
            //System: Check if the number of python interpreter process is '1'
            //System: Check if the number of python process is '1'
            interpreterModeActionsIT.authenticationUser("user1", "password2");
            locator = By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user1noteId + "')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                pollingWait(By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user1noteId + "')]"),
                        MAX_BROWSER_TIMEOUT_SEC).click();
            }
            runParagraph(2);
            try {
                waitForParagraph(2, "FINISHED");
            } catch (TimeoutException e) {
                waitForParagraph(2, "ERROR");
                collector.checkThat("Exception in InterpreterModeActionsIT while running Python Paragraph", "ERROR",
                        CoreMatchers.equalTo("FINISHED"));
            }
            collector.checkThat("The output field paragraph contains",
                    driver.findElement(
                            By.xpath(getParagraphXPath(2) + "//div[contains(@class, 'text plainTextContent')]"))
                            .getText(),
                    CoreMatchers.equalTo("user1"));

            clickAndWait(By.xpath("//*[@id='actionbar']//span[contains(@uib-tooltip, 'Interpreter binding')]"));
            clickAndWait(
                    By.xpath("//div[@data-ng-repeat='item in interpreterBindings' and contains(., 'python')]//a"));
            clickAndWait(By.xpath(
                    "//div[@class='modal-dialog']" + "[contains(.,'Do you want to restart python interpreter?')]"
                            + "//div[@class='bootstrap-dialog-footer-buttons']//button[contains(., 'OK')]"));

            locator = By.xpath(
                    "//div[@class='modal-dialog'][contains(.,'Do you want to restart python interpreter?')]");
            LOG.info(
                    "Holding on until if interpreter restart dialog is disappeared or not in testPerUserIsolatedAction");
            boolean invisibilityStatus = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.invisibilityOfElementLocated(locator));
            if (invisibilityStatus == false) {
                assertTrue("interpreter setting dialog visibility status", invisibilityStatus);
            }
            locator = By.xpath("//*[@id='actionbar']//span[contains(@uib-tooltip, 'Interpreter binding')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                clickAndWait(By.xpath("//*[@id='actionbar']//span[contains(@uib-tooltip, 'Interpreter binding')]"));
            }

            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsPython, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python process is", resultProcessNum, CoreMatchers.equalTo("1"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsInterpreter, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python interpreter process is", resultProcessNum,
                    CoreMatchers.equalTo("1"));
            interpreterModeActionsIT.logoutUser("user1");

            //step 5: (user2) login, come back note user2 made, restart python interpreter in note, check process, logout
            //System: Check if the number of python interpreter process is '0'
            //System: Check if the number of python process is '0'
            interpreterModeActionsIT.authenticationUser("user2", "password3");
            locator = By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user2noteId + "')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                pollingWait(By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user2noteId + "')]"),
                        MAX_BROWSER_TIMEOUT_SEC).click();
            }
            clickAndWait(By.xpath("//*[@id='actionbar']//span[contains(@uib-tooltip, 'Interpreter binding')]"));
            clickAndWait(
                    By.xpath("//div[@data-ng-repeat='item in interpreterBindings' and contains(., 'python')]//a"));
            clickAndWait(By.xpath(
                    "//div[@class='modal-dialog']" + "[contains(.,'Do you want to restart python interpreter?')]"
                            + "//div[@class='bootstrap-dialog-footer-buttons']//button[contains(., 'OK')]"));

            locator = By.xpath(
                    "//div[@class='modal-dialog'][contains(.,'Do you want to restart python interpreter?')]");
            LOG.info(
                    "Holding on until if interpreter restart dialog is disappeared or not in testPerUserIsolatedAction");
            invisibilityStatus = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.invisibilityOfElementLocated(locator));
            if (invisibilityStatus == false) {
                assertTrue("interpreter setting dialog visibility status", invisibilityStatus);
            }
            locator = By.xpath("//*[@id='actionbar']//span[contains(@uib-tooltip, 'Interpreter binding')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                clickAndWait(By.xpath("//*[@id='actionbar']//span[contains(@uib-tooltip, 'Interpreter binding')]"));
            }

            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsPython, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python process is", resultProcessNum, CoreMatchers.equalTo("0"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsInterpreter, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python interpreter process is", resultProcessNum,
                    CoreMatchers.equalTo("0"));
            interpreterModeActionsIT.logoutUser("user2");

            //step 6: (user1) login, come back note user1 made, run first paragraph,logout
            //        (user2) login, come back note user2 made, run first paragraph, check process, logout
            //System: Check if the number of python process is '2'
            //System: Check if the number of python interpreter process is '2'
            interpreterModeActionsIT.authenticationUser("user1", "password2");
            locator = By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user1noteId + "')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                pollingWait(By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user1noteId + "')]"),
                        MAX_BROWSER_TIMEOUT_SEC).click();
            }
            waitForParagraph(1, "FINISHED");
            runParagraph(1);
            try {
                waitForParagraph(1, "FINISHED");
            } catch (TimeoutException e) {
                waitForParagraph(1, "ERROR");
                collector.checkThat("Exception in InterpreterModeActionsIT while running Python Paragraph", "ERROR",
                        CoreMatchers.equalTo("FINISHED"));
            }
            interpreterModeActionsIT.logoutUser("user1");

            interpreterModeActionsIT.authenticationUser("user2", "password3");
            locator = By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user2noteId + "')]");
            element = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.visibilityOfElementLocated(locator));
            if (element.isDisplayed()) {
                pollingWait(By.xpath("//*[@id='notebook-names']//a[contains(@href, '" + user2noteId + "')]"),
                        MAX_BROWSER_TIMEOUT_SEC).click();
            }
            runParagraph(1);
            try {
                waitForParagraph(1, "FINISHED");
            } catch (TimeoutException e) {
                waitForParagraph(1, "ERROR");
                collector.checkThat("Exception in InterpreterModeActionsIT while running Python Paragraph", "ERROR",
                        CoreMatchers.equalTo("FINISHED"));
            }
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsPython, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python process is", resultProcessNum, CoreMatchers.equalTo("2"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsInterpreter, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python interpreter process is", resultProcessNum,
                    CoreMatchers.equalTo("2"));
            interpreterModeActionsIT.logoutUser("user2");

            //step 7: (admin) login, restart python interpreter in interpreter tab, check process, logout
            //System: Check if the number of python interpreter process is 0
            //System: Check if the number of python process is 0
            interpreterModeActionsIT.authenticationUser("admin", "password1");
            pollingWait(By.xpath("//div/button[contains(@class, 'nav-btn dropdown-toggle ng-scope')]"),
                    MAX_BROWSER_TIMEOUT_SEC).click();

            clickAndWait(By.xpath("//li/a[contains(@href, '#/interpreter')]"));
            pollingWait(By.xpath("//input[contains(@ng-model, 'searchInterpreter')]"), MAX_BROWSER_TIMEOUT_SEC)
                    .sendKeys("python");
            ZeppelinITUtils.sleep(500, false);

            clickAndWait(By.xpath("//div[contains(@id, 'python')]"
                    + "//button[contains(@ng-click, 'restartInterpreterSetting(setting.id)')]"));
            clickAndWait(By.xpath(
                    "//div[@class='modal-dialog']" + "[contains(.,'Do you want to restart this interpreter?')]"
                            + "//div[@class='bootstrap-dialog-footer-buttons']//button[contains(., 'OK')]"));
            locator = By.xpath(
                    "//div[@class='modal-dialog'][contains(.,'Do you want to restart python interpreter?')]");
            LOG.info(
                    "Holding on until if interpreter restart dialog is disappeared or not in testPerUserIsolatedAction");
            invisibilityStatus = (new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC))
                    .until(ExpectedConditions.invisibilityOfElementLocated(locator));
            if (invisibilityStatus == false) {
                assertTrue("interpreter setting dialog visibility status", invisibilityStatus);
            }

            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsPython, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python process is", resultProcessNum, CoreMatchers.equalTo("0"));
            resultProcessNum = (String) CommandExecutor.executeCommandLocalHost(cmdPsInterpreter, false,
                    ProcessData.Types_Of_Data.OUTPUT);
            resultProcessNum = resultProcessNum.trim().replaceAll("\n", "");
            collector.checkThat("The number of python interpreter process is", resultProcessNum,
                    CoreMatchers.equalTo("0"));
            interpreterModeActionsIT.logoutUser("admin");
        } catch (Exception e) {
            handleException("Exception in InterpreterModeActionsIT while testPerUserIsolatedAction ", e);
        }
    }
}