2012-10-24 15 views
24

Próbuję odczytać przykład String 1000 z ukrytej <div> tak:Jak odczytać tekst z ukrytego elementu za pomocą Selenium WebDriver?

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

Jestem świadomy, że WebElement.getText() nie działa na ukrytych elementów w Selen 2 (WebDriver), więc szukałem rozwiązań (like this one) i najwyraźniej następujący kod powinien działać:

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

Ale to nie działa dla mnie, zmienna n zawsze kończy jako null. Co ja robię źle?

Odpowiedz

19

EDYCJA: Oh to działa.

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

W firefox.

I tak to robi.

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

Próbowałem jak dobrze, ale nie wydaje się do pracy z czystym JavaScript. Uruchom przeglądarkę za pomocą Jquery , jak wspomniano tutaj. How to use JQuery in Selenium? i użyj następującego kodu dla skryptu.

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

To działa.

+6

Według Selen WebDriver FAQ: „: Dlaczego nie jest możliwe, aby współdziałać z ukrytymi elementami A:?. Ponieważ użytkownik nie może czytać tekst w ukrytym elemencie WebDriver nie pozwoli na dostęp do niego, jak również jednak , możliwe jest wykorzystanie możliwości wykonywania Javascript do wywoływania getText bezpośrednio z elementu ... " Skończyło się również na używaniu jQuery, ponieważ moja aplikacja jest zbudowana na jQuery. Nie jestem pewien, czy zgadzam się z uzasadnieniem tej decyzji zawartym w FAQ, ale przynajmniej istnieje sposób na uzyskanie ukrytego tekstu. –

+1

W starszych wersjach Selenium (co najmniej 2.25) można było uzyskać tekst ukrytego elementu. W nowszych wersjach (co najmniej 2,39) 'getText()' zwraca pusty łańcuch, jeśli element nie jest widoczny. Jest to w obu przypadkach odmienne od zachowania podczas interakcji z ukrytymi elementami. Jeśli spróbujesz wykonać 'click()' lub 'sendKeys (...)' otrzymasz wyjątek ElementNotVisibleException. –

+2

Tylko dla kompletności: WebDriver FAQ można przeczytać pod https://code.google.com/p/selenium/wiki/FrequentlyAskedQuestions. – sleske

0

Natknąłem się na ten sam problem z odczytaniem niewidocznych elementów, ale chciałem zwrócić obiekt WebElement, aby wykonać dalsze przetwarzanie (nie tylko jego tekst).

Ten fragment kodu spełnił moje wymagania.

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

W oparciu o pracę już udzielonych odpowiedzi, stworzyłem tę metodę użytkową (Java). Może to jest pomocne dla kogoś innego.

public static String getText(WebDriver driver, WebElement element){ 
    return (String) ((JavascriptExecutor) driver).executeScript(
     "return jQuery(arguments[0]).text();", element); 
} 
  • używam jQuery's text() wyodrębnić tylko węzły tekstowe. innerHTML dałoby również tagi HTML.
  • używam jQuery zamiast $ w przypadku noConflict
  • nie manipulować element lub jego widoczność
37

może być przydatna także:

W niektórych przypadkach, można znaleźć przydatne aby uzyskać ukryty tekst, który można pobrać z atrybutu elementu: textContent, innerText lub innerHTML, wywołując element.attribute('attributeName').

element.getAttribute("textContent") pracował dla mnie.

Zobacz więcej szczegółów tam -> http://yizeng.me/2014/04/08/get-text-from-hidden-elements-using-selenium-webdriver/

+3

Biada, to jest odpowiedź ludzi! Miałem zamiar zrobić javascript w zaakceptowanej odpowiedzi powyżej, ale spróbowałem tego i działa idealnie. Znacznie czystsze. –

+1

element.getAttribute ("textContent"). Trim() dał mi dokładnie to, czego potrzebowałem. – Bjinse

+0

Dobra odpowiedź! Mam więcej szczęścia z innerText niż textContent, ponieważ innerText łączy wiele linii prostych i białych znaków w jedną pojedynczą przestrzeń, podczas gdy textContent nie. – frodo2975

0

Jestem stosunkowo nowy w selen (i do programowania jako całość), ale jestem po prostu dzielenie rozwiązanie, które pracowały dla mnie.

Selenium 2 nie zostało zaprojektowane do bezpośredniego obsługiwania elementów z ukrytą widocznością. Nie będzie można na przykład znaleźć identyfikatora lub selektora CSS.

Miałem sytuację z botem, w którym miałem tabelę HTML z mnóstwem przedmiotów, a kiedy kliknąłem na nich, otworzyło się menu z ukrytą widocznością. Było nawet w innej ramce.

To konkretna sytuacja, ale nie mogłem znaleźć żadnego rozwiązania, więc wybrałem tę (złą), ale działa to bardzo konsekwentnie, pomimo brzydkiego kodu.

Najpierw należy switchToDesiredFrame(); - wprowadź tutaj swoją logikę driver.switchTo.frame().

niż:

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

W dataCells są dosłownie <td> znaczniki i stają WebElements na liście tak <td> „s są elementy na liście pod«pojemnik»<table>.

To działało dla przeglądarki Chrome i Firefox, ale nie dla żadnej przeglądarki bezgłowej, nie wiem dokładnie dlaczego. Jeśli spotkacie coś takiego i macie bardziej eleganckie rozwiązanie (prawdopodobnie nie tak trudno je znaleźć), proszę podzielcie się!

0

Spróbuj

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

Kiedy natkniemy każdym takim przypadku, pierwsze co należy zrobić, to próbować żadnych działań, które nie wprowadza żadnych zmian na tej stronie, jak drag etc, a następnie Zrób przełącznik ramki.

Wypróbuj getText(), jeśli to nie działa, spróbuj powyższej opcji jako drugiej alternatywy.

Powiązane problemy