/*  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.portals.pluto.demo.integration.test;

import org.apache.portals.pluto.test.utilities.SimpleTestDriver;
import org.junit.BeforeClass;

/**
 *
 * @author Kyle Stiemann
 */
public class DemoTestDriver extends SimpleTestDriver {

   protected static WaitingAsserter waitingAsserter;

   @BeforeClass
   public static void setUpBeforeDemoSimpleTestDriverClass() {

      if (waitingAsserter == null) {
         waitingAsserter = new WaitingAsserter(driver, timeout);
      }
   }

   protected void navigateToPage(String pageName) {
      driver.get(baseUrl + Util.encodeURL(pageName));
   }
}
