2012-05-18 10 views
12

¿Puede alguien ayudarme por favor?Resalte elementos en WebDriver durante el tiempo de ejecución

¿Cómo puedo resaltar todos los elementos web en la siguiente clase durante la ejecución de la prueba en WebDriver? Con Selenium RC, fue bastante sencillo pero con WebDriver estoy luchando.

Le agradecería a alguien que por favor me proporcione algún código que yo pueda probar, también donde encajaría ese código en la siguiente clase - lo siento, mis habilidades Java no son tan buenas.

package hisScripts; 
import java.util.concurrent.TimeUnit; 
import org.testng.annotations.*; 
import org.testng.Assert; 
import static org.testng.Assert.fail; 
import org.openqa.selenium.*; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.ie.InternetExplorerDriver; 
import org.openqa.selenium.interactions.Actions; 


public class R_LHAS_Only_Account_Verification extends HIS_Login_Logout{ 
    public WebDriver driver; 
    public String baseUrl; 
    public int exeMonth; 
    private StringBuffer verificationErrors = new StringBuffer(); 

    @BeforeClass 
    @Parameters ({"browser1", "url", "executionMonth"}) 
    public void setUp(String browser1, String url, int executionMonth) throws Exception { 
     exeMonth = executionMonth; 
     baseUrl = url; 

     if (browser1.equals("FF")) { 
      driver = new FirefoxDriver(); 
     } else if (browser1.equals("IE")){ 
      driver = new InternetExplorerDriver(); 
     }  
     driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);  
    }  

    @Test 
    public void R_LHAS_Reports() throws Exception { 
     R_LHAS_Only_Login(baseUrl, driver); 
     Assert.assertEquals("Kingston upon Thames (RB)", driver.findElement(By.xpath("//html/body/div[9]/div/div[3]/div/div/div")).getText()); 
     Assert.assertEquals("Average price", driver.findElement(By.xpath("//table[@id='tableId']/tbody/tr/td")).getText()); 
     Assert.assertEquals("% price change", driver.findElement(By.xpath("//table[@id='tableId']/tbody/tr[2]/td")).getText()); 
     Assert.assertEquals("Lower quartile price", driver.findElement(By.xpath("//table[@id='tableId']/tbody/tr[3]/td")).getText()); 
     Assert.assertEquals("Time to sell (weeks)", driver.findElement(By.xpath("//table[@id='tableId']/tbody/tr[4]/td")).getText()); 
     Assert.assertEquals("% asking price achieved", driver.findElement(By.xpath("//table[@id='tableId']/tbody/tr[5]/td")).getText()); 
     Assert.assertEquals("House price to earnings ratio", driver.findElement(By.xpath("//table[@id='tableId']/tbody/tr[6]/td")).getText()); 
     Assert.assertEquals("Cost of buying outright - LQ 2 bed £pw", driver.findElement(By.xpath("//table[@id='tableId']/tbody/tr[7]/td")).getText()); 
     Assert.assertEquals("Private rent 2 bed £pw", driver.findElement(By.xpath("//table[@id='tableId']/tbody/tr[8]/td")).getText()); 
     Assert.assertEquals("80% private rent 2 bed £pw", driver.findElement(By.xpath("//table[@id='tableId']/tbody/tr[9]/td")).getText()); 
     Assert.assertEquals("Social rent 2 bed £pw", driver.findElement(By.xpath("//table[@id='tableId']/tbody/tr[10]/td")).getText());     
     R_LHAS_Only_Logout(baseUrl,driver); 
    } 

    @AfterClass(alwaysRun=true) 
    public void tearDown() throws Exception { 
     driver.quit(); 
     String verificationErrorString = verificationErrors.toString(); 
     if (! "".equals(verificationErrorString)) { 
      fail(verificationErrorString); 
     } 
    } 
} 
+0

