2013-10-29 14 views
5

Nel seguente codice ho bisogno di stampare il color in Hex format.getCssValue (Colore) in formato esadecimale in Selenium WebDriver

Prima riga L'istruzione di stampa sta mostrando il valore nel formato RGB che corrisponde a rgb(102,102,102).

La Seconda dichiarazione sta mostrando il valore in Hex che è #666666

Ma io sto entrando manualmente il valore nella seconda istruzione print, che è 102,102,102.

C'è un modo per passare il valore che ho ottenuto dalla prima istruzione (Colore) nella seconda istruzione di stampa e ottenere il risultato?

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 

public class Google { 

    public static void main(String[] args) throws Exception { 

     WebDriver driver = new FirefoxDriver(); 
     driver.get("http://www.google.com/"); 
     String Color = driver.findElement(By.xpath("//div[@class='gb_e gb_f gb_g gb_xb']/a")).getCssValue("color"); 
     System.out.println(Color); 
     String hex = String.format("#%02x%02x%02x", 102,102,102); 
     System.out.println(hex); 
    } 
} 

risposta

5

Way 1: Utilizzando StringTokenizer:

String color = driver.findElement(By.xpath("//div[@class='gb_e gb_f gb_g gb_xb']/a")).getCssValue("color"); 
String s1 = color.substring(4); 
color = s1.replace(')', ' '); 
StringTokenizer st = new StringTokenizer(color); 
int r = Integer.parseInt(st.nextToken(",").trim()); 
int g = Integer.parseInt(st.nextToken(",").trim()); 
int b = Integer.parseInt(st.nextToken(",").trim()); 
Color c = new Color(r, g, b); 
String hex = "#"+Integer.toHexString(c.getRGB()).substring(2); 
System.out.println(hex); 

Way 2:

String color = driver.findElement(By.xpath("//div[@class='gb_e gb_f gb_g gb_xb']/a")).getCssValue("color"); 
String[] numbers = color.replace("rgb(", "").replace(")", "").split(","); 
int r = Integer.parseInt(numbers[0].trim()); 
int g = Integer.parseInt(numbers[1].trim()); 
int b = Integer.parseInt(numbers[2].trim()); 
System.out.println("r: " + r + "g: " + g + "b: " + b); 
String hex = "#" + Integer.toHexString(r) + Integer.toHexString(g) + Integer.toHexString(b); 
System.out.println(hex); 
+0

In "Way 2" state usando solo 'numeri [0]', quando credo che dovreste effettivamente usare 'numeri [0]', 'numeri [1]' e 'numeri [2]' –

+0

Grazie Victor Moraes per evidenziare l'errore.Sì, dovrebbe essere numeri [0], numeri [1] e numeri [2]. Ho corretto di conseguenza. –

+0

"Way 2": i valori esadecimali dovrebbero molto probabilmente essere riempiti con gli 0 iniziali. Sono qui perché un 'driver.getElement(). GetCssValue (" background-color ")' restituisce e valore rgba: rgba (198, 15, 19, 1). DevTools fornisce un valore esadecimale: # c60f13, il codice sopra riportato restituisce # c6f13. suggerire 'String hex = String.format (" #% 02x% 02x% 02x ", r, g, b);' – mancocapac

7

Prima una citazione dalla documentazione di Selenium.

Ottieni il valore di una determinata proprietà CSS. I valori di colore devono essere restituiti come stringhe rgba, quindi, ad esempio se la proprietà "background-color" è impostata come "verde" nell'origine HTML, il valore restituito sarà "rgba (0, 255, 0, 1)". Si noti che le proprietà CSS di stenografia (es. Sfondo, font, bordo, border-top, margine, margine superiore, padding, padding-top, list-style, outline, pause, cue) non vengono restituite, in conformità con Specifica DOM CSS2: per accedere ai valori desiderati, è necessario accedere direttamente alle proprietà di lunghezza pari a (ad es. Colore di sfondo).

Quindi questa non è una domanda specifica per il selenio, questa è solo una domanda di programmazione generale su come analizzare la stringa rgba(102,102,102) su tre numeri.

// Originally untested code, just the logic. 
// Thanks for Ripon Al Wasim's correction. 

String color = driver.findElement(By.xpath("//div[@class='gb_e gb_f gb_g gb_xb']/a")).getCssValue("color"); 

String[] numbers = color.replace("rgba(", "").replace(")", "").split(","); 
int r = Integer.parseInt(numbers[0].trim()); 
int g = Integer.parseInt(numbers[1].trim()); 
int b = Integer.parseInt(numbers[2].trim()); 
System.out.println("r: " + r + "g: " + g + "b: " + b); 

String hex = "#" + Integer.toHexString(r) + Integer.toHexString(g) + Integer.toHexString(b); 
System.out.println(hex); 
+0

Grazie mille – user2410266

+0

user1177636: Il codice precedente è stato Integer.toHexString (), ma parametro deve essere intero come Integer.toHexString () –

+0

La logica è assolutamente right, user1177636 –

3

So che questo è un po 'vecchia, ma è possibile ottenere una soluzione più semplice utilizzando org.openqa.selenium.support.Color:

import org.openqa.selenium.support.Color; 
String color = driver.findElement(By.xpath("//div[@class='gb_e gb_f gb_g gb_xb']/a")).getCssValue("color"); 
System.out.println(color); 
String hex = Color.fromString(color).asHex(); 
System.out.println(hex); 

Offre una soluzione a linea singola e aggiunge anche zero iniziali quando richiesto (cosa che le risposte precedenti non sono contabili)

1

Il codice funziona, ma solo un piccolo errore di battitura. Il Color.fromString sarebbe superiore caso C

import org.openqa.selenium.support.Color; 

String color = driver.findElement(By.xpath("xpath_value")).getCssValue("color"); 
System.out.println(color); 
String hex = Color.fromString(color).asHex(); 
System.out.println(hex); 
+0

Non credo che un solo errore di battitura nella mia risposta sarebbe un motivo per aggiungere un'altra risposta a Questo. Basta modificarlo, come hai fatto tu. Inoltre, quando dici "Il codice funziona, ma solo un piccolo refuso" non è chiaro di quale codice stai parlando. So che ti stai riferendo al mio perché ho ricevuto la notifica, ma per i nuovi arrivati ​​potrebbe non essere così chiaro. Se insisti nel fornire una risposta separata, ti consiglio di aggiungere un link al mio, per chiarezza. A proposito, ora che modifichi la mia risposta, il tuo è solo un mio duplicato con niente da aggiungere (ed è anche obsoleto, dal momento che il mio non ha più errori di battitura) –

+0

grazie bro, non ho potuto modificare o commentare perché io sono sotto i 15 anni –

Problemi correlati