From d1bccad6d737ee46e511625560d9d55e1489f4f0 Mon Sep 17 00:00:00 2001 From: Justin Hickman Date: Fri, 14 Jan 2022 14:34:23 -0500 Subject: [PATCH 1/2] Misc updates - overloaded By constructors to take strings as well; in case the test module does not depend on the module containing the widgets - Added support to use Elemental2 Nodes in exported methods interface rather than the JSO "Element", we can use elemental2.dom.HTMLElement - Added support for returning @JsType objects; these will result in a Map on the selenium side --- .../gwt/gwtdriver/SeExporterGenerator.java | 32 ++++++++++++++----- .../gwt/gwtdriver/by/ByNearestWidget.java | 24 +++++++++++--- .../webdriver/gwt/gwtdriver/by/ByWidget.java | 6 +++- .../gwt/gwtdriver/models/GwtWidgetFinder.java | 9 ++---- 4 files changed, 50 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/SeExporterGenerator.java b/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/SeExporterGenerator.java index e877ea8..0f63309 100644 --- a/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/SeExporterGenerator.java +++ b/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/SeExporterGenerator.java @@ -45,6 +45,8 @@ import java.io.PrintWriter; import java.util.List; +import jsinterop.annotations.JsType; + /** * */ @@ -57,6 +59,7 @@ public String generate(TreeLogger logger, GeneratorContext context, String typeN TypeOracle oracle = context.getTypeOracle(); JClassType jso = oracle.findType(Name.getSourceNameForClass(JavaScriptObject.class)); + JClassType elementalNode = oracle.findType("elemental2.dom.Node"); JClassType toGenerate = oracle.findType(typeName).isClass(); @@ -165,16 +168,24 @@ public String generate(TreeLogger logger, GeneratorContext context, String typeN throw new UnableToCompleteException(); } } else if ( - retType.isClass() != null && retType.getQualifiedSourceName().equals("java.lang.String") - || - ((retType.isClass() != null) && retType.isClass().isAssignableTo(jso)) || - ((retType.isInterface() != null) && oracle.getSingleJsoImplInterfaces() - .contains(retType))) { + retType.isClass() != null + && retType.getQualifiedSourceName().equals("java.lang.String") + || ((retType.isClass() != null) && retType.isClass().isAssignableTo(jso)) + || ((retType.isInterface() != null) && oracle.getSingleJsoImplInterfaces() + .contains(retType))) { sw.print("return "); } else { - methodLogger.log(Type.ERROR, - "Can't return non-jso, non-supported primitive " + retType + " from exported method"); - throw new UnableToCompleteException(); + // check for @JsType native classes + if (retType.isClass() != null + && retType.isClass().getAnnotation(JsType.class) != null + && retType.isClass().getAnnotation(JsType.class).isNative()) { + sw.print(" return "); + } else { + methodLogger.log(Type.ERROR, + "Can't return non-jso, non-supported primitive " + retType + + " from exported method"); + throw new UnableToCompleteException(); + } } if (m.isStatic()) { sw.print(exportedType); @@ -195,6 +206,11 @@ public String generate(TreeLogger logger, GeneratorContext context, String typeN } else if (type.isClass() != null && type.isClass().isAssignableTo(jso)) { //normal array plus cast() trickery sw.print("args.get(%1$d).<%2$s>cast()", i, type.getQualifiedSourceName()); + } else if (type.isClass() != null + && elementalNode != null + && type.isClass().isAssignableTo(elementalNode)) { + sw.print("jsinterop.base.Js.uncheckedCast(args.get(%1$d))", i, + type.getQualifiedSourceName()); } else if (type.isInterface() != null && oracle.getSingleJsoImplInterfaces() .contains(type.isInterface())) { //single jso cast thing diff --git a/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/by/ByNearestWidget.java b/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/by/ByNearestWidget.java index cc9cf04..34e550f 100644 --- a/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/by/ByNearestWidget.java +++ b/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/by/ByNearestWidget.java @@ -46,7 +46,7 @@ */ public class ByNearestWidget extends By { private final WebDriver driver; - private final Class widget; + private final String widgetClassName; /** * Finds the nearest containing widget of any type - anything that extends Widget will be found. @@ -67,8 +67,21 @@ public ByNearestWidget(WebDriver driver) { * @param type the type of widget to find */ public ByNearestWidget(WebDriver driver, Class type) { - this.widget = type; + this(driver, type.getName()); + } + + /** + * Finds the nearest containing widget of the given type. This will find any subtype of that + * widget, allowing you to pass in {@link ValueBoxBase} and find any {@link TextBox}, {@link + * TextArea}, {@link IntegerBox}, etc, as these are all subclasses of {@code ValueBoxBase}. Note + * that interfaces cannot be used, only base classes, and those classes *must* extend Widget. + * + * @param driver the driver to use to communicate with the browser + * @param widgetClassName the type of widget to find + */ + public ByNearestWidget(WebDriver driver, String widgetClassName) { this.driver = driver; + this.widgetClassName = widgetClassName; } @Override @@ -84,7 +97,7 @@ public List findElements(SearchContext context) { public WebElement findElement(SearchContext context) { WebElement potentialElement = tryFindElement(context); if (potentialElement == null) { - throw new NoSuchElementException("Cannot find a " + widget.getName() + " in " + context); + throw new NoSuchElementException("Cannot find a " + widgetClassName + " in " + context); } return potentialElement; } @@ -99,13 +112,14 @@ public WebElement findElement(SearchContext context) { private WebElement tryFindElement(SearchContext context) { WebElement elt = context.findElement(By.xpath(".")); ExportedMethods m = ClientMethodsFactory.create(ExportedMethods.class, driver); - WebElement potentialElement = m.getContainingWidgetEltOfType(elt, widget.getName()); + WebElement potentialElement = m.getContainingWidgetEltOfType(elt, widgetClassName); return potentialElement; } @Override public String toString() { - return "ByNearestWidget" + (widget == Widget.class ? "" : " " + widget.getName()); + return "ByNearestWidget" + + (Widget.class.getName().equals(widgetClassName) ? "" : " " + widgetClassName); } } diff --git a/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/by/ByWidget.java b/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/by/ByWidget.java index 65b2cd4..1541f78 100644 --- a/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/by/ByWidget.java +++ b/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/by/ByWidget.java @@ -45,8 +45,12 @@ public ByWidget(WebDriver driver) { } public ByWidget(WebDriver driver, Class widgetType) { + this(driver, widgetType.getName()); + } + + public ByWidget(WebDriver driver, String className) { this.driver = driver; - this.type = widgetType.getName(); + this.type = className; } @Override diff --git a/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/models/GwtWidgetFinder.java b/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/models/GwtWidgetFinder.java index 5fdf0bb..0bd45ee 100644 --- a/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/models/GwtWidgetFinder.java +++ b/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/models/GwtWidgetFinder.java @@ -65,14 +65,9 @@ public W waitFor(long duration, TemporalUnit unit) { } public W waitFor(Duration duration) { - return new FluentWait(driver) + return new FluentWait<>(driver) .withTimeout(duration) .ignoring(NotFoundException.class) - .until(new Function() { - @Override - public W apply(WebDriver webDriver) { - return done(); - } - }); + .until((Function) webDriver -> done()); } } From 56fffcf7497d3a09c1794586c3607e35fbce74d5 Mon Sep 17 00:00:00 2001 From: Justin Hickman Date: Fri, 14 Jan 2022 15:26:37 -0500 Subject: [PATCH 2/2] Changing from uncheckedCast to cast --- .../vertispan/webdriver/gwt/gwtdriver/SeExporterGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/SeExporterGenerator.java b/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/SeExporterGenerator.java index 0f63309..3baae3d 100644 --- a/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/SeExporterGenerator.java +++ b/src/main/java/com/vertispan/webdriver/gwt/gwtdriver/SeExporterGenerator.java @@ -209,7 +209,7 @@ public String generate(TreeLogger logger, GeneratorContext context, String typeN } else if (type.isClass() != null && elementalNode != null && type.isClass().isAssignableTo(elementalNode)) { - sw.print("jsinterop.base.Js.uncheckedCast(args.get(%1$d))", i, + sw.print("jsinterop.base.Js.cast(args.get(%1$d))", i, type.getQualifiedSourceName()); } else if (type.isInterface() != null && oracle.getSingleJsoImplInterfaces() .contains(type.isInterface())) {