jueves, 10 de noviembre de 2016

scroll To Element con Selenium

Problemática: A veces hay elementos que se encuentran pero no se ejecuta su acción (como el click) cuando utilizo RemoteWebDriver. Una vez estudiado el problema he visto que en ciertos casos extraños si el elemento en cuestión no está en la zona visible del navegador, Selenium encuentra el objeto pero no puede realizar ninguna acción.
Para solucionar/evitar este problema se puede ejecutar javascript que haga scroll hasta el elemento deseado, así siempre será visible y se podrán hacer acciones sobre él.

Este sería el metodo a utilizar:

public static void scrollToElement(WebDriver driver, WebElement element) { JavascriptExecutor javascriptExecutor = (JavascriptExecutor) driver; javascriptExecutor.executeScript("arguments[0].scrollIntoView(true);", element); }

miércoles, 26 de octubre de 2016

Tutorial git interactivo

https://try.github.io/levels/1/challenges/9

Ejemplo de uso de JGit para obtener un csv de cambios de release

 package XXXX;  
 import java.io.File;  
 import java.io.IOException;  
 import java.text.ParseException;  
 import java.text.SimpleDateFormat;  
 import java.util.Date;  
 import java.util.Iterator;  
 import org.apache.commons.io.FileUtils;  
 import org.apache.commons.lang3.StringUtils;  
 import org.eclipse.jgit.api.Git;  
 import org.eclipse.jgit.api.errors.GitAPIException;  
 import org.eclipse.jgit.lib.ObjectId;  
 import org.eclipse.jgit.lib.Ref;  
 import org.eclipse.jgit.lib.Repository;  
 import org.eclipse.jgit.revwalk.RevCommit;  
 import org.eclipse.jgit.storage.file.FileRepositoryBuilder;  
 public class ReleaseNotesGenerator {  
   private static ObjectId findActualRefObjectId(Ref ref, Repository repo) {  
     final Ref repoPeeled = repo.peel(ref);  
     if (repoPeeled.getPeeledObjectId() != null) {  
       return repoPeeled.getPeeledObjectId();  
     }  
     return ref.getObjectId();  
   }  
   private static void gitLogFromTagToNow(Repository repository, String tag1, String version, String pathFile)  
       throws IOException, GitAPIException, ParseException {  
     Git git = new Git(repository);  
     Ref refFrom = repository.findRef(tag1);  
     RevCommit latestCommit = git.log().call().iterator().next();  
     Iterable<RevCommit> log = git.log().addRange(findActualRefObjectId(refFrom, repository), latestCommit).call();  
     StringBuilder csvLines = new StringBuilder();  
     csvLines.append(StringUtils.join(new String[] { CABECERAS DE LOS CAMPOS QUE SE QUIERAN AÑADIR }, ";")  
         + "\n");  
     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");  
     for (Iterator<RevCommit> iterator = log.iterator(); iterator.hasNext();) {  
       RevCommit rev = iterator.next();  
       String[] splittedMessage = rev.getFullMessage().split("\\r?\\n");  
       if (splittedMessage.length == 6) {  
         cleanMessages(splittedMessage);  
         csvLines.append(StringUtils.join(  
             new String[] { splittedMessage[1], splittedMessage[2], .... CAMPOS OBTENIDOS DE CADA MENSAJE},  
             ";") + "\n");  
       }  
     }  
     FileUtils  
         .writeByteArrayToFile(  
             new File(pathFile + "_" + version + "_"  
                 + new SimpleDateFormat("ddMMyyyy_hhmm").format(new Date()) + ".csv"),  
             csvLines.toString().getBytes());  
     git.close();  
   }  
   private static void cleanMessages(String[] splittedMessage) {  
     for (int i = 0; i < splittedMessage.length; i++) {  
       splittedMessage[i] = splittedMessage[i].replaceAll("\\[.*\\]", "");  
     }  
   }  
   public static void main(String[] args) throws IOException, GitAPIException, ParseException {  
     String version = "versionFromMaven";  
     String fromRevision = "V5.5.0";  
     if (args != null && args.length > 0) {  
       fromRevision = args[0];  
       if (args != null && args.length > 1) {  
         version = args[1];  
       }  
     }  
     System.out.println("fromRevision:" + fromRevision + " version:" + version);  
     FileRepositoryBuilder repositoryBuilder = new FileRepositoryBuilder();  
     repositoryBuilder.setMustExist(true);  
     File gitBase = new File(".git");  
     String pathFile = "resources/releaseNotes/releaseNotes";  
     if (!gitBase.exists()) {  
       gitBase = new File("../.git");  
       pathFile = "../resources/releaseNotes/releaseNotes";  
     }  
     System.out.println("gitBasePath:" + gitBase.getAbsolutePath());  
     repositoryBuilder.setGitDir(gitBase);  
     Repository repository = repositoryBuilder.build();  
     if (repository.getObjectDatabase().exists()) {  
       gitLogFromTagToNow(repository, fromRevision, version, pathFile);  
     }  
   }  
 }  

