SlideShare une entreprise Scribd logo
1  sur  49
http://extrema-sistemas.com




Prueba de aplicaciones web con

Selenium 2 y WebDriver
David Gómez
Pruebas de aplicaciones web


Pruebas unitarias.
Pruebas de integración.
Pruebas end-to-end.




                              2
Pruebas end-to-end



La visión del usuario
Distintos navegadores
Rich Web Applications
  - Ajax y JavaScript




                           3
Selenium




Herramienta para pruebas funcionales desde
        la perspectiva del usuario.




                                             4
Componentes
Selenium Core
  - Motor de ejecución empotrado en el Navegador


Selenium IDE
  - Herramienta para grabar los tests en HTML


Selenium RC (Remote Control)
  - Tests escritos en Java, Ruby, Python, Perl, PHP...
                                                         5
Selenium IDE




      FireFox plugin que graba
          y ejecuta los tests.




                                 6
Selenium
Test Cases y Test Suites en formato HTML.




                                            7
Selenium
Test Cases y Test Suites en formato HTML.
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="content-type" />
    <title>Test Suite</title>
  </head>
  <body>
  	   <table id="suiteTable" cellpadding="1" cellspacing="1" border="1"
  class="selenium">
  	   <tbody>
  	   	    <tr><td><b>Test Suite</b></td></tr>
  	   	    <tr><td><a href="CreateShowTest">CreateShowTest</a></td></tr>
  	   	    <tr><td><a href="DeleteShowTest">DeleteShowTest</a></td></tr>
  	   </tbody>
  	   </table>
  </body>
  </html>



                                                                            7
Selenium
Test Cases y Test Suites en formato HTML.
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <body>
  <head> cellpadding="1" cellspacing="1" border="1">
    <table
    	<meta content="text/html; charset=UTF-8" http-equiv="content-type" />
         <thead><tr><td rowspan="1" colspan="3">CreateShowTest</td></tr></thead>
    	<title>Test Suite</title>
         <tbody>
  </head>
    	    	    <tr>
    	
  <body> 	    	    <td>open</td>
  	 	 <table id="suiteTable" cellpadding="1" cellspacing="1" border="1"
         	    	    <td>/home/</td>
    	    	    	    <td></td>
  class="selenium">
    	    	    </tr>
  	    <tbody>
    	    	    <tr>
  	 	 	 	 <tr><td><b>Test Suite</b></td></tr>
              	    <td>waitForElementPresent</td>
  	 	 	 	 <tr><td><a href="CreateShowTest">CreateShowTest</a></td></tr>
              	    <td>link=Crear nuevo evento</td>
  	 	 	 	 <tr><td><a href="DeleteShowTest">DeleteShowTest</a></td></tr>
              	    <td></td>
  	 	 </tbody>
         	    </tr>
  	 	 </table>
         	    <tr>
    	
  </body>	    	    <td>clickAndWait</td>
    	    	    	    <td>link=Crear nuevo evento</td>
  </html>
   	    	   	    <td></td>
   	    	   </tr>
   </tbody></table></body>
                                                                                   7
Limitaciones


Pruebas limitadas a acciones de usuario.
No soporta:
  - Condiciones
  - Iteración
  - Trazas y generación de informes
  - Etc...

                                           8
Selenium RC.

public class LoginTestCase extends SeleneseTestCase {

	   public void setUp() throws Exception {
	   	    setUp("http://localhost:8888/", "*firefox");
	   }

	   public void testLoginTestCase() throws Exception {
	   	    selenium.open("/home/");
	   	    verifyTrue(selenium.isElementPresent("logout-link"));
	   	    selenium.click("logout-link");
	   	    selenium.waitForPageToLoad("30000");
	   	    verifyTrue(selenium.isElementPresent("login-link"));
	   }

}




                                                                 9
Selenium RC.

public class LoginTestCase extends SeleneseTestCase {
                                                                 Navegadores:
	   public void setUp() throws Exception {
	   	    setUp("http://localhost:8888/", "*firefox");            *chrome
	   }                                                            *firefox
                                                                 *iexplore
	   public void testLoginTestCase() throws Exception {
	   	    selenium.open("/home/");
	   	    verifyTrue(selenium.isElementPresent("logout-link"));
	   	    selenium.click("logout-link");
	   	    selenium.waitForPageToLoad("30000");
	   	    verifyTrue(selenium.isElementPresent("login-link"));
	   }

}




                                                                                9
Selenium RC.

public class LoginTestCase extends SeleneseTestCase {
                                                                 Navegadores:
	   public void setUp() throws Exception {
	   	    setUp("http://localhost:8888/", "*firefox");            *chrome
	   }                                                            *firefox
                                                                 *iexplore
	   public void testLoginTestCase() throws Exception {
	   	    selenium.open("/home/");
	   	    verifyTrue(selenium.isElementPresent("logout-link"));
	   	    selenium.click("logout-link");
	   	    selenium.waitForPageToLoad("30000");
	   	    verifyTrue(selenium.isElementPresent("login-link"));
	   }

}


      Selenium IDE permite generar el test Junit desde el script HTML



                                                                                9
Arquitectura de Selenium RC




                              10
Selenium 2 y WebDriver




                         11
Selenium 2 y WebDriver


Selenium: JavaScript dentro del navegador.
WebDriver: componente específico
  - Firefox: JavaScript en un componente XPCOM.
  - IE: Uso del API de Automatización C++
  - Chrome: Extensión con JavaScript V8



                                                  12
Para empezar

                                                     Maven: pom.xml
<project>
       [...]
	    <dependencies>
	    	    <dependency>
	    	    	    <groupId>org.seleniumhq.selenium</groupId>
	    	    	    <artifactId>selenium</artifactId>
	    	    	    <version>2.0b2</version>
	    	    </dependency>

	    	    <dependency>
	    	    	    <groupId>org.seleniumhq.selenium</groupId>
	    	    	    <artifactId>selenium-server</artifactId>
	    	    	    <version>2.0b2</version>
	    	    </dependency>
	    </dependencies>
       [...]
</project>




                                                                      13
Driver

Componente que representa el navegador
   public class SimpleTest {

   	   private WebDriver driver = null;

   	   @Before
   	   public void create() {
   	   	    driver = new FirefoxDriver();
   	   }

   }




                                            14
Implementaciones




                   15
Implementaciones




driver = new HtmlUnitDriver();




                                 15
Implementaciones




driver = new HtmlUnitDriver();   driver = new FirefoxDriver();




                                                                 15
Implementaciones




   driver = new HtmlUnitDriver();        driver = new FirefoxDriver();




driver = new InternetExplorerDriver();



                                                                         15
Implementaciones




   driver = new HtmlUnitDriver();        driver = new FirefoxDriver();




driver = new InternetExplorerDriver();   driver = new ChromeDriver();



                                                                         15
Implementaciones




   driver = new HtmlUnitDriver();        driver = new FirefoxDriver();




driver = new InternetExplorerDriver();   driver = new ChromeDriver();



                                                                         15
Page Object Model
La forma de interactuar con WebDriver
        driver.get("http://localhost:8888/home");




                                                    16
Page Object Model
La forma de interactuar con WebDriver
        driver.get("http://localhost:8888/home");




                                                    16
Page Object Model
La forma de interactuar con WebDriver
        driver.get("http://localhost:8888/home");




                               - Localizar un
                                 elemento
                               - Invocar una acción
                               - Comprobar
                                 propiedades ‘visuales’


                                                          16
Elementos de página




WebElement header = driver.findElement({Locator});
List<WebElement> shows = driver.findElements({Locator});




                                                           17
Locator: By


public static By id(java.lang.String id)

public static By linkText(java.lang.String linkText)

public   static By name(java.lang.String name)
	
public
      Clase de métodos estáticos
         static By partialLinkText(java.lang.String linkText)
	    con la estrategia de selección.
publicstatic By tagName(java.lang.String name)
	
public   static By xpath(java.lang.String xpathExpression)

public static By cssSelector(java.lang.String name)




                                                                18
WebElement


Componentes devueltos por findElement()

WebElement header = driver.findElement(By.cssSelector("#header"));
List<WebElement> shows = driver.findElements(By.cssSelector("ul.data li"));




                                                                              19
