public void hoverAndViewStudentPhotoOnBody(int panelBodyIndex, String urlRegex) throws Exception {
    String idOfPanelBody = "panelBodyCollapse-" + panelBodyIndex;
    WebElement photoLink =
        browser
            .driver
            .findElements(By.cssSelector('#' + idOfPanelBody + "> .panel-body > .row"))
            .get(0)
            .findElements(By.className("profile-pic-icon-hover"))
            .get(0);
    Actions actions = new Actions(browser.driver);
    actions.moveToElement(photoLink).perform();

    waitForElementPresence(By.cssSelector(".popover-content > img"));
    ThreadHelper.waitFor(500);

    AssertHelper.assertContainsRegex(
        urlRegex,
        browser
            .driver
            .findElements(By.cssSelector(".popover-content > img"))
            .get(0)
            .getAttribute("src"));

    JavascriptExecutor jsExecutor = (JavascriptExecutor) browser.driver;
    jsExecutor.executeScript(
        "document.getElementsByClassName('popover')[0].parentNode.removeChild(document.getElementsByClassName('popover')[0])");
  }
  public void verifyParticipantPanelIsCollapsed(int id, int timeToWait) {
    WebElement panel = browser.driver.findElement(By.id("panelBodyCollapse-" + id));

    // Need to wait for the total duration according to the number of collapse/expand intervals
    // between panels before checking final state of the panel
    ThreadHelper.waitFor(timeToWait);
    assertFalse(panel.isDisplayed());
  }
 public static void waitForTaskQueueExecution(int tasks, int buffer) {
   /*
    *  Current rate of task execution is 1/s
    *  Wait for 1 more second to see if erroneous or unwanted tasks
    *  are added too
    */
   ThreadHelper.waitFor((tasks + buffer) * 1000);
 }
  public void editFeedbackResponseComment(String commentIdSuffix, String newCommentText) {
    WebElement commentRow =
        browser.driver.findElement(By.id("responseCommentRow" + commentIdSuffix));
    commentRow.findElements(By.tagName("a")).get(1).click();

    WebElement commentEditForm =
        browser.driver.findElement(By.id("responseCommentEditForm" + commentIdSuffix));
    fillTextBox(commentEditForm.findElement(By.name("responsecommenttext")), newCommentText);
    commentEditForm
        .findElement(By.className("col-sm-offset-5"))
        .findElement(By.tagName("a"))
        .click();
    ThreadHelper.waitFor(1000);
  }
 public void clickVisibilityOptionForResponseCommentAndSave(
     String idString, int numOfTheCheckbox) {
   String idSuffix = idString.substring(18);
   WebElement commentRow = browser.driver.findElement(By.id(idString));
   commentRow.findElements(By.tagName("a")).get(1).click();
   WebElement commentEditForm =
       browser.driver.findElement(By.id("responseCommentEditForm" + idSuffix));
   commentRow.findElement(By.id("frComment-visibility-options-trigger" + idSuffix)).click();
   commentRow.findElements(By.cssSelector("input[type='checkbox']")).get(numOfTheCheckbox).click();
   commentEditForm
       .findElement(By.className("col-sm-offset-5"))
       .findElement(By.tagName("a"))
       .click();
   ThreadHelper.waitFor(1000);
 }
  public boolean verifyAllResultsPanelBodyVisibility(boolean visible) {
    int numOfQns =
        browser.driver.findElements(By.cssSelector(".panel-heading+.panel-collapse")).size();
    assertTrue(numOfQns > 0);

    // Wait for the total duration according to the number of collapse/expand intervals between
    // questions
    ThreadHelper.waitFor((numOfQns * 50) + 1000);

    for (WebElement e :
        browser.driver.findElements(By.cssSelector(".panel-heading+.panel-collapse"))) {
      if (e.isDisplayed() != visible) {
        return false;
      }
    }
    return true;
  }
 public void waitForPanelsToCollapse() {
   List<WebElement> panelBodies =
       browser.driver.findElements(By.cssSelector("div[id^='panelBodyCollapse-']"));
   waitForElementsVisibility(panelBodies);
   ThreadHelper.waitFor(1000);
 }
 public void deleteFeedbackResponseComment(String commentIdSuffix) {
   WebElement commentRow =
       browser.driver.findElement(By.id("responseCommentRow" + commentIdSuffix));
   commentRow.findElement(By.tagName("form")).findElement(By.tagName("a")).click();
   ThreadHelper.waitFor(1500);
 }
 // TODO: rename course-add-eval-for-test
 public InstructorFeedbacksPage clickCourseAddEvaluationLink(String courseId) {
   getCourseLinkInRow("course-add-eval-for-test", getCourseRowId(courseId)).click();
   waitForPageToLoad();
   ThreadHelper.waitBriefly();
   return changePageType(InstructorFeedbacksPage.class);
 }
 public void clickRemindParticularUsersLink(String courseId, String evalName) {
   getRemindParticularUsersLink(courseId, evalName).click();
   ThreadHelper.waitFor(1000);
 }