No es un problema en absoluto. Cuando dices resaltar un elemento, ¿quieres imitar al usuario que mantiene presionado el mouse y realmente resaltar ese elemento? – AndyPerfect

+0

Básicamente cuando se ejecutan las pruebas, quiero poder ver los elementos que se verifican, afirman, etc. En palabras simples, estoy buscando un controlador de web equivalente para esto: selenium.getEval ("selenium.browserbot.setShouldHighlightElement (true)") ; Esto es de Selenium RC pero estoy migrando mis scripts de prueba a webdriver. – user929258

Respuesta

18

no hay manera de hacer esto en WebDriver (a partir de v2.21.0). Usted puede intentar sustituir el método habitual findElement(By) con una ajustada que utiliza JavaScript para resaltar el elemento que se encuentra:

// Draws a red border around the found element. Does not set it back anyhow. 
public WebElement findElement(By by) { 
    WebElement elem = driver.findElement(by); 
    // draw a border around the found element 
    if (driver instanceof JavascriptExecutor) { 
     ((JavascriptExecutor)driver).executeScript("arguments[0].style.border='3px solid red'", elem); 
    } 
    return elem; 
} 

Ahora que tienes la idea, hay una versión mejorada que restaura el original border del último elemento cuando una uno nuevo se encuentra y se destaca:

// assuming JS is enabled 
private JavascriptExecutor js = (JavascriptExecutor)driver; 
private WebElement lastElem = null; 
private String lastBorder = null; 

private static final String SCRIPT_GET_ELEMENT_BORDER; 
private static final String SCRIPT_UNHIGHLIGHT_ELEMENT; 

void highlightElement(WebElement elem) { 
    unhighlightLast(); 

    // remember the new element 
    lastElem = elem; 
    lastBorder = (String)(js.executeScript(SCRIPT_GET_ELEMENT_BORDER, elem)); 
} 

void unhighlightLast() { 
    if (lastElem != null) { 
     try { 
      // if there already is a highlighted element, unhighlight it 
      js.executeScript(SCRIPT_UNHIGHLIGHT_ELEMENT, lastElem, lastBorder); 
     } catch (StaleElementReferenceException ignored) { 
      // the page got reloaded, the element isn't there 
     } finally { 
      // element either restored or wasn't valid, nullify in both cases 
      lastElem = null; 
     } 
    } 
} 

Y los scripts! Los cargo desde un archivo usando FileUtils.readFileToString().

SCRIPT_GET_ELEMENT_BORDER (IE friendly version taken from this site), sería mucho más corto si se utiliza resaltado cambiando el color de fondo, por ejemplo, solo el borde inferior. Pero este es el mejor :)

/* 
* Returns all border properties of the specified element as String, 
* in order of "width style color" delimited by ';' (semicolon) in the form of: 
* 
* "2px inset #000000;2px inset #000000;2px inset #000000;2px inset #000000" 
* "medium none #ccc;medium none #ccc;1px solid #e5e5e5;medium none #ccc" 
* etc. 
*/ 
var elem = arguments[0]; 
if (elem.currentStyle) { 
    // Branch for IE 6,7,8. No idea how this works on IE9, but the script 
    // should take care of it. 
    var style = elem.currentStyle; 
    var border = style['borderTopWidth'] 
      + ' ' + style['borderTopStyle'] 
      + ' ' + style['borderTopColor'] 
      + ';' + style['borderRightWidth'] 
      + ' ' + style['borderRightStyle'] 
      + ' ' + style['borderRightColor'] 
      + ';' + style['borderBottomWidth'] 
      + ' ' + style['borderBottomStyle'] 
      + ' ' + style['borderBottomColor'] 
      + ';' + style['borderLeftWidth'] 
      + ' ' + style['borderLeftStyle'] 
      + ' ' + style['borderLeftColor']; 
} else if (window.getComputedStyle) { 
    // Branch for FF, Chrome, Opera 
    var style = document.defaultView.getComputedStyle(elem); 
    var border = style.getPropertyValue('border-top-width') 
      + ' ' + style.getPropertyValue('border-top-style') 
      + ' ' + style.getPropertyValue('border-top-color') 
      + ';' + style.getPropertyValue('border-right-width') 
      + ' ' + style.getPropertyValue('border-right-style') 
      + ' ' + style.getPropertyValue('border-right-color') 
      + ';' + style.getPropertyValue('border-bottom-width') 
      + ' ' + style.getPropertyValue('border-bottom-style') 
      + ' ' + style.getPropertyValue('border-bottom-color') 
      + ';' + style.getPropertyValue('border-left-width') 
      + ' ' + style.getPropertyValue('border-left-style') 
      + ' ' + style.getPropertyValue('border-left-color'); 
} 
// highlight the element 
elem.style.border = '2px solid red'; 
return border; 

