diff --git a/.classpath b/.classpath deleted file mode 100644 index 51dcef05b..000000000 --- a/.classpath +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.gitignore b/.gitignore index 8a63de2ca..48992b2c5 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,7 @@ build/zap-exts/ *.iml node_modules/ dist/ +/.gradle/ +/buildGradle/ +/.classpath +/.project diff --git a/.project b/.project deleted file mode 100644 index e36fe3851..000000000 --- a/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - zap-hud - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/.settings/org.eclipse.buildship.core.prefs b/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 000000000..e8895216f --- /dev/null +++ b/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,2 @@ +connection.project.dir= +eclipse.preferences.version=1 diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 000000000..3f73dd01a --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,38 @@ +plugins { + `java-library` +} + +repositories { + mavenCentral() +} + +buildDir = file("buildGradle") + +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +sourceSets["main"].java.srcDirs(file("src")) +sourceSets["test"].java.srcDirs(file("test")) + +val libs = fileTree("lib").matching { include("*.jar") } + +val jupiterVersion = "5.3.1" + +dependencies { + implementation(files(libs.getFiles())) + + testImplementation("org.junit.jupiter:junit-jupiter-api:$jupiterVersion") + testImplementation("org.junit.jupiter:junit-jupiter-params:$jupiterVersion") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$jupiterVersion") + + // Support old JUnit4 tests. + // testImplementation("org.junit.vintage:junit-vintage-engine:$jupiterVersion") + + testImplementation("io.github.bonigarcia:selenium-jupiter:2.2.0") +} + +tasks.withType().configureEach { + useJUnitPlatform() +} diff --git a/build/build.xml b/build/build.xml index 427a875e6..da560a86e 100644 --- a/build/build.xml +++ b/build/build.xml @@ -90,6 +90,7 @@ + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..29953ea14 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..e0b3fb8d7 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 000000000..cccdd3d51 --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/lib/websocket-release-15.zap b/lib/websocket-release-15.jar similarity index 100% rename from lib/websocket-release-15.zap rename to lib/websocket-release-15.jar diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 000000000..ba02f10be --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "zap-hud" \ No newline at end of file diff --git a/src/org/zaproxy/zap/extension/hud/HudBrowserTestThread.java b/src/org/zaproxy/zap/extension/hud/HudBrowserTestThread.java index 2ce20f79a..54cb69b57 100644 --- a/src/org/zaproxy/zap/extension/hud/HudBrowserTestThread.java +++ b/src/org/zaproxy/zap/extension/hud/HudBrowserTestThread.java @@ -107,7 +107,7 @@ private void testUrl(WebDriver wd, String url) { if (panel == null) { this.fails.add(url + " : Failed to find left panel"); } else { - wd.switchTo().frame(wd.findElement(By.id("left-panel"))); + wd.switchTo().frame((WebElement)wd.findElement(By.id("left-panel"))); List buttons = null; for (int i=0; i < 10; i++) { buttons = wd.findElements(By.className("hud-button")); diff --git a/test/org/zaproxy/zap/extension/hud/HtmlEditorUnitTest.java b/test/org/zaproxy/zap/extension/hud/HtmlEditorUnitTest.java index fa20407c4..3e3cfc93a 100644 --- a/test/org/zaproxy/zap/extension/hud/HtmlEditorUnitTest.java +++ b/test/org/zaproxy/zap/extension/hud/HtmlEditorUnitTest.java @@ -19,10 +19,10 @@ */ package org.zaproxy.zap.extension.hud; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.parosproxy.paros.network.HttpMessage; /** diff --git a/test/org/zaproxy/zap/extension/hud/ui/generic/LeftPanelUnitTest.java b/test/org/zaproxy/zap/extension/hud/ui/generic/LeftPanelUnitTest.java new file mode 100644 index 000000000..7f185cd6e --- /dev/null +++ b/test/org/zaproxy/zap/extension/hud/ui/generic/LeftPanelUnitTest.java @@ -0,0 +1,56 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2018 The ZAP Development Team + * + * Licensed 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.zaproxy.zap.extension.hud.ui.generic; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.util.List; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.zaproxy.zap.extension.hud.ui.uimap.HUD; + +public class LeftPanelUnitTest { + + public LeftPanelUnitTest() { + } + + public static void runAllTests(WebDriver wd) { + testLeftPanelLoads(wd); + testLeftContainsExpectedButtons(wd); + } + + public static void testLeftPanelLoads(WebDriver wd) { + HUD hud = new HUD(wd); + assertNotNull(hud.waitForLeftPanel()); + } + + public static void testLeftContainsExpectedButtons(WebDriver wd) { + HUD hud = new HUD(wd); + WebElement panel = hud.waitForLeftPanel(); + assertNotNull(panel); + wd.switchTo().frame(panel); + List buttons = hud.getHudButtons(); + assertEquals(9, buttons.size()); + wd.switchTo().parentFrame(); + } + +} diff --git a/test/org/zaproxy/zap/extension/hud/ui/generic/RightPanelUnitTest.java b/test/org/zaproxy/zap/extension/hud/ui/generic/RightPanelUnitTest.java new file mode 100644 index 000000000..e96ddd629 --- /dev/null +++ b/test/org/zaproxy/zap/extension/hud/ui/generic/RightPanelUnitTest.java @@ -0,0 +1,56 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2018 The ZAP Development Team + * + * Licensed 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.zaproxy.zap.extension.hud.ui.generic; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.util.List; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.zaproxy.zap.extension.hud.ui.uimap.HUD; + +public class RightPanelUnitTest { + + public RightPanelUnitTest() { + } + + public static void runAllTests(WebDriver wd) { + testRightPanelLoads(wd); + testRightContainsExpectedButtons(wd); + } + + public static void testRightPanelLoads(WebDriver wd) { + HUD hud = new HUD(wd); + assertNotNull(hud.waitForRightPanel()); + } + + public static void testRightContainsExpectedButtons(WebDriver wd) { + HUD hud = new HUD(wd); + WebElement panel = hud.waitForRightPanel(); + assertNotNull(panel); + wd.switchTo().frame(panel); + List buttons = hud.getHudButtons(); + assertEquals(9, buttons.size()); + wd.switchTo().parentFrame(); + } + +} diff --git a/test/org/zaproxy/zap/extension/hud/ui/specific/ExampleDotComChromeUnitTest.java b/test/org/zaproxy/zap/extension/hud/ui/specific/ExampleDotComChromeUnitTest.java new file mode 100644 index 000000000..6c60eb734 --- /dev/null +++ b/test/org/zaproxy/zap/extension/hud/ui/specific/ExampleDotComChromeUnitTest.java @@ -0,0 +1,64 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2018 The ZAP Development Team + * + * Licensed 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.zaproxy.zap.extension.hud.ui.specific; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.openqa.selenium.Proxy; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.remote.CapabilityType; +import org.zaproxy.zap.extension.hud.ui.generic.LeftPanelUnitTest; +import org.zaproxy.zap.extension.hud.ui.generic.RightPanelUnitTest; + +import io.github.bonigarcia.Options; +import io.github.bonigarcia.SeleniumExtension; + +@ExtendWith(SeleniumExtension.class) +public class ExampleDotComChromeUnitTest { + + static final String TARGET = "https://www.example.com"; + // TODO parameterise the host:port + static final String PROXY = "localhost:8090"; + + @Options + ChromeOptions chromeOptions = new ChromeOptions(); + { + Proxy proxy = new Proxy(); + proxy.setHttpProxy(PROXY) + .setFtpProxy(PROXY) + .setSslProxy(PROXY); + + chromeOptions.setCapability(CapabilityType.PROXY, proxy); + chromeOptions.setCapability("acceptInsecureCerts",true); + } + + @Test + public void frameUnitTests(ChromeDriver driver) throws InterruptedException { + driver.get(TARGET); + // TODO why doesnt this load the HUD straight away? + Thread.sleep(2000); + driver.get(TARGET); + + LeftPanelUnitTest.runAllTests(driver); + RightPanelUnitTest.runAllTests(driver); + // TODO add more tests + } +} diff --git a/test/org/zaproxy/zap/extension/hud/ui/specific/ExampleDotComFirefoxUnitTest.java b/test/org/zaproxy/zap/extension/hud/ui/specific/ExampleDotComFirefoxUnitTest.java new file mode 100644 index 000000000..43d3143b6 --- /dev/null +++ b/test/org/zaproxy/zap/extension/hud/ui/specific/ExampleDotComFirefoxUnitTest.java @@ -0,0 +1,72 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2018 The ZAP Development Team + * + * Licensed 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.zaproxy.zap.extension.hud.ui.specific; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.openqa.selenium.Proxy; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxOptions; +import org.openqa.selenium.remote.CapabilityType; +import org.zaproxy.zap.extension.hud.ui.generic.LeftPanelUnitTest; +import org.zaproxy.zap.extension.hud.ui.generic.RightPanelUnitTest; + +import io.github.bonigarcia.Options; +import io.github.bonigarcia.SeleniumExtension; + +@ExtendWith(SeleniumExtension.class) +public class ExampleDotComFirefoxUnitTest { + + static final String TARGET = "https://www.example.com"; + // TODO parameterise the host:port + static final String PROXY = "localhost:8090"; + + @Options + FirefoxOptions firefoxOptions = new FirefoxOptions(); + { + Proxy proxy = new Proxy(); + proxy.setHttpProxy(PROXY) + .setFtpProxy(PROXY) + .setSslProxy(PROXY); + + firefoxOptions.addPreference("network.captive-portal-service.enabled", false); + firefoxOptions.addPreference("network.proxy.type", 1); + firefoxOptions.addPreference("network.proxy.http", "localhost"); + firefoxOptions.addPreference("network.proxy.http_port", 8090); + firefoxOptions.addPreference("network.proxy.ssl", "localhost"); + firefoxOptions.addPreference("network.proxy.ssl_port", 8090); + firefoxOptions.addPreference("network.proxy.share_proxy_settings", true); + firefoxOptions.addPreference("network.proxy.no_proxies_on", ""); + firefoxOptions.setCapability(CapabilityType.PROXY, (Object) null); + } + + @Test + public void frameUnitTests(FirefoxDriver driver) throws InterruptedException { + driver.get(TARGET); + // TODO why doesnt this load the HUD straight away? + Thread.sleep(2000); + driver.get(TARGET); + + LeftPanelUnitTest.runAllTests(driver); + RightPanelUnitTest.runAllTests(driver); + // TODO add more tests + } + +} diff --git a/test/org/zaproxy/zap/extension/hud/ui/uimap/HUD.java b/test/org/zaproxy/zap/extension/hud/ui/uimap/HUD.java new file mode 100644 index 000000000..a43df7fc3 --- /dev/null +++ b/test/org/zaproxy/zap/extension/hud/ui/uimap/HUD.java @@ -0,0 +1,65 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2018 The ZAP Development Team + * + * Licensed 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.zaproxy.zap.extension.hud.ui.uimap; + +import java.util.List; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +public class HUD { + + private WebDriver webdriver; + private int timeoutInSecs = 10; + + public HUD(WebDriver webdriver) { + this.webdriver = webdriver; + } + + public static By LEFT_PANEL_BY_ID = By.id("left-panel"); + public static By RIGHT_PANEL_BY_ID = By.id("right-panel"); + public static By HUD_BUTTON_BY_CLASSNAME = By.className("hud-button"); + + public WebElement getLeftPanel() { + return webdriver.findElement(LEFT_PANEL_BY_ID); + } + + public WebElement waitForLeftPanel() { + return (new WebDriverWait(webdriver, timeoutInSecs)) + .until(ExpectedConditions.presenceOfElementLocated(LEFT_PANEL_BY_ID)); + } + + public WebElement getRightPanel() { + return webdriver.findElement(RIGHT_PANEL_BY_ID); + } + + public WebElement waitForRightPanel() { + return (new WebDriverWait(webdriver, timeoutInSecs)) + .until(ExpectedConditions.presenceOfElementLocated(RIGHT_PANEL_BY_ID)); + } + + public List getHudButtons() { + return webdriver.findElements(HUD_BUTTON_BY_CLASSNAME); + } + +}