2012-08-26 25 views
6

A veces el contenido visible de las páginas web depende del estado de elementos de entrada de página (por ejemplo, el elemento de entrada 'Choose your university' puede aparecer solo después de haber elegido 'Student' en el campo 'Job') o al hacer clic en algunos elementos de la página (como los botones del menú desplegable). Estoy tratando de automatizar el proceso de averiguar tales dependencias de elementos de página usando Selenium Webdriver. La primera idea es ingresar algunas cosas en los campos de entrada de texto, establecer casillas marcadas/no marcadas, hacer clic en algunos botones/enlaces, etc. y ver si los elementos de la página han aparecido/desaparecido. Los problemas son:Determine si la página ha cambiado usando Webdriver

  • ¿Hay una manera fácil de averiguar si algo en la página ha aparecido? Bueno, podría hacer un mapa de los elementos de la página web a {estados 'visibles', 'invisibles'} después de cada cambio y descubrir si algo ha cambiado, pero ¿hay algo incorporado para este propósito?

  • Al hacer clic en algunos botones puede causar la carga de otra página, y quiero permanecer dentro de la página que estoy probando, ¿hay alguna forma de determinar si el método click() causará la carga de otra página y la evitará?

+0

Selenium es muy útil para simular un usuario que camina a través de un flujo de trabajo predefinido ... ¿puedo preguntar cuál es su uso para esta prueba? –

Respuesta

1

bien a su primera pregunta para comprobar la visibilidad en Java

Selenium selenium; 

selenium.isVisible("id=element_id"); // it will return boolean value whether the element is present or not 

Si desea utilizar WebDriver significa entonces utilizar

RenderedWebElement webElement=findElement(By.id("element_id")); 
webElement.isDisplayed(); 

Para su segunda pregunta

Nosotros puede verificar si está redireccionando a otra página o no obteniendo la url de la página y comparándola con ex se sospecha vienen url

WebDriver driver; 

driver.getCurrentUrl() // will returns the String value 

Si la URL currrent no coincide con la URL esperada significa luego vas por dos maneras

1) Puede abrir la URL de su esperado nuevo utilizando la función Abrir en selenio (o) WebDriver método navegar

driver.navigate().to("expected_url"); 

2) Se puede usar otra forma de navegación

driver.navigate().back(); 
+0

cambias entre Selenium 1 y Selenium 2 ... eso es una mierda –

+3

Acabo de compartir las formas de hacer esto. Puedes ir por donde quieras – Dhivya

+0

al menos indica que usa dos marcos: mejor actualice el 'isVisible (locator)' al nuevo método –

5

La respuesta de Divi para la pregunta 2 está bien. Para la parte 1 se puede comprobar si un elemento se muestra como usted ha dicho:

webElement.isDisplayed(); 

O se podría comparar el código HTML de la página antes y después del evento.

driver.getPageSource(); 

(También podría verificar la URL si eso cambia después de cada evento).

El único problema para obtener la fuente del html es que un evento podría haberse desencadenado después de su última acción y no haberse completado, dejando el html igual. Para evitar esto se puede comprobar algunas de las siguientes condiciones:

(Boolean) ((JavascriptExecutor)driver).executeScript("return jQuery.ready"); 
((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete"); 

O usted podría estar utilizando otro marco de JavaScript que tiene otra función similar a jQuery.ready.

último podría tener un problema con el evento sólo desencadenar una vez que haya cambiado el elemento activo, la tabulación fuera del campo, etc. Por lo que podría ejecutar algo como:

Actions actionObject = new Actions(driver); 
actionObject.sendKeys(Key.TAB).perform(); 

O usted podría utilizar javascript configurarlo (no he comprobado el código abajo y me gustaría establecer el WebElement al elemento de base hTML):

((JavascriptExecutor) driver).executeScript("arguments[0].focus();", webElement); 

no sugiero usando WebDriver hacer clic en el elemento del cuerpo ya que esto podría deshacer la última hacer clic.

Estoy incluyendo la respuesta de Divi para la pregunta 2 está completo:

Podemos comprobar si está volviendo a dirigir a otra página o no al obtener la URL de la página y comparándolo con el URL esperada

WebDriver driver; 

driver.getCurrentUrl() // will returns the String value 

Si la URL currrent no coincide con la URL esperada significa entonces ir por dos caminos

1) puede abrir la URL de su esperado nuevo utilizando la función Abrir en selenio (o) WebDriver navegar método

driver.navigate().to("expected_url"); 

2) Se puede usar otra forma de navegación

driver.navigate().back(); 
3

Sobre la base de la respuesta de James, y desde nuestro sitio de prueba no utiliza jQuery, los siguientes trabajó para mí:

public static class WebDriverExtensions 
{ 
    public static void WaitForPage(this IWebDriver driver) 
    { 
     WaitForPage(driver, 60, 200); 
    } 

    private static void WaitForPage(IWebDriver driver, int seconds, int waitFor) 
    { 
     while (!((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete")) 
     { 
      System.Threading.Thread.Sleep(50); 
     } 
     bool stillChanging = true; 
     int iterations = 0; 
     int maxIterations = (1000 * seconds)/waitFor; 
     string previous = ""; 
     string current = ""; 
     while (stillChanging && iterations < maxIterations) 
     { 
      current = driver.PageSource; 
      System.Threading.Thread.Sleep(waitFor); 
      stillChanging = (!previous.Equals(current)); 
      previous = current; 
     } 
    } 

    public static void Click(this IWebElement el, IWebDriver driver) 
    { 
     el.Click(); 
     driver.WaitForPage(); 
    } 
} 

Lo Lo hago en mi código, es llamar al.Click (controlador) en lugar de el.Click(). El método volverá luego de que la página haya dejado de cambiar. También puede llamar al controlador público. Método WaitForPage() antes/después de los cambios que pueden cambiar algo en su página. Los valores codificados deben modificarse para garantizar que el tiempo máximo de espera y el período entre las comprobaciones de los cambios funcionen como se esperaba. Haga la espera demasiado pequeña y no detectará cambios. Hazlo demasiado grande y tendrás que esperar mucho tiempo después de cada clic.

Cuestiones relacionadas