SCRIPT_UNHIGHLIGHT_ELEMENT

var elem = arguments[0]; 
var borders = arguments[1].split(';'); 
elem.style.borderTop = borders[0]; 
elem.style.borderRight = borders[1]; 
elem.style.borderBottom = borders[2]; 
elem.style.borderLeft = borders[3]; 

Para cualquier duda, notas, solicitudes y mejoras son bienvenidas!

+0

@Slance - ¡Gracias por esto! Disculpas por mi ignorancia, pero ¿dónde podría llamar al código anterior en mi clase? – user929258

+0

En lugar de 'driver.findElement()', puede llamar simplemente 'findElement()' ahora si agrega esto a su clase. O nómbrelo de otra manera apropiada :). –

+0

Bien, el método ahora almacena el valor de borde original del elemento encontrado y lo restaura cuando se resalta un nuevo elemento. Espero que finalmente haya terminado con las ediciones (ya que no puedo encontrar ninguna otra mejora) :). –

0

estoy al tanto de ninguna manera de hacer esto en WebDriver, pero parece que no existe una clase de selenio WebDriver que debe dar acceso a la mayoría si no todos de la API de RC. No estoy al tanto de cómo hacer esto con WebDriver.

La clase WebDriverBackedSelenium parece que contiene gran parte de la API de RC que está acostumbrado incluyendo getEval

Para crear un objeto de tipo WebDriverBackedSelenium, sólo tiene que pasar en el controlador que ya ha estado utilizando, además de su URL base del lugar de la prueba

WebDriverBackedSelenium wdbs = new WebDriverBackedSelenium(driver, "http://www.google.com"); 
+0

Tenga en cuenta que esta respuesta es temporal.Voy a seguir mirando para ver si esto es posible usando estrictamente WebDriver – AndyPerfect

+0

Sí, a partir de ahora, no hay tal posibilidad de usar WebDriver sin ningún JavaScript. Sin embargo, esto podría funcionar como se esperaba. –

0

utilizo a continuación código para poner de relieve en mi código java WebDriver usando javascript ejecutor:

// hago una llamada a continuación la función "flash"

public static void flash(WebElement element, WebDriver driver) { 
     JavascriptExecutor js = ((JavascriptExecutor) driver); 
     String bgcolor = element.getCssValue("backgroundColor"); 
     for (int i = 0; i < 3; i++) { 
      changeColor("rgb(0,200,0)", element, js); 
      changeColor(bgcolor, element, js); 
     } 
    } 
    public static void changeColor(String color, WebElement element, JavascriptExecutor js) { 
     js.executeScript("arguments[0].style.backgroundColor = '"+color+"'", element); 

     try { 
      Thread.sleep(20); 
     } catch (InterruptedException e) { 
     } 
    } 

esperanza de que ayudó a :)

4

En webdriver
Cree una clase para el elemento highligh HighlightElement

HighlightElement.java

import org.openqa.selenium.JavascriptExecutor; 
import org.openqa.selenium.WebElement; 

import com.project.setup.WebDriverManager; 

public class HighlightElement { 