WebElement
List<WebElement> shows = driver.findElements(By.cssSelector("ul.data li"));
WebElement show = shows.get(0);
show.findElement(By.cssSelector(".contents h3 a")).click();




                                                                              20
WebElement
List<WebElement> shows = driver.findElements(By.cssSelector("ul.data li"));
WebElement show = shows.get(0);
show.findElement(By.cssSelector(".contents h3 a")).click();



                                            <div class="grid_2 alpha">
                                            	    <a title="Gervasio Sánchez. Desaparecidos"
                                            	    	     href="...">
                                            	    	     <img src="..." class="thumbnail">
                                            	    </a>
                                            	    <div class="small">{...}</div>
                                            </div>
                                            <div class="contents grid_4 omega">
                                            	    <h3>
                                                     <a href="...">
                                            	    	     Gervasio Sánchez. Desaparecidos
                                            	         </a>
                                                 </h3>
                                            	    <div class="author">
                                                       by
                                                       <a href="...">test@example.com</a>
                                                       hace 1 minuto</div>
                                            	    <div class="description">{...}</div>
                                                 <a href="..."
                                            	    class="button toright">» Comprar ahora</a>
                                            </div>
                                                                                          20
WebElement
List<WebElement> shows = driver.findElements(By.cssSelector("ul.data li"));
WebElement show = shows.get(0);
show.findElement(By.cssSelector(".contents h3 a")).click();



                                            <div class="grid_2 alpha">
                                            	    <a title="Gervasio Sánchez. Desaparecidos"
                                            	    	     href="...">
                                            	    	     <img src="..." class="thumbnail">
                                            	    </a>
                                            	    <div class="small">{...}</div>
                                            </div>
                                            <div class="contents grid_4 omega">
                                            	    <h3>
                                                     <a href="...">
                                            	    	     Gervasio Sánchez. Desaparecidos
                                            	         </a>
                                                 </h3>
                                            	    <div class="author">
                                                       by
                                                       <a href="...">test@example.com</a>
                                                       hace 1 minuto</div>
                                            	    <div class="description">{...}</div>
                                                 <a href="..."
                                            	    class="button toright">» Comprar ahora</a>
                                            </div>
                                                                                          20
Acciones

public interface WebElement extends SearchContext {
	
  void click();
  void submit();
  void sendKeys(CharSequence... keysToSend);
  String getAttribute(String name);
  ...

    List<WebElement> findElements(By by);
    WebElement findElement(By by);

}




                                                      21
RenderedWebElement
Consultar propiedades visuales
Operaciones de drag and drop.
Simula el movimiento del ratón (hover)

List<WebElement> shows = driver.findElements(By.cssSelector("ul.data li"));
WebElement show = shows.get(0);
Dimension size = ((RenderedWebElement) show).getSize()




                                                                              22
RenderedWebElement
Consultar propiedades visuales
Operaciones de drag and drop.
Simula el movimiento del ratón (hover)

List<WebElement> shows = driver.findElements(By.cssSelector("ul.data li"));
WebElement show = shows.get(0);
Dimension size = ((RenderedWebElement) show).getSize()

                                java.awt.Dimension[width=460,height=141]




                                                                              22
Page Object Pattern




                      23
Page Object Pattern




Crea un objeto que encapsula la página
            con un API específico




                                         24
PageObject Pattern

•




                         25
PageObject Pattern
           public class KoliseoHomePage extends KoliseoPage {

           	   private WebElement showList;
•          	
           	   public ShowThumbnail getShow(int pos) {

           	   }
           	
           	   public KoliseoPage clickOnShow(int pos) {

           	   }
           	
           	   public KoliseoPage buyTickets(int pos) {

           	   }

           }




                                                                25
PageObject Pattern
           public class KoliseoHomePage extends KoliseoPage {

           	 public class ShowThumbnail {
               private WebElement showList;
•          	
           	 	 public ShowThumbnail getShow(int pos) {
                  private final WebElement title;
             	    private final WebElement description;
           	 	 } private final WebElement buyButton;
           	 	
           	 	 public KoliseoPage clickOnShow(int pos) {
                  public String getTitle() {
             	    	    return title.getText();
           	 	 } }
           	 	
           	 	 public KoliseoPage buyTickets(int pos) {
                  public void navigate() {
             	    	    title.click();
           	 	 } }
             	
           } 	    public void buy() {
             	    	    buyButton.click();
             	    }
             	
             }



                                                                25
PageFactory