martes, 11 de octubre de 2016

Activar chats en grupo en Skype en Linux

Si al instalar Skype no ves tus grupos ejecuta este comando en cualquier conversación.
/msnp24
 
Y cierra y vuelve a abrir skype. 

miércoles, 31 de agosto de 2016

Blog interesante sobre java

http://www.arquitecturajava.com/

Tabla de locales en java7

Esta tabla muestra el language, formate numérico, fecha corta y fecha larga por cada Locale de java.util.Locale.

Se ha generado con este código:

@Test
public void tableWithAllLocalesInfo() {
List list = Arrays.asList(DateFormat.getAvailableLocales());
Date now = new Date();
for (Locale locale : list) {
System.out.println("

Language - " + locale.getLanguage() + "
- Number format - "
+ NumberFormat.getInstance(locale).format(12345.6789) + "
- dateShort - "
+ DateFormat.getDateInstance(DateFormat.SHORT, locale).format(now) + "
- dateLong - "
+ DateFormat.getDateInstance(DateFormat.LONG, locale).format(now) + "
");
}
}


Language - - Number format - 12,345.679- dateShort - 8/31/16- dateLong - August 31, 2016
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 أغسطس, 2016
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 آب, 2016
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 آب, 2016
Language - hr- Number format - 12.345,679- dateShort - 31.08.16.- dateLong - 2016. kolovoza 31
Language - fr- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 août 2016
Language - es- Number format - 12,345.679- dateShort - 08/31/16- dateLong - 31 de agosto de 2016
Language - mt- Number format - 12,345.679- dateShort - 31/08/2016- dateLong - 31 ta’ Awwissu 2016
Language - es- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 de agosto de 2016
Language - bg- Number format - 12 345,679- dateShort - 31.08.16- dateLong - 31 Август 2016
Language - zh- Number format - 12,345.679- dateShort - 2016/8/31- dateLong - 2016年8月31日
Language - it- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 agosto 2016
Language - ko- Number format - 12,345.679- dateShort - 16. 8. 31- dateLong - 2016년 8월 31일 (수)
Language - uk- Number format - 12 345,679- dateShort - 31.08.16- dateLong - 31 серпня 2016
Language - lv- Number format - 12 345,679- dateShort - 16.31.8- dateLong - trešdiena, 2016, 31 augusts
Language - da- Number format - 12.345,679- dateShort - 31-08-16- dateLong - 31. august 2016
Language - es- Number format - 12,345.679- dateShort - 08-31-16- dateLong - 31 de agosto de 2016
Language - vi- Number format - 12.345,679- dateShort - 31/08/2016- dateLong - Ngày 31 tháng 8 năm 2016
Language - en- Number format - 12,345.679- dateShort - 8/31/16- dateLong - August 31, 2016
Language - sr- Number format - 12.345,679- dateShort - 31.8.16.- dateLong - 31.08.2016.
Language - sv- Number format - 12 345,679- dateShort - 2016-08-31- dateLong - den 31 augusti 2016
Language - es- Number format - 12.345,679- dateShort - 31-08-16- dateLong - 31 de agosto de 2016
Language - en- Number format - 12,345.679- dateShort - 31/8/16- dateLong - 31 August, 2016
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 أغسطس, 2016
Language - pt- Number format - 12.345,679- dateShort - 31-08-2016- dateLong - 31 de Agosto de 2016
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 أغسطس, 2016
Language - sk- Number format - 12 345,679- dateShort - 31.8.2016- dateLong - Streda, 2016, augusta 31
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 أغسطس, 2016
Language - hi- Number format - १२,३४५.६७९- dateShort - ३१/८/१६- dateLong - ३१ अगस्त, २०१६
Language - ga- Number format - 12,345.679- dateShort - 16/08/31- dateLong - 2016 Lúnasa 31
Language - en- Number format - 12,345.679- dateShort - 31/08/2016- dateLong - 31 August 2016
Language - fi- Number format - 12 345,679- dateShort - 31.8.2016- dateLong - 31. elokuuta 2016
Language - et- Number format - 12 345,679- dateShort - 31.08.16- dateLong - kolmapäev, 31. august 2016. a
Language - sv- Number format - 12 345,679- dateShort - 2016-08-31- dateLong - den 31 augusti 2016
Language - cs- Number format - 12 345,679- dateShort - 31.8.16- dateLong - 31. srpna 2016
Language - sr- Number format - 12,345.679- dateShort - 31.8.16.- dateLong - 31. avgust 2016.
Language - el- Number format - 12.345,679- dateShort - 31/8/2016- dateLong - 31 Αυγούστου 2016
Language - uk- Number format - 12 345,679- dateShort - 31.08.16- dateLong - 31 серпня 2016
Language - hu- Number format - 12 345,679- dateShort - 2016.08.31.- dateLong - 2016. augusztus 31.
Language - fr- Number format - 12'345.679- dateShort - 31.08.16- dateLong - 31. août 2016
Language - in- Number format - 12.345,679- dateShort - 16/08/31- dateLong - 2016 Agustus 31
Language - es- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 de agosto de 2016
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 أغسطس, 2016
Language - ja- Number format - 12,345.679- dateShort - H28.08.31- dateLong - H28.08.31
Language - es- Number format - 12,345.679- dateShort - 08-31-16- dateLong - 31 de agosto de 2016
Language - pt- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 de Agosto de 2016
Language - be- Number format - 12 345,679- dateShort - 31.8.16- dateLong - серада, 31, жніўня 2016
Language - is- Number format - 12.345,679- dateShort - 31.8.2016- dateLong - 31. ágúst 2016
Language - cs- Number format - 12 345,68- dateShort - 31.8.16- dateLong - 31. srpna 2016
Language - es- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 de agosto de 2016
Language - pl- Number format - 12 345,679- dateShort - 31.08.16- dateLong - 31 sierpnia 2016
Language - tr- Number format - 12.345,679- dateShort - 31.08.2016- dateLong - 31 Ağustos 2016 Çarşamba
Language - ca- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 / d’agost / 2016
Language - sr- Number format - 12.345,679- dateShort - 31.8.16.- dateLong - 31.08.2016.
Language - ms- Number format - 12,345.679- dateShort - 31/08/2016- dateLong - 31 Ogos 2016
Language - hr- Number format - 12.345,679- dateShort - 2016.08.31- dateLong - 2016. kolovoza 31
Language - lt- Number format - 12 345,679- dateShort - 16.8.31- dateLong - Trečiadienis, 2016, rugpjūtis 31
Language - es- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 de agosto de 2016
Language - es- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 de agosto de 2016
Language - bg- Number format - 12 345,679- dateShort - 31.08.16- dateLong - 31 Август 2016
Language - sq- Number format - 12.345,679- dateShort - 16-08-31- dateLong - 2016-08-31
Language - fr- Number format - 12 345,679- dateShort - 31/08/16- dateLong - 31 août 2016
Language - ja- Number format - 12,345.679- dateShort - 16/08/31- dateLong - 2016/08/31
Language - sr- Number format - 12.345,679- dateShort - 16-08-31- dateLong - 31. август 2016.
Language - is- Number format - 12.345,679- dateShort - 31.8.2016- dateLong - 31. ágúst 2016
Language - es- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 de agosto de 2016
Language - de- Number format - 12.345,679- dateShort - 31.08.16- dateLong - 31. August 2016
Language - es- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 de agosto de 2016
Language - es- Number format - 12,345.679- dateShort - 8/31/16- dateLong - 31 de agosto de 2016
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 أغسطس, 2016
Language - en- Number format - 12,345.679- dateShort - 8/31/16- dateLong - August 31, 2016
Language - ro- Number format - 12.345,679- dateShort - 31.08.2016- dateLong - 31 august 2016
Language - en- Number format - 12,345.679- dateShort - 8/31/16- dateLong - August 31, 2016
Language - ca- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 / d’agost / 2016
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 أغسطس, 2016
Language - sr- Number format - 12,345.679- dateShort - 31.8.16.- dateLong - 31.08.2016.
Language - es- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 de agosto de 2016
Language - sl- Number format - 12.345,679- dateShort - 31.8.2016- dateLong - 31. avgust 2016
Language - ko- Number format - 12,345.679- dateShort - 16. 8. 31- dateLong - 2016년 8월 31일 (수)
Language - el- Number format - 12.345,679- dateShort - 31/08/2016- dateLong - 31 Αύγουστος 2016
Language - es- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 de agosto de 2016
Language - ru- Number format - 12 345,679- dateShort - 31.08.16- dateLong - 31 августа 2016 г.
Language - es- Number format - 12,345.679- dateShort - 08-31-16- dateLong - 31 de agosto de 2016
Language - zh- Number format - 12,345.679- dateShort - 16年8月31日- dateLong - 2016年08月31日 星期三
Language - no- Number format - 12 345,679- dateShort - 31.08.16- dateLong - 31. august 2016
Language - hu- Number format - 12 345,679- dateShort - 2016.08.31.- dateLong - 2016. augusztus 31.
Language - th- Number format - 12,345.679- dateShort - 31/8/2559- dateLong - 31 สิงหาคม 2559
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 أغسطس, 2016
Language - es- Number format - 12.345,679- dateShort - 31-08-16- dateLong - 31 de agosto de 2016
Language - fi- Number format - 12 345,679- dateShort - 31.8.2016- dateLong - 31. elokuuta 2016
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 أغسطس, 2016
Language - ga- Number format - 12,345.679- dateShort - 31/08/2016- dateLong - 31 Lúnasa 2016
Language - mk- Number format - 12.345,679- dateShort - 31.8.16- dateLong - 31, август 2016
Language - tr- Number format - 12.345,679- dateShort - 31.08.2016- dateLong - 31 Ağustos 2016 Çarşamba
Language - et- Number format - 12 345,679- dateShort - 31.08.16- dateLong - kolmapäev, 31. august 2016. a
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 أغسطس, 2016
Language - sr- Number format - 12,345.679- dateShort - 31.8.16.- dateLong - 31. avgust 2016.
Language - pt- Number format - 12.345,679- dateShort - 31-08-2016- dateLong - 31 de Agosto de 2016
Language - fr- Number format - 12 345,679- dateShort - 31/08/16- dateLong - 31 août 2016
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 أغسطس, 2016
Language - th- Number format - 12,345.679- dateShort - 31/8/2016- dateLong - 31 สิงหาคม 2016
Language - sq- Number format - 12.345,679- dateShort - 16-08-31- dateLong - 2016-08-31
Language - es- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 de agosto de 2016
Language - es- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 de agosto de 2016
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 أغسطس, 2016
Language - ru- Number format - 12 345,679- dateShort - 31.08.16- dateLong - 31 августа 2016 г.
Language - en- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 August 2016
Language - sr- Number format - 12.345,679- dateShort - 31.8.16.- dateLong - 31.08.2016.
Language - de- Number format - 12'345.679- dateShort - 31.08.16- dateLong - 31. August 2016
Language - es- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 de agosto de 2016
Language - ms- Number format - 12,345.679- dateShort - 16/08/31- dateLong - 2016 Ogos 31
Language - el- Number format - 12.345,679- dateShort - 31/8/2016- dateLong - 31 Αυγούστου 2016
Language - iw- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 אוגוסט 2016
Language - en- Number format - 12,345.679- dateShort - 2016/08/31- dateLong - 31 August 2016
Language - th- Number format - ๑๒,๓๔๕.๖๗๙- dateShort - ๓๑/๘/๒๕๕๙- dateLong - ๓๑ สิงหาคม ๒๕๕๙
Language - hi- Number format - 12,345.679- dateShort - 8/31/16- dateLong - August 31, 2016
Language - fr- Number format - 12 345,679- dateShort - 31/08/16- dateLong - 31 août 2016
Language - de- Number format - 12.345,679- dateShort - 31.08.16- dateLong - 31. August 2016
Language - nl- Number format - 12.345,679- dateShort - 31-8-16- dateLong - 31 augustus 2016
Language - no- Number format - 12 345,679- dateShort - 31.08.16- dateLong - 31. august 2016
Language - en- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 August 2016
Language - vi- Number format - 12.345,679- dateShort - 31/08/2016- dateLong - Ngày 31 tháng 8 năm 2016
Language - nl- Number format - 12.345,679- dateShort - 31-8-16- dateLong - 31 augustus 2016
Language - fr- Number format - 12 345,679- dateShort - 16-08-31- dateLong - 31 août 2016
Language - lv- Number format - 12 345,679- dateShort - 16.31.8- dateLong - trešdiena, 2016, 31 augusts
Language - de- Number format - 12.345,679- dateShort - 31.08.16- dateLong - 31. August 2016
Language - es- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 de agosto de 2016
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 أغسطس, 2016
Language - sr- Number format - 12.345,679- dateShort - 31.8.16.- dateLong - 31.08.2016.
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 أغسطس, 2016
Language - mt- Number format - 12,345.679- dateShort - 31/08/2016- dateLong - 31 ta’ Awwissu 2016
Language - it- Number format - 12'345.679- dateShort - 31.08.16- dateLong - 31. agosto 2016
Language - da- Number format - 12.345,679- dateShort - 31-08-16- dateLong - 31. august 2016
Language - de- Number format - 12.345,679- dateShort - 31.08.16- dateLong - 31. August 2016
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 أغسطس, 2016
Language - sk- Number format - 12 345,679- dateShort - 31.8.2016- dateLong - Streda, 2016, augusta 31
Language - lt- Number format - 12 345,68- dateShort - 16.8.31- dateLong - Trečiadienis, 2016, rugpjūtis 31
Language - it- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 agosto 2016
Language - en- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 August 2016
Language - zh- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 八月 2016
Language - ro- Number format - 12.345,679- dateShort - 31.08.2016- dateLong - 31 august 2016
Language - en- Number format - 12,345.679- dateShort - 31/08/16- dateLong - August 31, 2016
Language - nl- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 augustus 2016
Language - no- Number format - 12 345,679- dateShort - 31.08.16- dateLong - 31. august 2016
Language - pl- Number format - 12 345,679- dateShort - 16-08-31- dateLong - 31 sierpnia 2016
Language - zh- Number format - 12,345.679- dateShort - 16-8-31- dateLong - 2016年8月31日
Language - ja- Number format - 12,345.679- dateShort - 16/08/31- dateLong - 2016/08/31
Language - de- Number format - 12.345,679- dateShort - 31.08.16- dateLong - 31. August 2016
Language - sr- Number format - 12,345.679- dateShort - 31.8.16.- dateLong - 31. avgust 2016.
Language - iw- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 אוגוסט 2016
Language - en- Number format - 12,345.679- dateShort - 31/8/16- dateLong - 31 August, 2016
Language - ar- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 آب, 2016
Language - es- Number format - 12,345.679- dateShort - 08-31-16- dateLong - 31 de agosto de 2016
Language - zh- Number format - 12,345.679- dateShort - 16-8-31- dateLong - 2016年8月31日
Language - mk- Number format - 12.345,679- dateShort - 31.8.16- dateLong - 31, август 2016
Language - be- Number format - 12 345,679- dateShort - 31.8.16- dateLong - серада, 31, жніўня 2016
Language - sl- Number format - 12.345,679- dateShort - 31.8.2016- dateLong - 31. avgust 2016
Language - es- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 de agosto de 2016
Language - in- Number format - 12.345,679- dateShort - 31/08/16- dateLong - 31 Agustus 2016
Language - en- Number format - 12,345.679- dateShort - 31/08/16- dateLong - 31 August 2016

lunes, 29 de agosto de 2016

Cambio de versiones del proyecto con maven versions

Para actualizar la version del proyecto utilizaremos el plugin de maven "versions" http://www.mojohaus.org/versions-maven-plugin/set-mojo.html

Pasos:
  •  Colocarse en la carpeta raiz del proyecto.
  • Ejecutar el comando siguiente indicando la nueva version, por ejemplo podría ser "1.0.0-SNAPSHOT" para la rama de desarrollo o "1.0.0" para cerrar una versión.
mvn versions:set -DnewVersion=[NUEVA VERSION]
  •  El resultado de este comando devuelve algo parecido a la trazada de debajo. Lo importante es revisar ahí que aparezca el texto BUILD SUCCESS:
[INFO] Reactor Summary:
[INFO]
...
...
....
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS


lunes, 22 de agosto de 2016

Selenium Select problema en el click sobre un option

Entorno en el que se produce error:

Firefox 46.0.1
Servidor Jenkins 2.17.
Plugin de Jenkins Selenium Grid 2.53.1
Servidor para nodo selenium-server-standalone-3.0.0-beta2

Problema: Al utilizar la clase org.openqa.selenium.support.ui.Select para obtener un select y utilizar alguno de sus métodos selectBy{*} para seleccionar un option no funciona al utilizar RemoteWebDriver. Tampoco funciona seleccionar el WebElement del option y realizar el método click.

Solución: No usar la clase Select, seleccionar el select por id con un findByElement, hacer click sobre él y despues realizar el método sendKeys para escribir el texto de la opción deseada.



Caso extraño: Si nuestros options no tienen texto, la única solución que he encontrado es utilizando las teclas de flechas mandandolas con sendKeys y al finalizar mandando la tecla enter.
En mi caso como me da igual que option seleccionar he utilizado ARROW_DOWN  un par de veces.
Las teclas se pueden sacar de la clase de selenium Keys:
https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/Keys.html

martes, 16 de agosto de 2016

Usar selenium con RemoteWebDriver y Jenkins

Usar selenium en remoto

  • Utilizaremos un selenium-grid instalado en jenkins https://wiki.jenkins-ci.org/display/JENKINS/Selenium+Plugin. A este grid se conectarán nodos, que son los servidores donde se encuentran realmente los navegadores web. La forma de conectar un nodo es con el siguiente comando:
     
    java -jar selenium-server-standalone-3.0.0-beta2.jar -role node  -hub http://[jenkins.instalado]:4444/wd/hub
    

    Al ejecutar este comando se verá en la consola de selenium de jenkins el nodo conectado y los navegadores disponibles "Registered Remote Controls".
    Una vez configurado el servidor selenium y los nodos podemos utilizarlo cambiando el Webdriver que usamos en los tests por lo siguiente:
         final WebDriver driver = new RemoteWebDriver(new URL("http://[jenkins.instalado]:4444/wd/hub"), DesiredCapabilities.firefox());

Los problemas que he tenido han sido de acceso a los puertos. Las máquinas donde estén instalados los nodos tienen que tener los puertos 4444 y 5555 abiertos. En mi caso particular ambos puertos estaban capados por el firewall de windows.

viernes, 17 de junio de 2016

Git, salvar credenciales

Para que git guarde credenciales:
 
git config --global credential.helper wincred
 

Podam con máximo de elementos por array

DataProviderStrategy strategy = new RandomDataProviderStrategyImpl();
strategy.setMemoization(true);
strategy.setDefaultNumberOfCollectionElements(3);
return new PodamFactoryImpl(strategy);

jueves, 16 de junio de 2016

Selenium con Junit instalación y ejemplo de uso

Qué es Selenium 

(De la wikipedia) Selenium es un entorno de pruebas de software para aplicaciones basadas en la web. Selenium provee una herramienta de grabar/reproducir para crear pruebas sin usar un lenguaje de scripting para pruebas (Selenium IDE). Incluye también un lenguaje específico de dominio para pruebas (Selanese) para escribir pruebas en un amplio número de lenguajes de programación populares incluyendo Java, C#, Ruby, Groovy, Perl, Php y Python. Las pruebas pueden ejecutarse entonces usando la mayoría de los navegadores web modernos en diferentes sistemas operativos como Windows, Linux y OSX. Para más info: http://www.seleniumhq.org/

Requisitos previos 


 El ejemplo de uso utilizará Firefox como navegador, suele pasar que para la última versión de un navegador aún no existen librerías de Selenium adaptadas.

En este ejemplo usaremos la versión 46, que en el momento del tutorial era la última que funcionaba correctamente.
Enlace: https://ftp.mozilla.org/pub/firefox/releases/46.0.1/
Para que selenium se ejecute sin problemas, tanto ejecutando un test junit manualmente como utilizando maven es necesario que la carpeta del ejecutable de Firefox se encuentre en el PATH del sistema.
Ejemplo para windows:
Abrir consola: cmd
Añadir al path el directorio de instalación: set PATH=%PATH%;C:\Firefox

Clases

Ejemplo de clase Parent, nuestras clases de tests extenderán de ésta, un ejemplo de método que ejecuta Selenium es el método login:

 public abstract class SeleniumParent {  
      @Rule  
      public TestName name = new TestName();  
      public WebDriver driver;  
      public final static String BASEURL = "http://localhost:8080/";  
      public static String pathScreenShots;  
      @BeforeClass  
      public static void beforeClass() {  
           pathScreenShots = "./target/screenshots/" + new SimpleDateFormat("ddMMyyyy_HHmmss").format(new Date()) + "/";  
      }  
      @Before  
      public void before() throws Exception {  
           driver = new FirefoxDriver();  
           driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);  
      }  
      @After  
      public void after() throws Exception {  
           driver.quit();  
      }  
      public boolean isElementPresent(By by) {  
           try {  
                driver.findElement(by);  
                return true;  
           } catch (NoSuchElementException e) {  
                return false;  
           }  
      }  
      public String captureScreen() {  
           try {  
                File source = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);  
                FileUtils.copyFile(source, new File(pathScreenShots + name.getMethodName() + "/" + source.getName()));  
           } catch (IOException e) {  
                pathScreenShots = "Failed to capture screenshot: " + e.getMessage();  
           }  
           return pathScreenShots;  
      }  
      public void login(String user, String password) {  
           driver.get(BASEURL + "MIAPP/");  
           driver.findElement(By.id("user_field")).sendKeys(user);  
           driver.findElement(By.id("password_field")).sendKeys(password);  
           captureScreen();  
           driver.findElement(By.id("login_button")).sendKeys(Keys.ENTER);  
      }  

      public void validateInitialOk() {  
           if (isElementPresent(By.className("title_page"))) {  
                captureScreen();  
                Assert.assertTrue(isElementPresent(By.className("title_page")));  
           } else {  
                Assert.fail("Titles is not present");  
           }  
      }  

 }  