    public static void highlightElement(WebElement element) { 
     for (int i = 0; i <2; i++) { 
      JavascriptExecutor js = (JavascriptExecutor) WebDriverManager.driver; 
      js.executeScript("arguments[0].setAttribute('style', arguments[1]);", element, "color: yellow; border: 2px solid yellow;"); 
      js.executeScript("arguments[0].setAttribute('style', arguments[1]);", element, ""); 
      } 
     } 
} 

Puede utilizar

HighlightElement.highlightElement(driver.findElement(By.xpath("blaah blaah"));)

para resaltar la WebElement con XPath " blaah blaah" en su prueba.

2

JavaScript: Encuentra Xpath de un element y Dibujar borde alrededor de ella,

usando styleObj. setProperty (método CSS propertyName, CSS propertyValue, priority). element_node.style.setProperty ("background-color", "green", null);

prueba js-código en este sitio: https://developer.chrome.com/devtools/docs/console

var xpath = '//html/body/div/main/article/nav'; 
if (document.evaluate){ 
var element_node = document.evaluate(xpath, window.document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; 
element_node.style.setProperty ('border', '3px solid green', 'important'); 

alert('Working Fine in this browser version'); 
}else{ 
alert('document.evaluate is Not supported by Internet Explorer'); 
} 

selenio

public static void drawBorder(WebDriver driver, String xpath){ 
     WebElement element_node = driver.findElement(By.xpath(xpath)); 
     JavascriptExecutor jse = (JavascriptExecutor) driver; 
     jse.executeScript("arguments[0].style.border='3px solid red'", element_node); 
    } 
-1
public class JavaExecutor { 

public static void highlighElement(WebDriver driver,WebElement element) 
{ 
    JavascriptExecutor js=(JavascriptExecutor)driver; 
    js.executeScript("arguments[0].setAttribute('style', 'background: yellow; border: 2px solid red;');", element); 

    try 
    { 
    Thread.sleep(1000); 
    } 
    catch (InterruptedException e) { 

    System.out.println(e.getMessage()); 
    } 

    js.executeScript("arguments[0].setAttribute('style','border: solid 2px white');", element); 

    } 
} 
0

el código aquí higlighting el elemento en selenio: En primer lugar crear una clase:

package com.demo.misc.function; 

import org.openqa.selenium.JavascriptExecutor; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 

public class Miscellaneous 
{ 
    public static void highLight(WebElement element, WebDriver driver) 
    { 
     for (int i = 0; i <2; i++) 
     { 
      try { 
       JavascriptExecutor js = (JavascriptExecutor) driver; 
       js.executeScript("arguments[0].setAttribute('style', arguments[1]);", element, "color: black; border: 4px solid red;"); 
       Thread.sleep(500); 
       js.executeScript("arguments[0].setAttribute('style', arguments[1]);", element, ""); 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 

    } 

} 

Y entonces usted puede llamar a este por:

driver.get(baseUrl); 
      Thread.sleep(2000); 
      WebElement lnkREGISTER = driver.findElement(By.linkText("REGISTER")); 
      Miscellaneous.highLight(lnkREGISTER, driver); 
      lnkREGISTER.click(); 
0

Esto funcionó para mí. Ha mejorado el código enviado anteriormente en este hilo.

public static WebDriver HighlightElement(WebDriver driver, WebElement element){ 
    if (driver instanceof JavascriptExecutor) { 
     ((JavascriptExecutor)driver).executeScript("arguments[0].style.border='3px solid red'", element); 
    } 
    return driver; 
} 
public static WebDriver UnhighlightElement(WebDriver driver, WebElement element){ 
    if (driver instanceof JavascriptExecutor) {  
     ((JavascriptExecutor)driver).executeScript("arguments[0].style.border=''", element); 
    } 
    return driver; 
} 

llamar a estas dos funciones una vez para resaltar y una vez para eliminar el realce de

Cuestiones relacionadas