Can someone please help!
How can I highlight all web elements in following class during test execution in WebDriver? With Selenium RC, it was quite straight forward but with WebDriver I am struggling.
I would be grateful if someone can please provide me with some code that I can try, also where would that code fit into the class below — sorry my Java skills aren't all that great.
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);
}
}
}
Based on that we can get the execution break down easily and in case of any exception we will easily keep track of it. Code snippet to perform highlight effect in selenium : JavascriptExecutor js = (JavascriptExecutor)driver; js. executeScript("arguments[0].
selectWindow - Selenium IDE You can use it with title=(title of tab to be selected, * wildcard is supported) or use tab= with number of the tab (e. g 0,1,2,...). Tab=0 is the main window (the one the macro runs ins), tab=1 the first tab to the right, tab=2 the second, and so on.
We can verify the color of a webelement in Selenium webdriver using the getCssValue method and then pass color as a parameter to it. This returnsthe color in rgba() format. Next, we have to use the class Color to convert the rgba() format to Hex. Let us obtain the color an element highlighted in the below image.
There is no way to do this in WebDriver
(as of v2.21.0). You can try replacing the usual findElement(By)
method with an adjusted one that uses JavaScript to highlight the found 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;
}
Now that you got the idea, there's an improved version that restores the original border
of the last element when a new one is found and highlighted:
// 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;
}
}
}
And the scripts! I load them from a file using FileUtils.readFileToString()
.
SCRIPT_GET_ELEMENT_BORDER (IE friendly version taken from this site), it would be way shorter if it used highlighting via changing the background color, say, only the bottom border. But this is the nicest one :).
/*
* 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];
Any questions, notes, requests and improvements are welcome!
In webdriver
Create a class for highligh element 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, "");
}
}
}
You can use
HighlightElement.highlightElement(driver.findElement(By.xpath("blaah blaah"));)
JavaScript : Find Xpath of an element and Draw Border around it,
using styleObj.setProperty(CSS propertyName, CSS propertyValue, priority) method.
element_node.style.setProperty ("background-color", "green", null);
test js-code on this site : 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');
}
Selenium
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);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With