Effectief data kopiëren tussen Sikuli en Selenium testen

Tijdens één van mijn testautomatisering workshops bracht een klant de volgende interessante casus aan het licht: Hun primaire applicatie is een Oracle Forms omgeving (Systeem A) waar geautomatiseerde tests ontwikkeld worden op basis van Sikuli. Daarnaast werken ze met een webapplicatie (Systeem B) van een externe leverancier die getest wordt met Selenium WebDriver. Onafhankelijk van elkaar draaien de testen prima, maar de wens is om de testen te integreren zodat automatisch data doorgegeven kan worden vanuit Systeem A aan Systeem B.

Eenvoudige copy en paste handelingen zijn zowel met Sikuli als Selenium te verwezenlijken, maar doordat Systeem A alleen Firefox ondersteunt en Systeem B enkel Internet Explorer ondersteunt liepen we tegen het probleem aan dat de paste handeling door Systeem B niet herkend, dan wel uitgevoerd kon worden.

Om dit probleem op te lossen heb ik onderstaande aanpak bedacht:

We kopiëren de waarde vanuit Systeem A door de bekende Copy handeling uit Sikuli. Vervolgens bouwen we een try / catch blok om de gekopieerde waarde van het Clipboard af te lezen. Deze moeten we omzetten naar een voor mensen leesbare waarde, ofwel String. We geven deze String-waarde mee aan een daarvoor bestemde variabele. Hierna bouwen we een nieuw try / catch blok waarin we ervoor zorgen dat een nieuw tekstbestand wordt aangemaakt waarin de waarde van deze variabele wordt weggeschreven. Mocht het bestand reeds bestaan, dan wordt deze overschreven.

Het grote voordeel is dat de opgeslagen data (in dit geval één variabele) in Systeem B meerdere malen opgehaald en gebruikt kan worden (binnen verschillende classes). Hierna rest slechts één volgende stap en dat is het bestand uitlezen!

In code ziet dit er als volgt uit:

public class FileWriter extends TestStructuur

// Initialisatie voor Sikuli, evenals de declaratie van de String variabele.

Screen screen = new Screen();
Pattern pic1 = new Pattern("D:/Users/Paul/Folder/SomeImage.JPG");
String variable1;<

// Uitvoeren van de test

@Test
public void loginUser () throws FindFailed, UnsupportedFlavorException{
FileWriter fileWriter = new FileWriter();
fileWriter.copyToClipboard();
}

// Methode voor het kopiëren van de gebruikersnaam op een website en het wegschrijven naar een tekstbestand.

public void copyToClipboard() throws FindFailed, UnsupportedFlavorException {
driver.navigate().to("http://www.justanotherwebsite.com");
WebElement inputUsername = driver.findElement(By.xpath(".//input[contains(@id,'login')]"));<

// Kopieer de waarde uit het gebruikersnaam veld op het clipboard

screen.doubleClick(pic1);
screen.type("c", Key.CTRL);

// Declareer en initialiseer het clipboard, en geef de waarde van het clipboard als String door aan variable1.

try {
Clipboard clippy = Toolkit.getDefaultToolkit().getSystemClipboard();
variable1 = clippy.getData(DataFlavor.stringFlavor).toString();
}
catch (IOException es) {
// Wordt alleen gegeven wanneer clipboard leeg is of een plaatje bevat i.p.v. tekst.
}

// Schrijf de waarde naar het nieuw aan te maken tekstbestand variablefile.txt

Writer writer = null;
try {
writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("variablefile.txt"), "utf-8"));
writer.write(variable1);
} catch (IOException ex) {
ex.printStackTrace();
}finally {
try {writer.close();} catch (Exception ex) {// nog een stacktrace}
}
}
}

Share this Post