Un ejemplo de clase de test sería éste:

 public class SeleniumExample extends SeleniumParent {  
      @Test  
      public void testLoginFrontOk() throws Exception {  
           login("raulito", "raulito123");  
           validateInitialOk();  
      }  
 }  

De esta manera abstraeríamos la gran mayoria de "procesos" de los propios tests, dejando algo muy visual, intuitivo y reutilizable. En el ejemplo se ve que se ejecuta el login de la aplicación y se pasan las validaciones pertinentes de forma rápida.
Inicialmente los métodos login y validateInitialOk están en el parent por "comodidad" para el ejemplo. La división en otras clases, tanto clases de validación o clases de funcionalidad ya sería otro tema.

 Ejecución de un test Selenium 


 Previo a ejecutar un test de Selenium se necesita que esté levantada la aplicación en local y sea accesible por “http://localhost:8080/miapp/”. Esta ruta inicialmente está añadida directamente en código, se podría hacer que dependiera de un parámetro de entorno y así poder lanzar los tests contra diferentes estancias de la aplicación, en local,test,etc...

Manual desde el IDE 

Una vez levantada la aplicación en local se puede ejecutar el test de forma manual desde el IDE. Se verá como se abren ventanas de Firefox y como se está navegando por ellas. Lo interesante de realizar los tests Selenium mediante Junit es que la validación de campos es mucho más fácil de realizar que utilizando el plugin de los navegadores.

Utilizando Maven 

 El ejemplo inicial se ha llamado SeleniumExample.java a propósito, si el nombre de la clase no contiene la palabra “Test” el plugin maven-surefire-plugin, el que ejecuta los tests unitarios, no llama a esta clase. Bastaría con cambiar el nombre de esta clase a SeleniumExampleTest.java y al ejecutar mvn clean test se vería como se ejecutan los tests Selenium correctamente.

jueves, 14 de abril de 2016

Eclipse no encuentra tools 1.5.0

Solución:
Descargar http://repository.ops4j.org/maven2/tools/tools/1.5.0/ 
Ponerlo en c:
Ejecutar 
mvn install:install-file -Dfile=C:\tools-1.5.0.jar -DgroupId=com.sun -DartifactId=tools -Dversion=1.5.0 -Dpackaging=jar

Añadir en las librerias de la jdk de eclipse el jar