2012-10-24 14 views
24

che sto cercando di leggere l'esempio String 1000 da un <div> nascosto come questo:Come leggere il testo dall'elemento nascosto con Selenium WebDriver?

<div id="hidden_div" style="visibility:hidden">1000</div> 

Sono consapevole che WebElement.getText() non funziona su elementi nascosti in Selenio 2 (WebDriver), così ho cercato di soluzioni (like this one) ea quanto pare il seguente codice dovrebbe funzionare:

WebElement hiddenDiv = seleniumDriver.findElement(By.id("hidden_div")); 
String n = hiddenDiv.getText(); // does not work (returns "" as expected) 
String script = "return arguments[0].innerText"; 
n = (String) ((JavascriptExecutor) driver).executeScript(script, hiddenDiv); 

Ma non funziona per me, la variabile n finisce sempre come null. Che cosa sto facendo di sbagliato?

risposta

19

EDIT: Oh questo funziona.

String script = "return document.getElementById('hidden_div').innerHTML"; 

In firefox.

E così fa.

String script = "return arguments[0].innerHTML"; 

Ho provato pure ma non sembra funzionare con Javascript puro. Avvia il browser con Jquery come indicato qui. How to use JQuery in Selenium? e utilizzare il seguente codice per lo script.

String script = "return $('#hidden_div').text();"; 

Questo funziona.

+6

Secondo la FAQ Selenio WebDriver: ": Perché non è possibile interagire con gli elementi nascosti A:?. Dal momento che un utente non può leggere il testo in un elemento nascosto, WebDriver non permetterà l'accesso ad esso pure Tuttavia , è possibile utilizzare le capacità di esecuzione Javascript per chiamare getText direttamente dall'elemento ... " Ho finito per usare jQuery anche perché la mia app è basata su jQuery. Non sono sicuro se sono d'accordo con il ragionamento alla base di questa decisione espressa nelle FAQ, ma almeno c'è un modo per ottenere il testo nascosto. –

+1

Nelle vecchie versioni di selenio (almeno 2.25), era possibile ottenere il testo di un elemento nascosto. Nelle versioni più recenti (almeno 2.39), 'getText()' restituisce una stringa vuota se l'elemento non è visibile. Questo è in entrambi i casi diverso dal comportamento quando si interagisce con elementi nascosti. Se provi ad eseguire 'click()' o 'sendKeys (...)' otterrai una ElementNotVisibleException. –

+2

Solo per completezza: le domande frequenti su WebDriver possono essere lette in https://code.google.com/p/selenium/wiki/FrequentlyAskedQuestions. – sleske

0

Mi sono imbattuto nello stesso problema di lettura di elementi invisibili ma volevo un oggetto WebElement per eseguire un'ulteriore analisi (non solo il suo testo).

Questo bit di codice ha soddisfatto il mio requisito.

(WebElement) ((JavascriptExecutor) driver).executeScript(
    "arguments[0].style[\"display\"] = \"block\";"+ 
    "arguments[0].style[\"visibility\"] = \"visible\";"+ 
    "return arguments[0];", 
element); 
6

costruzione sul lavoro delle risposte già date, ho creato questo metodo di utilità (Java). Forse questo è utile per qualcun altro.

public static String getText(WebDriver driver, WebElement element){ 
    return (String) ((JavascriptExecutor) driver).executeScript(
     "return jQuery(arguments[0]).text();", element); 
} 
  • Io uso jQuery's text() per estrarre solo i nodi di testo. innerHTML ti darebbe anche tag HTML.
  • io uso jQuery invece di $ in caso di noConflict
  • non manipolare l'elemento o è la visibilità
37

potrebbe essere utile così:

In alcuni casi, si può trovare utile per ottenere il testo nascosto, che può essere recuperato dall'attributo textContent, innerText o , chiamando element.attribute('attributeName').

element.getAttribute("textContent") ha funzionato per me.

Vedi i dettagli della non -> http://yizeng.me/2014/04/08/get-text-from-hidden-elements-using-selenium-webdriver/

+3

Guai, questa è la risposta della gente! Stavo per fare il javascript nella risposta accettata sopra, ma ho provato questo, e funziona perfettamente. Molto più pulito –

+1

element.getAttribute ("textContent"). Trim() mi ha fornito esattamente ciò di cui avevo bisogno. – Bjinse

+0

Buona risposta! Ho avuto più fortuna con innerText che textContent, perché innerText combina più newline e spazi bianchi in un unico spazio, mentre textContent no. – frodo2975

0

Sono relativamente nuovo per Selenio (e alla programmazione nel suo complesso), ma io sono solo la condivisione di una soluzione che ha funzionato per me.

Il selenio 2 non è stato progettato per gestire direttamente elementi con visibilità nascosta. Ad esempio, non sarai in grado di trovare l'ID o il selettore CSS.

Avevo una situazione con un bot in cui avevo una tabella HTML con un sacco di itens e quando facevo clic su di essi, veniva aperto un menu a discesa con visibilità nascosta. Era anche in un'altra cornice.

È una situazione specifica, ma non sono riuscito a trovare alcuna soluzione, quindi ho scelto questo (cattivo), ma funziona in modo coerente, nonostante il brutto codice.

Per prima cosa dovresti switchToDesiredFrame(); - inserisci la tua logica driver.switchTo.frame() qui.

Than:

WebElement table = driver.findElements(By.tagName("table")).get(index_1); 

List<WebElement> dataCells= table .findElements(By.tagName("td")); 

WebElement spceificDataCellIWanted = dataCells.get(index_2); 

System.out.println(spceificDataCellIWanted.getText()); 

I dataCells sono letteralmente i <td> tag e diventano WebElements in un elenco altrettanto <td> 's sono gli elementi di una lista con il "contenitore" <table>.

Ha funzionato su Chrome e Firefox per me, ma non su alcun browser senza testa, non so esattamente perché. Se voi ragazzi incontrate qualcosa di simile e avete una soluzione più elegante (probabilmente non così difficile da trovare), per favore condividi!

0

Prova questo

 WebElement hiddenElement = GET YOUR ELEMENT HERE; 
     String hiddenContent= hiddenElement.getAttribute("textContent"); 
-1
type='hidden' 

Quando ci imbattiamo in un tale caso, la prima cosa che dobbiamo fare è cercare qualsiasi azione che non ha alcun cambiamento in quella pagina, come il drag ecc, allora fai un cambio di frame.

Provare uno getText(), se non funziona, provare quanto sopra come seconda alternativa.

Problemi correlati