Crea un PageObject a partir de la página actual.
 driver.get(“http://localhost:8888/home”);
 KoliseoHomePage home = PageFactory.initElements(driver, KoliseoHomePage.class);




                                                                                   26
@FindBy
@FindBy para configuración específica.
  - Por defecto utiliza el #id
     public class KoliseoHomePage extends KoliseoPage {

     	   @FindBy(css=".shows ul.data")
     	   private WebElement showList;
     	
     	   @FindBy(css=".activities ul.data")
     	   private WebElement activities;
     	
     	   public KoliseoHomePage(WebDriver driver) {
     	   	    super(driver);
     	   }
     }




                                                          27
@FindBy
@FindBy para configuración específica.
  - Por defecto utiliza el #id
     public class KoliseoHomePage extends KoliseoPage {

     	   @FindBy(css=".shows ul.data")                    id
     	   private WebElement showList;                     name
     	                                                    className
     	   @FindBy(css=".activities ul.data")               css
     	   private WebElement activities;                   tagName
     	                                                    linkText
     	   public KoliseoHomePage(WebDriver driver) {       partialLinkText
     	   	    super(driver);                              xpath
     	   }
     }




                                                                            27
KoliseoHomePage
public class KoliseoHomePage extends KoliseoPage {

	   @FindBy(css=".shows ul.data")
	   private WebElement showList;

	   public ShowThumbnail getShow(int pos) {
	   	    List<WebElement> shows = showList.findElements(By.tagName("li"));
         WebElement show = shows.get(pos);
	   	    return new ShowThumbnail(driver, show);
	   }
	
	   public KoliseoShowDetailPage clickOnShow(int pos) {
	   	    ShowThumbnail show = this.getShow(pos);
         show.navigate();
	   	    return PageFactory.initElements(driver, KoliseoShowDetailPage.class);
	   }

}




                                                                                 28
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:springio-webdriver-test.xml")
public class KoliseoHomeTest {

	   @Autowired(required=false)
    private WebDriver driver = new HtmlUnitDriver();

	   private KoliseoHomePage home;
	
	   @Before
	   public void setUp() {
	   	    driver.get(“http://localhost:8888/home);
	   	    home = PageFactory.initElements(driver, KoliseoHomePage.class);
	   }

	   @After
	   public void tearDown() {
	   	    driver.quit();
	   }

	   @Test
	   public void showDetail() {
	   	    assertTrue(home.hasShows());
	   	    String showTitle = home.getShow(1).getTitle();
	   	    KoliseoShowDetailPage showDetail = home.clickOnShow(1);
	   	    assertEquals(showTitle, showDetail.getTitle());
	   }	
}

                                                                           29
Show time!




             30
Conclusiones

Selenium IDE: Scripts HTML
Selenium RC: Código procedural en Java
Selenium 2 - WebDriver: Driver para el
 Browser
  - Código OO para nuestras páginas
  - Page Object Pattern: Nuestros APIs
     sobre WebDriver


                                         31
Q&A




      32

Contenu connexe

Tendances

Architecture java j2 ee a partager
Architecture java j2 ee a partagerArchitecture java j2 ee a partager
Architecture java j2 ee a partageraliagadir
 
Asp.net mvc filters
Asp.net mvc filtersAsp.net mvc filters
Asp.net mvc filtersEyal Vardi
 
Angular 4 The new Http Client Module
Angular 4 The new Http Client ModuleAngular 4 The new Http Client Module
Angular 4 The new Http Client Modulearjun singh
 
Android webservices
Android webservicesAndroid webservices
Android webservicesKrazy Koder
 
Build RESTful API Using Express JS
Build RESTful API Using Express JSBuild RESTful API Using Express JS
Build RESTful API Using Express JSCakra Danu Sedayu
 
Understanding react hooks
Understanding react hooksUnderstanding react hooks
Understanding react hooksSamundra khatri
 
Mastering the Sling Rewriter
Mastering the Sling RewriterMastering the Sling Rewriter
Mastering the Sling RewriterJustin Edelson
 
Kiss PageObjects [01-2017]
Kiss PageObjects [01-2017]Kiss PageObjects [01-2017]
Kiss PageObjects [01-2017]Iakiv Kramarenko
 
AEM & eCommerce integration
AEM & eCommerce integrationAEM & eCommerce integration
AEM & eCommerce integrationLokesh BS
 
SignalR for ASP.NET Developers
SignalR for ASP.NET DevelopersSignalR for ASP.NET Developers
SignalR for ASP.NET DevelopersShivanand Arur
 
L'API Collector dans tous ses états
L'API Collector dans tous ses étatsL'API Collector dans tous ses états
L'API Collector dans tous ses étatsJosé Paumard
 
Postman Collection Format v2.0 (pre-draft)
Postman Collection Format v2.0 (pre-draft)Postman Collection Format v2.0 (pre-draft)
Postman Collection Format v2.0 (pre-draft)Postman
 
Hibernate Basic Concepts - Presentation
Hibernate Basic Concepts - PresentationHibernate Basic Concepts - Presentation
Hibernate Basic Concepts - PresentationKhoa Nguyen
 

Tendances (20)

react-slides.pptx
react-slides.pptxreact-slides.pptx
react-slides.pptx
 
Architecture java j2 ee a partager
Architecture java j2 ee a partagerArchitecture java j2 ee a partager
Architecture java j2 ee a partager
 
Asp.net mvc filters
Asp.net mvc filtersAsp.net mvc filters
Asp.net mvc filters
 
Node.js Express Framework
Node.js Express FrameworkNode.js Express Framework
Node.js Express Framework
 
Angular 4 The new Http Client Module
Angular 4 The new Http Client ModuleAngular 4 The new Http Client Module
Angular 4 The new Http Client Module
 
Android webservices
Android webservicesAndroid webservices
Android webservices
 
Angular
AngularAngular
Angular
 
Build RESTful API Using Express JS
Build RESTful API Using Express JSBuild RESTful API Using Express JS
Build RESTful API Using Express JS
 
NestJS
NestJSNestJS
NestJS
 
Understanding react hooks
Understanding react hooksUnderstanding react hooks
Understanding react hooks
 
Mastering the Sling Rewriter
Mastering the Sling RewriterMastering the Sling Rewriter
Mastering the Sling Rewriter
 
Kiss PageObjects [01-2017]
Kiss PageObjects [01-2017]Kiss PageObjects [01-2017]
Kiss PageObjects [01-2017]
 
AEM & eCommerce integration
AEM & eCommerce integrationAEM & eCommerce integration
AEM & eCommerce integration
 
PHP filter
PHP filterPHP filter
PHP filter
 
SignalR for ASP.NET Developers
SignalR for ASP.NET DevelopersSignalR for ASP.NET Developers
SignalR for ASP.NET Developers
 
Express JS
Express JSExpress JS
Express JS
 
L'API Collector dans tous ses états
L'API Collector dans tous ses étatsL'API Collector dans tous ses états
L'API Collector dans tous ses états
 
Ajax Ppt 1
Ajax Ppt 1Ajax Ppt 1
Ajax Ppt 1
 
Postman Collection Format v2.0 (pre-draft)
Postman Collection Format v2.0 (pre-draft)Postman Collection Format v2.0 (pre-draft)
Postman Collection Format v2.0 (pre-draft)
 
Hibernate Basic Concepts - Presentation
Hibernate Basic Concepts - PresentationHibernate Basic Concepts - Presentation
Hibernate Basic Concepts - Presentation
 

En vedette

Automatización de pruebas funcionales
Automatización de pruebas funcionalesAutomatización de pruebas funcionales
Automatización de pruebas funcionalesVicenç García-Altés
 
Pruebas Automatizadas
Pruebas AutomatizadasPruebas Automatizadas
Pruebas AutomatizadasAngel Nuñez
 
Tipos de pruebas de software
Tipos de pruebas de softwareTipos de pruebas de software
Tipos de pruebas de softwareGuillermo Lemus
 
Automatizacion De Pruebas De Software
Automatizacion De Pruebas De SoftwareAutomatizacion De Pruebas De Software
Automatizacion De Pruebas De SoftwareRubiano
 
Mejores prácticas para testing de aplicaciones
Mejores prácticas para testing de aplicacionesMejores prácticas para testing de aplicaciones
Mejores prácticas para testing de aplicacionesSoftware Guru
 
Testing técnico - Automatización en web y mobile para pruebas funcionales y p...
Testing técnico - Automatización en web y mobile para pruebas funcionales y p...Testing técnico - Automatización en web y mobile para pruebas funcionales y p...
Testing técnico - Automatización en web y mobile para pruebas funcionales y p...Abstracta
 
¿Cómo convertirse en un Tester de verdad?
¿Cómo convertirse en un Tester de verdad?¿Cómo convertirse en un Tester de verdad?
¿Cómo convertirse en un Tester de verdad?Software Guru
 
Camino para una_mejor_programacion
Camino para una_mejor_programacionCamino para una_mejor_programacion
Camino para una_mejor_programacioncoveco
 
Você ainda não pratica TDD?
Você ainda não pratica TDD?Você ainda não pratica TDD?
Você ainda não pratica TDD?Maurício Aniche
 
Automatizacion de pruebas de software
Automatizacion de pruebas de softwareAutomatizacion de pruebas de software
Automatizacion de pruebas de softwareDavid Thomas
 
Taller cultura de calidad chimbote final
Taller cultura de calidad   chimbote finalTaller cultura de calidad   chimbote final
Taller cultura de calidad chimbote finalJorge Salas Ruiz
 
El Juego De Los Colores
El Juego De Los ColoresEl Juego De Los Colores
El Juego De Los Coloresmaveir
 
Creación de Frameworks para Automation: Las básicas (meet up automation UY Ag...
Creación de Frameworks para Automation: Las básicas (meet up automation UY Ag...Creación de Frameworks para Automation: Las básicas (meet up automation UY Ag...
Creación de Frameworks para Automation: Las básicas (meet up automation UY Ag...Edgardo Crovetto
 
La micea en la universidad cooperativa de colombia
La micea en la universidad cooperativa de colombiaLa micea en la universidad cooperativa de colombia
La micea en la universidad cooperativa de colombiajohnmario2501
 
15 16 keynote transición-desarrollador_líder
15 16 keynote transición-desarrollador_líder15 16 keynote transición-desarrollador_líder
15 16 keynote transición-desarrollador_líderSoftware Guru
 
Los Pecados Capitales en la Automatización de Pruebas de Software.
Los Pecados Capitales en la Automatización de Pruebas de Software.Los Pecados Capitales en la Automatización de Pruebas de Software.
Los Pecados Capitales en la Automatización de Pruebas de Software.Software Guru
 
Prueba aplicaciones web
Prueba aplicaciones webPrueba aplicaciones web
Prueba aplicaciones webDavid Recio
 
Alta automatización de pruebas de calidad de software, cambio de paradigmas
Alta automatización de pruebas de calidad de software, cambio de paradigmasAlta automatización de pruebas de calidad de software, cambio de paradigmas
Alta automatización de pruebas de calidad de software, cambio de paradigmasSoftware Guru
 

En vedette (20)

Automatización de pruebas funcionales
Automatización de pruebas funcionalesAutomatización de pruebas funcionales
Automatización de pruebas funcionales
 
Pruebas Automatizadas
Pruebas AutomatizadasPruebas Automatizadas
Pruebas Automatizadas
 
Tipos de pruebas de software
Tipos de pruebas de softwareTipos de pruebas de software
Tipos de pruebas de software
 
Automatizacion De Pruebas De Software
Automatizacion De Pruebas De SoftwareAutomatizacion De Pruebas De Software
Automatizacion De Pruebas De Software
 
Mejores prácticas para testing de aplicaciones
Mejores prácticas para testing de aplicacionesMejores prácticas para testing de aplicaciones
Mejores prácticas para testing de aplicaciones
 
Testing técnico - Automatización en web y mobile para pruebas funcionales y p...
Testing técnico - Automatización en web y mobile para pruebas funcionales y p...Testing técnico - Automatización en web y mobile para pruebas funcionales y p...
Testing técnico - Automatización en web y mobile para pruebas funcionales y p...
 
¿Cómo convertirse en un Tester de verdad?
¿Cómo convertirse en un Tester de verdad?¿Cómo convertirse en un Tester de verdad?
¿Cómo convertirse en un Tester de verdad?
 
Camino para una_mejor_programacion
Camino para una_mejor_programacionCamino para una_mejor_programacion
Camino para una_mejor_programacion
 
Você ainda não pratica TDD?
Você ainda não pratica TDD?Você ainda não pratica TDD?
Você ainda não pratica TDD?
 
Automatizacion de pruebas de software
Automatizacion de pruebas de softwareAutomatizacion de pruebas de software
Automatizacion de pruebas de software
 
Taller cultura de calidad chimbote final
Taller cultura de calidad   chimbote finalTaller cultura de calidad   chimbote final
Taller cultura de calidad chimbote final
 
Prueba yamarie
Prueba yamariePrueba yamarie
Prueba yamarie
 
El Juego De Los Colores
El Juego De Los ColoresEl Juego De Los Colores
El Juego De Los Colores
 
Creación de Frameworks para Automation: Las básicas (meet up automation UY Ag...
Creación de Frameworks para Automation: Las básicas (meet up automation UY Ag...Creación de Frameworks para Automation: Las básicas (meet up automation UY Ag...
Creación de Frameworks para Automation: Las básicas (meet up automation UY Ag...
 
La micea en la universidad cooperativa de colombia
La micea en la universidad cooperativa de colombiaLa micea en la universidad cooperativa de colombia
La micea en la universidad cooperativa de colombia
 
15 16 keynote transición-desarrollador_líder
15 16 keynote transición-desarrollador_líder15 16 keynote transición-desarrollador_líder
15 16 keynote transición-desarrollador_líder
 
Los Pecados Capitales en la Automatización de Pruebas de Software.
Los Pecados Capitales en la Automatización de Pruebas de Software.Los Pecados Capitales en la Automatización de Pruebas de Software.
Los Pecados Capitales en la Automatización de Pruebas de Software.
 
Prueba aplicaciones web
Prueba aplicaciones webPrueba aplicaciones web
Prueba aplicaciones web
 
Alta automatización de pruebas de calidad de software, cambio de paradigmas
Alta automatización de pruebas de calidad de software, cambio de paradigmasAlta automatización de pruebas de calidad de software, cambio de paradigmas
Alta automatización de pruebas de calidad de software, cambio de paradigmas
 
Elm 101
Elm 101Elm 101
Elm 101
 

Similaire à Selenium pruebas web

Apache click
Apache clickApache click
Apache clickntomasto
 
Taller integracion jsf spring
Taller integracion jsf springTaller integracion jsf spring
Taller integracion jsf springIBM
 
Mootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSMootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSIan Monge Pérez
 
Esencia de web components
Esencia de web componentsEsencia de web components
Esencia de web componentsPedro J. Molina
 
5. Curso Java Struts I (Framework para Java) - Curso 2005-2006
5. Curso Java Struts I (Framework para Java) - Curso 2005-20065. Curso Java Struts I (Framework para Java) - Curso 2005-2006
5. Curso Java Struts I (Framework para Java) - Curso 2005-2006Samuel Marrero
 
Esencia de Web Components
Esencia de Web ComponentsEsencia de Web Components
Esencia de Web ComponentsPedro J. Molina
 
15a. Reunion de SpringHispano.org y grails.org.mx
15a. Reunion de SpringHispano.org y grails.org.mx15a. Reunion de SpringHispano.org y grails.org.mx
15a. Reunion de SpringHispano.org y grails.org.mxJose Juan R. Zuñiga
 
Servlet Hola Mundo con Eclipse y Tomcat
Servlet Hola Mundo con Eclipse y TomcatServlet Hola Mundo con Eclipse y Tomcat
Servlet Hola Mundo con Eclipse y Tomcatjubacalo
 
Programacion web java
Programacion web javaProgramacion web java
Programacion web javaCésar Ocampo
 
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8Sorey García
 

Similaire à Selenium pruebas web (20)

Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Test Automation using seleniun webdrive.pdf
Test Automation using seleniun webdrive.pdfTest Automation using seleniun webdrive.pdf
Test Automation using seleniun webdrive.pdf
 
Gwt III - Avanzado
Gwt III - AvanzadoGwt III - Avanzado
Gwt III - Avanzado
 
Apache click
Apache clickApache click
Apache click
 
Taller integracion jsf spring
Taller integracion jsf springTaller integracion jsf spring
Taller integracion jsf spring
 
Mootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSMootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JS
 
Esencia de web components
Esencia de web componentsEsencia de web components
Esencia de web components
 
5. Curso Java Struts I (Framework para Java) - Curso 2005-2006
5. Curso Java Struts I (Framework para Java) - Curso 2005-20065. Curso Java Struts I (Framework para Java) - Curso 2005-2006
5. Curso Java Struts I (Framework para Java) - Curso 2005-2006
 
Esencia de Web Components
Esencia de Web ComponentsEsencia de Web Components
Esencia de Web Components
 
Manual Basico De Struts
Manual Basico De StrutsManual Basico De Struts
Manual Basico De Struts
 
15a. Reunion de SpringHispano.org y grails.org.mx
15a. Reunion de SpringHispano.org y grails.org.mx15a. Reunion de SpringHispano.org y grails.org.mx
15a. Reunion de SpringHispano.org y grails.org.mx
 
Introducción a Flask
Introducción a FlaskIntroducción a Flask
Introducción a Flask
 
Curso AngularJS - 7. temas avanzados
Curso AngularJS - 7. temas avanzadosCurso AngularJS - 7. temas avanzados
Curso AngularJS - 7. temas avanzados
 
De HTML a Express
De HTML a ExpressDe HTML a Express
De HTML a Express
 
Servlet Hola Mundo con Eclipse y Tomcat
Servlet Hola Mundo con Eclipse y TomcatServlet Hola Mundo con Eclipse y Tomcat
Servlet Hola Mundo con Eclipse y Tomcat
 
Programacion web java
Programacion web javaProgramacion web java
Programacion web java
 
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8
 

Plus de David Gómez García

Leverage CompletableFutures to handle async queries. DevNexus 2022
Leverage CompletableFutures to handle async queries. DevNexus 2022Leverage CompletableFutures to handle async queries. DevNexus 2022
Leverage CompletableFutures to handle async queries. DevNexus 2022David Gómez García
 
Building Modular monliths that could scale to microservices (only if they nee...
Building Modular monliths that could scale to microservices (only if they nee...Building Modular monliths that could scale to microservices (only if they nee...
Building Modular monliths that could scale to microservices (only if they nee...David Gómez García
 
Building modular monoliths that could scale to microservices (only if they ne...
Building modular monoliths that could scale to microservices (only if they ne...Building modular monoliths that could scale to microservices (only if they ne...
Building modular monoliths that could scale to microservices (only if they ne...David Gómez García
 
Leveraging Completable Futures to handle your query results Asynchrhonously
Leveraging Completable Futures to handle your query results AsynchrhonouslyLeveraging Completable Futures to handle your query results Asynchrhonously
Leveraging Completable Futures to handle your query results AsynchrhonouslyDavid Gómez García
 
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021David Gómez García
 
Cdm mil-18 - hypermedia ap is for headless platforms and data integration
Cdm mil-18 - hypermedia ap is for headless platforms and data integrationCdm mil-18 - hypermedia ap is for headless platforms and data integration
Cdm mil-18 - hypermedia ap is for headless platforms and data integrationDavid Gómez García
 
What's in a community like Liferay's
What's in a community like Liferay'sWhat's in a community like Liferay's
What's in a community like Liferay'sDavid Gómez García
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadJava9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadDavid Gómez García
 
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTRT3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTRDavid Gómez García
 
Managing user's data with Spring Session
Managing user's data with Spring SessionManaging user's data with Spring Session
Managing user's data with Spring SessionDavid Gómez García
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradleDavid Gómez García
 
Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.David Gómez García
 
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)David Gómez García
 
Measuring Code Quality in WTF/min.
Measuring Code Quality in WTF/min. Measuring Code Quality in WTF/min.
Measuring Code Quality in WTF/min. David Gómez García
 
El poder del creador de Software. Entre la ingeniería y la artesanía
El poder del creador de Software. Entre la ingeniería y la artesaníaEl poder del creador de Software. Entre la ingeniería y la artesanía
El poder del creador de Software. Entre la ingeniería y la artesaníaDavid Gómez García
 
HDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript ScriptingHDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript ScriptingDavid Gómez García
 

Plus de David Gómez García (20)

Leverage CompletableFutures to handle async queries. DevNexus 2022
Leverage CompletableFutures to handle async queries. DevNexus 2022Leverage CompletableFutures to handle async queries. DevNexus 2022
Leverage CompletableFutures to handle async queries. DevNexus 2022
 
Building Modular monliths that could scale to microservices (only if they nee...
Building Modular monliths that could scale to microservices (only if they nee...Building Modular monliths that could scale to microservices (only if they nee...
Building Modular monliths that could scale to microservices (only if they nee...
 
Building modular monoliths that could scale to microservices (only if they ne...
Building modular monoliths that could scale to microservices (only if they ne...Building modular monoliths that could scale to microservices (only if they ne...
Building modular monoliths that could scale to microservices (only if they ne...
 
Leveraging Completable Futures to handle your query results Asynchrhonously
Leveraging Completable Futures to handle your query results AsynchrhonouslyLeveraging Completable Futures to handle your query results Asynchrhonously
Leveraging Completable Futures to handle your query results Asynchrhonously
 
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021
 
Cdm mil-18 - hypermedia ap is for headless platforms and data integration
Cdm mil-18 - hypermedia ap is for headless platforms and data integrationCdm mil-18 - hypermedia ap is for headless platforms and data integration
Cdm mil-18 - hypermedia ap is for headless platforms and data integration
 
What's in a community like Liferay's
What's in a community like Liferay'sWhat's in a community like Liferay's
What's in a community like Liferay's
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadJava9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidad
 
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTRT3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
 
Managing user's data with Spring Session
Managing user's data with Spring SessionManaging user's data with Spring Session
Managing user's data with Spring Session
 
Parallel streams in java 8
Parallel streams in java 8Parallel streams in java 8
Parallel streams in java 8
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradle
 
Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.Java 8 Stream API. A different way to process collections.
Java 8 Stream API. A different way to process collections.
 
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
 
Measuring Code Quality in WTF/min.
Measuring Code Quality in WTF/min. Measuring Code Quality in WTF/min.
Measuring Code Quality in WTF/min.
 
Spring4 whats up doc?
Spring4 whats up doc?Spring4 whats up doc?
Spring4 whats up doc?
 
Gradle como alternativa a maven
Gradle como alternativa a mavenGradle como alternativa a maven
Gradle como alternativa a maven
 
El poder del creador de Software. Entre la ingeniería y la artesanía
El poder del creador de Software. Entre la ingeniería y la artesaníaEl poder del creador de Software. Entre la ingeniería y la artesanía
El poder del creador de Software. Entre la ingeniería y la artesanía
 
Geo-SentimentZ
Geo-SentimentZGeo-SentimentZ
Geo-SentimentZ
 
HDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript ScriptingHDTR images with Photoshop Javascript Scripting
HDTR images with Photoshop Javascript Scripting
 

Dernier

ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLAACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLAJAVIER SOLIS NOYOLA
 
MAYO 1 PROYECTO día de la madre el amor más grande
MAYO 1 PROYECTO día de la madre el amor más grandeMAYO 1 PROYECTO día de la madre el amor más grande
MAYO 1 PROYECTO día de la madre el amor más grandeMarjorie Burga
 
OCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VS
OCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VSOCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VS
OCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VSYadi Campos
 
Estrategia de prompts, primeras ideas para su construcción
Estrategia de prompts, primeras ideas para su construcciónEstrategia de prompts, primeras ideas para su construcción
Estrategia de prompts, primeras ideas para su construcciónLourdes Feria
 
Ley 21.545 - Circular Nº 586.pdf circular
Ley 21.545 - Circular Nº 586.pdf circularLey 21.545 - Circular Nº 586.pdf circular
Ley 21.545 - Circular Nº 586.pdf circularMooPandrea
 
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOSTEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOSjlorentemartos
 
Planificacion Anual 4to Grado Educacion Primaria 2024 Ccesa007.pdf
Planificacion Anual 4to Grado Educacion Primaria   2024   Ccesa007.pdfPlanificacion Anual 4to Grado Educacion Primaria   2024   Ccesa007.pdf
Planificacion Anual 4to Grado Educacion Primaria 2024 Ccesa007.pdfDemetrio Ccesa Rayme
 
CLASE - La visión y misión organizacionales.pdf
CLASE - La visión y misión organizacionales.pdfCLASE - La visión y misión organizacionales.pdf
CLASE - La visión y misión organizacionales.pdfJonathanCovena1
 
FORTI-MAYO 2024.pdf.CIENCIA,EDUCACION,CULTURA
FORTI-MAYO 2024.pdf.CIENCIA,EDUCACION,CULTURAFORTI-MAYO 2024.pdf.CIENCIA,EDUCACION,CULTURA
FORTI-MAYO 2024.pdf.CIENCIA,EDUCACION,CULTURAEl Fortí
 
Heinsohn Privacidad y Ciberseguridad para el sector educativo
Heinsohn Privacidad y Ciberseguridad para el sector educativoHeinsohn Privacidad y Ciberseguridad para el sector educativo
Heinsohn Privacidad y Ciberseguridad para el sector educativoFundación YOD YOD
 
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptx
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptxACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptx
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptxzulyvero07
 
plan de capacitacion docente AIP 2024 clllll.pdf
plan de capacitacion docente  AIP 2024          clllll.pdfplan de capacitacion docente  AIP 2024          clllll.pdf
plan de capacitacion docente AIP 2024 clllll.pdfenelcielosiempre
 
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdfCurso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdfFrancisco158360
 
Registro Auxiliar - Primaria 2024 (1).pptx
Registro Auxiliar - Primaria  2024 (1).pptxRegistro Auxiliar - Primaria  2024 (1).pptx
Registro Auxiliar - Primaria 2024 (1).pptxFelicitasAsuncionDia
 
2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdf2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdfBaker Publishing Company
 
Lecciones 05 Esc. Sabática. Fe contra todo pronóstico.
Lecciones 05 Esc. Sabática. Fe contra todo pronóstico.Lecciones 05 Esc. Sabática. Fe contra todo pronóstico.
Lecciones 05 Esc. Sabática. Fe contra todo pronóstico.Alejandrino Halire Ccahuana
 
Planificacion Anual 2do Grado Educacion Primaria 2024 Ccesa007.pdf
Planificacion Anual 2do Grado Educacion Primaria   2024   Ccesa007.pdfPlanificacion Anual 2do Grado Educacion Primaria   2024   Ccesa007.pdf
Planificacion Anual 2do Grado Educacion Primaria 2024 Ccesa007.pdfDemetrio Ccesa Rayme
 

Dernier (20)

ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLAACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
 
Medición del Movimiento Online 2024.pptx
Medición del Movimiento Online 2024.pptxMedición del Movimiento Online 2024.pptx
Medición del Movimiento Online 2024.pptx
 
MAYO 1 PROYECTO día de la madre el amor más grande
MAYO 1 PROYECTO día de la madre el amor más grandeMAYO 1 PROYECTO día de la madre el amor más grande
MAYO 1 PROYECTO día de la madre el amor más grande
 
OCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VS
OCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VSOCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VS
OCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VS
 
Estrategia de prompts, primeras ideas para su construcción
Estrategia de prompts, primeras ideas para su construcciónEstrategia de prompts, primeras ideas para su construcción
Estrategia de prompts, primeras ideas para su construcción
 
Ley 21.545 - Circular Nº 586.pdf circular
Ley 21.545 - Circular Nº 586.pdf circularLey 21.545 - Circular Nº 586.pdf circular
Ley 21.545 - Circular Nº 586.pdf circular
 
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOSTEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
TEMA 13 ESPAÑA EN DEMOCRACIA:DISTINTOS GOBIERNOS
 
Planificacion Anual 4to Grado Educacion Primaria 2024 Ccesa007.pdf
Planificacion Anual 4to Grado Educacion Primaria   2024   Ccesa007.pdfPlanificacion Anual 4to Grado Educacion Primaria   2024   Ccesa007.pdf
Planificacion Anual 4to Grado Educacion Primaria 2024 Ccesa007.pdf
 
Power Point: Fe contra todo pronóstico.pptx
Power Point: Fe contra todo pronóstico.pptxPower Point: Fe contra todo pronóstico.pptx
Power Point: Fe contra todo pronóstico.pptx
 
CLASE - La visión y misión organizacionales.pdf
CLASE - La visión y misión organizacionales.pdfCLASE - La visión y misión organizacionales.pdf
CLASE - La visión y misión organizacionales.pdf
 
FORTI-MAYO 2024.pdf.CIENCIA,EDUCACION,CULTURA
FORTI-MAYO 2024.pdf.CIENCIA,EDUCACION,CULTURAFORTI-MAYO 2024.pdf.CIENCIA,EDUCACION,CULTURA
FORTI-MAYO 2024.pdf.CIENCIA,EDUCACION,CULTURA
 
Heinsohn Privacidad y Ciberseguridad para el sector educativo
Heinsohn Privacidad y Ciberseguridad para el sector educativoHeinsohn Privacidad y Ciberseguridad para el sector educativo
Heinsohn Privacidad y Ciberseguridad para el sector educativo
 
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptx
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptxACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptx
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptx
 
plan de capacitacion docente AIP 2024 clllll.pdf
plan de capacitacion docente  AIP 2024          clllll.pdfplan de capacitacion docente  AIP 2024          clllll.pdf
plan de capacitacion docente AIP 2024 clllll.pdf
 
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdfCurso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdf
 
Sesión de clase: Fe contra todo pronóstico
Sesión de clase: Fe contra todo pronósticoSesión de clase: Fe contra todo pronóstico
Sesión de clase: Fe contra todo pronóstico
 
Registro Auxiliar - Primaria 2024 (1).pptx
Registro Auxiliar - Primaria  2024 (1).pptxRegistro Auxiliar - Primaria  2024 (1).pptx
Registro Auxiliar - Primaria 2024 (1).pptx
 
2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdf2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdf
 
Lecciones 05 Esc. Sabática. Fe contra todo pronóstico.
Lecciones 05 Esc. Sabática. Fe contra todo pronóstico.Lecciones 05 Esc. Sabática. Fe contra todo pronóstico.
Lecciones 05 Esc. Sabática. Fe contra todo pronóstico.
 
Planificacion Anual 2do Grado Educacion Primaria 2024 Ccesa007.pdf
Planificacion Anual 2do Grado Educacion Primaria   2024   Ccesa007.pdfPlanificacion Anual 2do Grado Educacion Primaria   2024   Ccesa007.pdf
Planificacion Anual 2do Grado Educacion Primaria 2024 Ccesa007.pdf
 

Selenium pruebas web

  • 1. http://extrema-sistemas.com Prueba de aplicaciones web con Selenium 2 y WebDriver David Gómez
  • 2. Pruebas de aplicaciones web Pruebas unitarias. Pruebas de integración. Pruebas end-to-end. 2
  • 3. Pruebas end-to-end La visión del usuario Distintos navegadores Rich Web Applications - Ajax y JavaScript 3
  • 4. Selenium Herramienta para pruebas funcionales desde la perspectiva del usuario. 4
  • 5. Componentes Selenium Core - Motor de ejecución empotrado en el Navegador Selenium IDE - Herramienta para grabar los tests en HTML Selenium RC (Remote Control) - Tests escritos en Java, Ruby, Python, Perl, PHP... 5
  • 6. Selenium IDE FireFox plugin que graba y ejecuta los tests. 6
  • 7. Selenium Test Cases y Test Suites en formato HTML. 7
  • 8. Selenium Test Cases y Test Suites en formato HTML. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta content="text/html; charset=UTF-8" http-equiv="content-type" /> <title>Test Suite</title> </head> <body> <table id="suiteTable" cellpadding="1" cellspacing="1" border="1" class="selenium"> <tbody> <tr><td><b>Test Suite</b></td></tr> <tr><td><a href="CreateShowTest">CreateShowTest</a></td></tr> <tr><td><a href="DeleteShowTest">DeleteShowTest</a></td></tr> </tbody> </table> </body> </html> 7
  • 9. Selenium Test Cases y Test Suites en formato HTML. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <body> <head> cellpadding="1" cellspacing="1" border="1"> <table <meta content="text/html; charset=UTF-8" http-equiv="content-type" /> <thead><tr><td rowspan="1" colspan="3">CreateShowTest</td></tr></thead> <title>Test Suite</title> <tbody> </head> <tr> <body> <td>open</td> <table id="suiteTable" cellpadding="1" cellspacing="1" border="1" <td>/home/</td> <td></td> class="selenium"> </tr> <tbody> <tr> <tr><td><b>Test Suite</b></td></tr> <td>waitForElementPresent</td> <tr><td><a href="CreateShowTest">CreateShowTest</a></td></tr> <td>link=Crear nuevo evento</td> <tr><td><a href="DeleteShowTest">DeleteShowTest</a></td></tr> <td></td> </tbody> </tr> </table> <tr> </body> <td>clickAndWait</td> <td>link=Crear nuevo evento</td> </html> <td></td> </tr> </tbody></table></body> 7
  • 10. Limitaciones Pruebas limitadas a acciones de usuario. No soporta: - Condiciones - Iteración - Trazas y generación de informes - Etc... 8
  • 11. Selenium RC. public class LoginTestCase extends SeleneseTestCase { public void setUp() throws Exception { setUp("http://localhost:8888/", "*firefox"); } public void testLoginTestCase() throws Exception { selenium.open("/home/"); verifyTrue(selenium.isElementPresent("logout-link")); selenium.click("logout-link"); selenium.waitForPageToLoad("30000"); verifyTrue(selenium.isElementPresent("login-link")); } } 9
  • 12. Selenium RC. public class LoginTestCase extends SeleneseTestCase { Navegadores: public void setUp() throws Exception { setUp("http://localhost:8888/", "*firefox"); *chrome } *firefox *iexplore public void testLoginTestCase() throws Exception { selenium.open("/home/"); verifyTrue(selenium.isElementPresent("logout-link")); selenium.click("logout-link"); selenium.waitForPageToLoad("30000"); verifyTrue(selenium.isElementPresent("login-link")); } } 9
  • 13. Selenium RC. public class LoginTestCase extends SeleneseTestCase { Navegadores: public void setUp() throws Exception { setUp("http://localhost:8888/", "*firefox"); *chrome } *firefox *iexplore public void testLoginTestCase() throws Exception { selenium.open("/home/"); verifyTrue(selenium.isElementPresent("logout-link")); selenium.click("logout-link"); selenium.waitForPageToLoad("30000"); verifyTrue(selenium.isElementPresent("login-link")); } } Selenium IDE permite generar el test Junit desde el script HTML 9
  • 15. Selenium 2 y WebDriver 11
  • 16. Selenium 2 y WebDriver Selenium: JavaScript dentro del navegador. WebDriver: componente específico - Firefox: JavaScript en un componente XPCOM. - IE: Uso del API de Automatización C++ - Chrome: Extensión con JavaScript V8 12
  • 17. Para empezar Maven: pom.xml <project> [...] <dependencies> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium</artifactId> <version>2.0b2</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-server</artifactId> <version>2.0b2</version> </dependency> </dependencies> [...] </project> 13
  • 18. Driver Componente que representa el navegador public class SimpleTest { private WebDriver driver = null; @Before public void create() { driver = new FirefoxDriver(); } } 14
  • 20. Implementaciones driver = new HtmlUnitDriver(); 15
  • 21. Implementaciones driver = new HtmlUnitDriver(); driver = new FirefoxDriver(); 15
  • 22. Implementaciones driver = new HtmlUnitDriver(); driver = new FirefoxDriver(); driver = new InternetExplorerDriver(); 15
  • 23. Implementaciones driver = new HtmlUnitDriver(); driver = new FirefoxDriver(); driver = new InternetExplorerDriver(); driver = new ChromeDriver(); 15
  • 24. Implementaciones driver = new HtmlUnitDriver(); driver = new FirefoxDriver(); driver = new InternetExplorerDriver(); driver = new ChromeDriver(); 15
  • 25. Page Object Model La forma de interactuar con WebDriver driver.get("http://localhost:8888/home"); 16
  • 26. Page Object Model La forma de interactuar con WebDriver driver.get("http://localhost:8888/home"); 16
  • 27. Page Object Model La forma de interactuar con WebDriver driver.get("http://localhost:8888/home"); - Localizar un elemento - Invocar una acción - Comprobar propiedades ‘visuales’ 16
  • 28. Elementos de página WebElement header = driver.findElement({Locator}); List<WebElement> shows = driver.findElements({Locator}); 17
  • 29. Locator: By public static By id(java.lang.String id) public static By linkText(java.lang.String linkText) public static By name(java.lang.String name) public Clase de métodos estáticos static By partialLinkText(java.lang.String linkText) con la estrategia de selección. publicstatic By tagName(java.lang.String name) public static By xpath(java.lang.String xpathExpression) public static By cssSelector(java.lang.String name) 18
  • 30. WebElement Componentes devueltos por findElement() WebElement header = driver.findElement(By.cssSelector("#header")); List<WebElement> shows = driver.findElements(By.cssSelector("ul.data li")); 19
  • 31. WebElement List<WebElement> shows = driver.findElements(By.cssSelector("ul.data li")); WebElement show = shows.get(0); show.findElement(By.cssSelector(".contents h3 a")).click(); 20
  • 32. WebElement List<WebElement> shows = driver.findElements(By.cssSelector("ul.data li")); WebElement show = shows.get(0); show.findElement(By.cssSelector(".contents h3 a")).click(); <div class="grid_2 alpha"> <a title="Gervasio Sánchez. Desaparecidos" href="..."> <img src="..." class="thumbnail"> </a> <div class="small">{...}</div> </div> <div class="contents grid_4 omega"> <h3> <a href="..."> Gervasio Sánchez. Desaparecidos </a> </h3> <div class="author"> by <a href="...">test@example.com</a> hace 1 minuto</div> <div class="description">{...}</div> <a href="..." class="button toright">» Comprar ahora</a> </div> 20
  • 33. WebElement List<WebElement> shows = driver.findElements(By.cssSelector("ul.data li")); WebElement show = shows.get(0); show.findElement(By.cssSelector(".contents h3 a")).click(); <div class="grid_2 alpha"> <a title="Gervasio Sánchez. Desaparecidos" href="..."> <img src="..." class="thumbnail"> </a> <div class="small">{...}</div> </div> <div class="contents grid_4 omega"> <h3> <a href="..."> Gervasio Sánchez. Desaparecidos </a> </h3> <div class="author"> by <a href="...">test@example.com</a> hace 1 minuto</div> <div class="description">{...}</div> <a href="..." class="button toright">» Comprar ahora</a> </div> 20
  • 34. Acciones public interface WebElement extends SearchContext { void click(); void submit(); void sendKeys(CharSequence... keysToSend); String getAttribute(String name); ... List<WebElement> findElements(By by); WebElement findElement(By by); } 21
  • 35. RenderedWebElement Consultar propiedades visuales Operaciones de drag and drop. Simula el movimiento del ratón (hover) List<WebElement> shows = driver.findElements(By.cssSelector("ul.data li")); WebElement show = shows.get(0); Dimension size = ((RenderedWebElement) show).getSize() 22
  • 36. RenderedWebElement Consultar propiedades visuales Operaciones de drag and drop. Simula el movimiento del ratón (hover) List<WebElement> shows = driver.findElements(By.cssSelector("ul.data li")); WebElement show = shows.get(0); Dimension size = ((RenderedWebElement) show).getSize() java.awt.Dimension[width=460,height=141] 22
  • 38. Page Object Pattern Crea un objeto que encapsula la página con un API específico 24
  • 40. PageObject Pattern public class KoliseoHomePage extends KoliseoPage { private WebElement showList; • public ShowThumbnail getShow(int pos) { } public KoliseoPage clickOnShow(int pos) { } public KoliseoPage buyTickets(int pos) { } } 25
  • 41. PageObject Pattern public class KoliseoHomePage extends KoliseoPage { public class ShowThumbnail { private WebElement showList; • public ShowThumbnail getShow(int pos) { private final WebElement title; private final WebElement description; } private final WebElement buyButton; public KoliseoPage clickOnShow(int pos) { public String getTitle() { return title.getText(); } } public KoliseoPage buyTickets(int pos) { public void navigate() { title.click(); } } } public void buy() { buyButton.click(); } } 25
  • 42. PageFactory Crea un PageObject a partir de la página actual. driver.get(“http://localhost:8888/home”); KoliseoHomePage home = PageFactory.initElements(driver, KoliseoHomePage.class); 26
  • 43. @FindBy @FindBy para configuración específica. - Por defecto utiliza el #id public class KoliseoHomePage extends KoliseoPage { @FindBy(css=".shows ul.data") private WebElement showList; @FindBy(css=".activities ul.data") private WebElement activities; public KoliseoHomePage(WebDriver driver) { super(driver); } } 27
  • 44. @FindBy @FindBy para configuración específica. - Por defecto utiliza el #id public class KoliseoHomePage extends KoliseoPage { @FindBy(css=".shows ul.data") id private WebElement showList; name className @FindBy(css=".activities ul.data") css private WebElement activities; tagName linkText public KoliseoHomePage(WebDriver driver) { partialLinkText super(driver); xpath } } 27
  • 45. KoliseoHomePage public class KoliseoHomePage extends KoliseoPage { @FindBy(css=".shows ul.data") private WebElement showList; public ShowThumbnail getShow(int pos) { List<WebElement> shows = showList.findElements(By.tagName("li")); WebElement show = shows.get(pos); return new ShowThumbnail(driver, show); } public KoliseoShowDetailPage clickOnShow(int pos) { ShowThumbnail show = this.getShow(pos); show.navigate(); return PageFactory.initElements(driver, KoliseoShowDetailPage.class); } } 28
  • 46. @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:springio-webdriver-test.xml") public class KoliseoHomeTest { @Autowired(required=false) private WebDriver driver = new HtmlUnitDriver(); private KoliseoHomePage home; @Before public void setUp() { driver.get(“http://localhost:8888/home); home = PageFactory.initElements(driver, KoliseoHomePage.class); } @After public void tearDown() { driver.quit(); } @Test public void showDetail() { assertTrue(home.hasShows()); String showTitle = home.getShow(1).getTitle(); KoliseoShowDetailPage showDetail = home.clickOnShow(1); assertEquals(showTitle, showDetail.getTitle()); } } 29
  • 48. Conclusiones Selenium IDE: Scripts HTML Selenium RC: Código procedural en Java Selenium 2 - WebDriver: Driver para el Browser - Código OO para nuestras páginas - Page Object Pattern: Nuestros APIs sobre WebDriver 31
  • 49. Q&A 32

Notes de l'éditeur

  1. \n
  2. \n
  3. Pruebas Unitarias.\n Componentes aislados del entorno\n Dependencias (Dobles de prueba)\n Framework.\n Pruebas de Integraci&amp;#xF3;n\n Componentes trabajando en colaboraci&amp;#xF3;n\n Infraestructura simplificada (BD, Sistemas externos...)\n Pruebas end-to-end\n La aplicaci&amp;#xF3;n completa. Desde la visi&amp;#xF3;n del usuario.\n\n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. No funciona con Frame Busters.\n
  11. Spaghetti code.\n
  12. Spaghetti code.\n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. HtmlUnit\nthe fastest and most lightweight \nPure Java Implementation.\nUses Rhino as its JavaScript+DOM implementation\nJavaScript disabled by Default. (emulate IE when enabled)\nCould emulate other brorwsers:\nHtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_3)\n\nFirefox\nThe Firefox driver is the most mature of the browser-based drivers.\nInternet Explorer\nWork on IE6, IE7 and IE8 on WXP &amp; Vista. \nCompared the other drivers, it is relatively slow.\nChrome\nis based on Webkit, you may be able to verify that your application works in other Webkit-based browsers such as Safari\nUses V8 JavaScript engine rather than the Safari Nitro engine, you may experience some differences in behavior\n
  20. HtmlUnit\nthe fastest and most lightweight \nPure Java Implementation.\nUses Rhino as its JavaScript+DOM implementation\nJavaScript disabled by Default. (emulate IE when enabled)\nCould emulate other brorwsers:\nHtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_3)\n\nFirefox\nThe Firefox driver is the most mature of the browser-based drivers.\nInternet Explorer\nWork on IE6, IE7 and IE8 on WXP &amp; Vista. \nCompared the other drivers, it is relatively slow.\nChrome\nis based on Webkit, you may be able to verify that your application works in other Webkit-based browsers such as Safari\nUses V8 JavaScript engine rather than the Safari Nitro engine, you may experience some differences in behavior\n
  21. HtmlUnit\nthe fastest and most lightweight \nPure Java Implementation.\nUses Rhino as its JavaScript+DOM implementation\nJavaScript disabled by Default. (emulate IE when enabled)\nCould emulate other brorwsers:\nHtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_3)\n\nFirefox\nThe Firefox driver is the most mature of the browser-based drivers.\nInternet Explorer\nWork on IE6, IE7 and IE8 on WXP &amp; Vista. \nCompared the other drivers, it is relatively slow.\nChrome\nis based on Webkit, you may be able to verify that your application works in other Webkit-based browsers such as Safari\nUses V8 JavaScript engine rather than the Safari Nitro engine, you may experience some differences in behavior\n
  22. HtmlUnit\nthe fastest and most lightweight \nPure Java Implementation.\nUses Rhino as its JavaScript+DOM implementation\nJavaScript disabled by Default. (emulate IE when enabled)\nCould emulate other brorwsers:\nHtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_3)\n\nFirefox\nThe Firefox driver is the most mature of the browser-based drivers.\nInternet Explorer\nWork on IE6, IE7 and IE8 on WXP &amp; Vista. \nCompared the other drivers, it is relatively slow.\nChrome\nis based on Webkit, you may be able to verify that your application works in other Webkit-based browsers such as Safari\nUses V8 JavaScript engine rather than the Safari Nitro engine, you may experience some differences in behavior\n
  23. HtmlUnit\nthe fastest and most lightweight \nPure Java Implementation.\nUses Rhino as its JavaScript+DOM implementation\nJavaScript disabled by Default. (emulate IE when enabled)\nCould emulate other brorwsers:\nHtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_3)\n\nFirefox\nThe Firefox driver is the most mature of the browser-based drivers.\nInternet Explorer\nWork on IE6, IE7 and IE8 on WXP &amp; Vista. \nCompared the other drivers, it is relatively slow.\nChrome\nis based on Webkit, you may be able to verify that your application works in other Webkit-based browsers such as Safari\nUses V8 JavaScript engine rather than the Safari Nitro engine, you may experience some differences in behavior\n
  24. HtmlUnit\nthe fastest and most lightweight \nPure Java Implementation.\nUses Rhino as its JavaScript+DOM implementation\nJavaScript disabled by Default. (emulate IE when enabled)\nCould emulate other brorwsers:\nHtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_3)\n\nFirefox\nThe Firefox driver is the most mature of the browser-based drivers.\nInternet Explorer\nWork on IE6, IE7 and IE8 on WXP &amp; Vista. \nCompared the other drivers, it is relatively slow.\nChrome\nis based on Webkit, you may be able to verify that your application works in other Webkit-based browsers such as Safari\nUses V8 JavaScript engine rather than the Safari Nitro engine, you may experience some differences in behavior\n
  25. HtmlUnit\nthe fastest and most lightweight \nPure Java Implementation.\nUses Rhino as its JavaScript+DOM implementation\nJavaScript disabled by Default. (emulate IE when enabled)\nCould emulate other brorwsers:\nHtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_3)\n\nFirefox\nThe Firefox driver is the most mature of the browser-based drivers.\nInternet Explorer\nWork on IE6, IE7 and IE8 on WXP &amp; Vista. \nCompared the other drivers, it is relatively slow.\nChrome\nis based on Webkit, you may be able to verify that your application works in other Webkit-based browsers such as Safari\nUses V8 JavaScript engine rather than the Safari Nitro engine, you may experience some differences in behavior\n
  26. HtmlUnit\nthe fastest and most lightweight \nPure Java Implementation.\nUses Rhino as its JavaScript+DOM implementation\nJavaScript disabled by Default. (emulate IE when enabled)\nCould emulate other brorwsers:\nHtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_3)\n\nFirefox\nThe Firefox driver is the most mature of the browser-based drivers.\nInternet Explorer\nWork on IE6, IE7 and IE8 on WXP &amp; Vista. \nCompared the other drivers, it is relatively slow.\nChrome\nis based on Webkit, you may be able to verify that your application works in other Webkit-based browsers such as Safari\nUses V8 JavaScript engine rather than the Safari Nitro engine, you may experience some differences in behavior\n
  27. HtmlUnit\nthe fastest and most lightweight \nPure Java Implementation.\nUses Rhino as its JavaScript+DOM implementation\nJavaScript disabled by Default. (emulate IE when enabled)\nCould emulate other brorwsers:\nHtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_3)\n\nFirefox\nThe Firefox driver is the most mature of the browser-based drivers.\nInternet Explorer\nWork on IE6, IE7 and IE8 on WXP &amp; Vista. \nCompared the other drivers, it is relatively slow.\nChrome\nis based on Webkit, you may be able to verify that your application works in other Webkit-based browsers such as Safari\nUses V8 JavaScript engine rather than the Safari Nitro engine, you may experience some differences in behavior\n
  28. \n\n
  29. \n\n
  30. \n\n
  31. \n
  32. \n
  33. \n
  34. Representan fragmentos de la p&amp;#xE1;gina\n Implementan sus operaciones\n
  35. Representan fragmentos de la p&amp;#xE1;gina\n Implementan sus operaciones\n
  36. Representan fragmentos de la p&amp;#xE1;gina\n Implementan sus operaciones\n
  37. Representan fragmentos de la p&amp;#xE1;gina\n Implementan sus operaciones\n
  38. Representan fragmentos de la p&amp;#xE1;gina\n Implementan sus operaciones\n
  39. Representan fragmentos de la p&amp;#xE1;gina\n Implementan sus operaciones\n
  40. boolean toggle();\n boolean isSelected();\n void setSelected();\n boolean isEnabled();\n String getText();\n\n
  41. Drag &amp;#x2018;n&amp;#x2019; drop y hover es mejor a trav&amp;#xE9;s del\nAdvanced User Interactions API\n\n&amp;#xA0;ActionChainsGenerator builder = ((HasInputDevices) driver).actionsBuilder();\n&amp;#xA0; &amp;#xA0;builder.keyDown(Keys.CONTROL)\n&amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0;.click(someElement)\n&amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0;.click(someOtherElement)\n .clickAndHold(someElement)\n&amp;#xA0; &amp;#xA0; &amp;#xA0; &amp;#xA0;.keyUp(Keys.CONTROL);\n builder.build();\n builder.permform();\n\n\n\n
  42. Aqu&amp;#xED; es donde empieza lo bueno.\n
  43. Todas las ventajas de OO\n \n
  44. \n
  45. \n
  46. Convention over Configuration:\n Constructor sin argumentos o con WebDriver\n Atributos WebElement buscados por id\n
  47. \n
  48. getShow y clickOnShow encapsulan la funcionalidad de la p&amp;#xE1;gina.\n
  49. /** Allows injection of specific driver to test with a different browser engine */\n\nEl test showDetail() utiliza el API de KoliseoHomePage.\n\nPageObject no deber&amp;#xED;a hacer Asserts\n
  50. Los componentes encapsulan la carga en el m&amp;#xE9;todo get().\n\n
  51. KoliseoHomePage reescrito como LoadableComponent\nAparentemente no hemos ganado mucho....\n
  52. \n
  53. \n
  54. El componente de login busca la home, \n pincha en el link de login\n Rellena el formulario y lo env&amp;#xED;a\n
  55. La p&amp;#xE1;gina protegida\n Carga el Login (si ya se ha hecho login no se rehace)\n
  56. \n
  57. \n
  58. \n
  59. \n