2012-05-18 17 views
12

Czy ktoś może pomóc!Wyróżnianie elementów w WebDriver podczas pracy

Jak wyróżnić wszystkie elementy internetowe w poniższej klasie podczas wykonywania testów w WebDriver? Z Selenium RC, to było dość proste, ale z WebDriver walczę.

Byłbym wdzięczny, gdyby ktoś mógł podać mi jakiś kod, który mógłbym wypróbować, także gdzie ten kod pasowałby do klasy poniżej - przykro mi, że moje umiejętności Java nie są aż tak wspaniałe.

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

nie problem w ogóle. Kiedy mówisz o podświetleniu elementu, czy chcesz naśladować użytkownika trzymającego mysz i faktycznie podświetlającego ten element? – AndyPerfect

+0

Zasadniczo, gdy testy są uruchomione, chcę móc zobaczyć elementy podlegające weryfikacji, potwierdzone itp. W prostych słowach szukam odpowiednika dla tego narzędzia: selenium.getEval ("selenium.browserbot.setShouldHighlightElement (true)") ; To jest z selenu RC, ale migruję moje skrypty testowe do webdriver. – user929258

Odpowiedz

18

nie ma sposobu, aby to zrobić w WebDriver (od v2.21.0). Można spróbować wymienić zwykłe findElement(By) metodę o skorygowanej taki, który używa Javascript, aby podświetlić znaleziony element:

// 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; 
} 

Teraz, że masz pomysł, jest ulepszona wersja, która przywraca pierwotną border ostatniego elementu, gdy nowy został znaleziony i podświetlony:

// 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; 
     } 
    } 
} 

A skrypty! Załadowałem je z pliku przy użyciu FileUtils.readFileToString().

SCRIPT_GET_ELEMENT_BORDER (IE friendly version taken from this site), byłaby znacznie krótsza, gdyby używał podświetlania poprzez zmianę koloru tła, na przykład tylko dolną krawędź. Ale to jest najładniejsze :).

/* 
* 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]; 

Wszelkie pytania, uwagi, wnioski i ulepszenia są mile widziane!

+0

@Slance - dzięki za to! Przepraszam za moją niewiedzę, ale gdzie mogę nazwać powyższy kod w mojej klasie? – user929258

+0

Zamiast 'driver.findElement()', możesz teraz wywołać tylko 'findElement()' teraz, jeśli dodasz to do swojej klasy. Lub nazwij go w jakikolwiek inny właściwy sposób :). –

+0

OK, metoda przechowuje teraz oryginalną wartość graniczną znalezionego elementu i przywraca ją po podświetleniu nowego elementu. Mam nadzieję, że w końcu skończyłem edycję (bo nie mogę wymyślić żadnego innego usprawnienia) :). –

0

jestem nieświadomy sposób zrobić to w WebDriver, ale wygląda na to, istnieje klasa w selen WebDriver które powinny dać Ci dostęp do większości, jeśli nie wszystkich API RC. Nie wiem, jak to zrobić za pomocą WebDriver.

Klasa WebDriverBackedSelenium wygląda to zawiera wiele API RC masz w zwyczaju w tym getEval

Aby utworzyć obiekt typu WebDriverBackedSelenium, tylko przechodzą w sterowniku już zostały używając w uzupełnieniu do bazowy URL do testowania za

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

Należy pamiętać, że ta odpowiedź jest tymczasowa.Będę się rozglądał, aby sprawdzić, czy jest to możliwe przy użyciu wyłącznie WebDrivera – AndyPerfect

+0

. Tak, od tej pory nie ma takiej możliwości za pomocą WebDriver bez żadnego JavaScriptu. Jednak może to po prostu działać zgodnie z przeznaczeniem. –

0

używam poniżej kod do wyróżniania w moim webdriver kodu java przy użyciu JavaScript Executer:

// nawiązywać połączenia poniżej funkcji "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) { 
     } 
    } 

Mam nadzieję, że pomogło :)

4

W narzędziu webdriver
Utwórz klasę dla elementu 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, ""); 
      } 
     } 
} 

Można użyć

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

podkreślić WebElement z XPath " blaah blaah" w teście.

2

JavaScript: Znajdź Xpath danego element i Rysuj obramowanie wokół niego,

użyciu styleObj. setProperty (Właściwość CSS nazwa_właściwości, właściwość CSS, priorytet). element_node.style.setProperty ("background-color", "green", null);

testy js-kod na tej stronie: 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'); 
} 

Selen

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

Oto kod dla PODKREŚLAJĄC element selenu: Pierwszy utworzyć klasę:

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(); 
      } 

     } 

    } 

} 

a następnie można nazwać według:

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

Ten pracował dla mnie. Poprawiono kod przesłany wcześniej w tym wątku.

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; 
} 

nazywają te dwie funkcje raz, aby wyróżnić i raz usuwa zaznaczenie

Powiązane problemy