Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IntelliJ JavaScript and XPath syntax highlighting in tests #1730

Merged
merged 1 commit into from
Nov 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 12 additions & 7 deletions src/org/labkey/test/Locator.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.mutable.MutableObject;
import org.intellij.lang.annotations.Language;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.labkey.test.selenium.LazyWebElement;
Expand Down Expand Up @@ -59,15 +60,19 @@ public abstract class Locator extends By
private String _description;

// XPATH fragments
@Language("XPath")
public static final String HIDDEN = "ancestor-or-self::*[" +
"contains(@style,'display: none') or " +
"contains(@style,'visibility: hidden') or " +
"contains(@class, 'x-hide-display') or " +
"contains(@class, 'x4-hide-offsets') or " +
"contains(@class, 'x-hide-offsets')] or " +
"(@type = 'hidden')";
@Language("XPath")
public static final String NOT_HIDDEN = "not(" + HIDDEN + ")";
@Language("XPath")
public static final String DISABLED = "ancestor-or-self::*[contains(@class, 'disabled')]";
@Language("XPath")
public static final String ENABLED = "not(" + DISABLED + ")";
public static final String NBSP = "\u00A0";

Expand Down Expand Up @@ -574,7 +579,7 @@ public static CssLocator css(String selector)
return new CssLocator(selector);
}

public static XPathLocator xpath(String xpathExpr)
public static XPathLocator xpath(@Language("XPath") String xpathExpr)
{
return new XPathLocator(xpathExpr);
}
Expand Down Expand Up @@ -1176,7 +1181,7 @@ protected By getRelativeBy()

public static class XPathLocator extends Locator
{
protected XPathLocator(String loc)
protected XPathLocator(@Language("XPath") String loc)
{
super(loc);
}
Expand Down Expand Up @@ -1229,7 +1234,7 @@ public XPathLocator withoutText(String text)

public XPathLocator withoutText()
{
return this.withPredicate("string-length() == 0");
return this.withPredicate("string-length() = 0");
}

public XPathLocator withTextMatching(String regex)
Expand Down Expand Up @@ -1321,7 +1326,7 @@ public XPathLocator last()
return withPredicate("last()");
}

public XPathLocator append(String clause)
public XPathLocator append(@Language("XPath") String clause)
{
return new XPathLocator(getLoc() + clause);
}
Expand Down Expand Up @@ -1357,12 +1362,12 @@ public XPathLocator withPredicate(XPathLocator descendant)
return this.withPredicate(descendant.getLoc());
}

public XPathLocator withPredicate(String predicate)
public XPathLocator withPredicate(@Language("XPath") String predicate)
{
return this.append("[" + getRelativeXPath(predicate) + "]");
}

public XPathLocator withoutPredicate(String predicate)
public XPathLocator withoutPredicate(@Language("XPath") String predicate)
{
return this.append("[not(" + getRelativeXPath(predicate) + ")]");
}
Expand Down Expand Up @@ -1525,7 +1530,7 @@ private String getRelativeXPath()
return getRelativeXPath(getLoc());
}

private String getRelativeXPath(String xpath)
private String getRelativeXPath(@Language("XPath") String xpath)
{
if (xpath.startsWith("//") || xpath.startsWith("(//"))
xpath = xpath.replaceFirst("//", ".//");
Expand Down
26 changes: 14 additions & 12 deletions src/org/labkey/test/WebDriverWrapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.apache.commons.lang3.mutable.MutableInt;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.intellij.lang.annotations.Language;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
Expand Down Expand Up @@ -452,7 +453,7 @@ public boolean isFirefox()
return getDriver().getClass().isAssignableFrom(FirefoxDriver.class);
}

public Object executeScript(String script, Object... arguments)
public Object executeScript(@Language("JavaScript") String script, Object... arguments)
{
return ((JavascriptExecutor) getDriver()).executeScript(script, arguments);
}
Expand All @@ -461,7 +462,7 @@ public Object executeScript(String script, Object... arguments)
* Wrapper for executing JavaScript through WebDriver and verifying return type.
* @param <T> See {@link JavascriptExecutor#executeScript(java.lang.String, java.lang.Object...)} for valid return types
*/
public <T> T executeScript(String script, Class<T> expectedResultType, Object... arguments)
public <T> T executeScript(@Language("JavaScript") String script, Class<T> expectedResultType, Object... arguments)
{
Object o = executeScript(script, arguments);
if (o != null && !expectedResultType.isAssignableFrom(o.getClass()))
Expand All @@ -474,7 +475,7 @@ public <T> T executeScript(String script, Class<T> expectedResultType, Object...
* Wrapper for synchronous execution of asynchronous JavaScript. This wrapper extracts the 'callback' from the argument list
* See {@link JavascriptExecutor#executeAsyncScript(java.lang.String, java.lang.Object...)} for details
*/
public Object executeAsyncScript(String script, Object... arguments)
public Object executeAsyncScript(@Language("XPath") String script, Object... arguments)
{
script = "var callback = arguments[arguments.length - 1];\n" + // See WebDriver documentation for details on injected callback
"try {" +
Expand Down Expand Up @@ -1475,15 +1476,16 @@ public void fireEvent(Locator l, SeleniumEvent event)
*/
public void fireEvent(WebElement el, SeleniumEvent event)
{
executeScript("var element = arguments[0];" +
"var eventType = arguments[1];" +
"var myEvent = document.createEvent('UIEvent');" +
"myEvent.initEvent(" +
" eventType, /* event type */" +
" true, /* can bubble? */" +
" true /* cancelable? */" +
");" +
"element.dispatchEvent(myEvent);", el, event.toString());
executeScript("""
var element = arguments[0];
var eventType = arguments[1];
var myEvent = document.createEvent('UIEvent');
myEvent.initEvent(
eventType, /* event type */
true, /* can bubble? */
true /* cancelable? */
);
element.dispatchEvent(myEvent);""", el, event.toString());
}

public void assertTitleEquals(String match)
Expand Down