Ich erstelle eine aktive Annotation, um einige Textbausteine aus meinen Xtend-Quelldateien zu entfernen.Wie kann ich sicherstellen, dass die erforderlichen Importe in der Java-Ausgabe enthalten sind, die vom aktiven Xtend-Annotationsprozessor generiert wird?
Das folgende ist der Ausschnitt des Quellcodes meines AbstractFieldProcessor.
package dynamic
import java.lang.annotation.ElementType
import java.lang.annotation.Target
import org.eclipse.xtend.lib.macro.AbstractFieldProcessor
import org.eclipse.xtend.lib.macro.Active
import org.eclipse.xtend.lib.macro.TransformationContext
import org.eclipse.xtend.lib.macro.declaration.MutableFieldDeclaration
@Target(ElementType.FIELD)
@Active(DynamicCarmenFieldProcessor)
annotation DynamicCarmenField
{
String xpath
String prefix;
String suffix;
}
class DynamicCarmenFieldProcessor extends AbstractFieldProcessor {
override doTransform(MutableFieldDeclaration field, extension TransformationContext context)
{
if (!field.type.toString.equals("WebElement"))
field.addError("Only Type WebElement is supported by @Dynamic")
if (field.initializer != null)
field.addError("Initialisers are not supported by @Dynamic ")
var annotations = field.getAnnotations()
var xpath = "";
var suffix = "";
var prefix = "";
for(annotation:annotations)
{
if(annotation.annotationTypeDeclaration.simpleName == "DynamicCarmenField")
{
xpath = annotation.getStringValue("xpath")
suffix = annotation.getStringValue("suffix")
prefix = annotation.getStringValue("prefix")
}
}
val xpa = xpath
val suf = suffix
val pre = prefix
field.declaringType.addMethod('click' + field.simpleName.toFirstUpper)
[
body =
'''
WebElement webElement = driver.findElement(By.xpath("«xpa»"));
String dependentOnId = webElement.getAttribute("id");
String «field.simpleName»Id ="«pre»"+ dependentOnId +"«suf»";
«field.simpleName» = driver.findElement(By.id(«field.simpleName»Id));
«field.simpleName».click();
'''
]
field.declaringType.addMethod('set'+ field.simpleName.toFirstUpper +'Input')
[
var stringType = context.findTypeGlobally("String")
addParameter("values",context.newTypeReference(stringType))
body=
'''
this.click«field.simpleName.toFirstUpper»();
«field.simpleName»Input.sendKeys(values);
'''
]
}
}
Dieser Code ist in Ordnung. Jetzt versuche ich es im folgenden TestFile wie folgt zu benutzen bekomme ich eine Fehlermeldung. Ich habe festgestellt, dass das Problem darin liegt, dass der generierte Java-Code nicht alle Importe enthält.
package dynamic
import org.openqa.selenium.WebDriver
import org.openqa.selenium.WebElement
import org.openqa.selenium.support.FindBy
class DynamicCarmenFieldExample
{
WebDriver driver
@DynamicCarmenField(xpath="//table[@datatable='1' and @summary!='Question Administration']" , prefix="1", suffix="_Sequence")
WebElement answerSequenceField
@FindBy(id="1_Sequence")
WebElement answerSequenceFieldInput
}
Unten ist der generierte Java-Code.
import dynamic.DynamicCarmenField;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
@SuppressWarnings("all")
public class DynamicCarmenFieldExample {
private WebDriver driver;
@DynamicCarmenField(xpath = "//table[@datatable=\'1\' and @summary!=\'Question Administration\']", prefix = "1", suffix = "_Sequence")
private WebElement answerSequenceField;
@FindBy(id = "1_Sequence")
private WebElement answerSequenceFieldInput;
public void clickAnswerSequenceField() {
WebElement webElement = driver.findElement(By.xpath("//table[@datatable='1' and @summary!='Question Administration']"));
String dependentOnId = webElement.getAttribute("id");
String answerSequenceFieldId ="1"+ dependentOnId +"_Sequence";
answerSequenceField = driver.findElement(By.id(answerSequenceFieldId));
answerSequenceField.click();
}
public void setAnswerSequenceFieldInput(final String values) {
this.clickAnswerSequenceField();
answerSequenceFieldInput.sendKeys(values);
}
}
Das Problem ist, dass der Code
import org.openqa.selenium.By
aus dem erzeugten Java fehlt. Der Code erkennt nicht, dass er in die generierte Java-Datei aufgenommen werden muss. Ich weiß, dass ich das umgehen kann, indem ich das Paket und in der Xtend-Quelle importiere, aber ich möchte, dass meine aktive Anmerkung die Importe korrekt machen kann. Ist das möglich?
Works. Groß. Vielen Dank – KennyBartMan