2009-03-16 9 views
35

Mam aplikację GWT, dla której próbuję napisać kilka testów przy użyciu Selenium.Jak wybrać tylko widoczne elementy przy użyciu XPath?

Używam XPath do identyfikacji elementów na stronie do testów. Używanie id nie zadziała, ponieważ wartości GWT są automatycznie generowane i mogą się zmieniać. Wszystko zaczęło się dobrze, kiedy zdałem sobie sprawę, udało mi się znaleźć przyciski, etykietach, co następuje:

//button[.='OK'] 

Jednak kiedy zacząłem działa wiele testów zacząłem mieć problemy. Zdałem sobie sprawę, że problem polegał na tym, że wszystkie różne "strony" aplikacji GWT raz wygenerowanej przez JavaScript pozostają w ukrytym w HTMLu ukrytym <div> elementach. Oznaczało to, że moje selenowe testy czasami klikały ukryte przyciski zamiast przycisku widocznego w bieżącym widoku.

Badanie HTML z Firebug, wydaje się, że GWT ukrywa <div> elementy dodając display: none ich atrybutem style. Oznacza to mogę znaleźć wszystkie ukryte przyciski OK następująco:

//div[contains(@style,'display: none')]//button[.='OK'] 

Pozwoli to znaleźć wszystkie ukryte przyciski OK, tj przycisków, które mają przodka <div> który jest ukryty poprzez display: none w style.

Moje pytanie brzmi: w jaki sposób użyć XPath, aby znaleźć tylko widoczne przyciski OK? Jak znaleźć przyciski, które nie mają elementów nadrzędnych zw style?

Odpowiedz

46

To powinno działać:

.//button[.='OK' and not(ancestor::div[contains(@style,'display:none')]) 
and not(ancestor::div[contains(@style,'display: none')])] 

EDIT:

Im prostsze i bardziej efektywne wyrażenie poniżej:

//div[not(contains(@style,'display:none'))]//button[.='OK'] 

nie działa poprawnie, ponieważ każdy przycisk ma co najmniej jeden div, który jest widoczny w swoich przodkach.

+0

To wszystko. Wielkie dzięki. –

+1

Ostatni nie działa, jeśli istnieje inny div w drzewie dom, który nie jest ukryty:

Fortega

+0

@Fortega i mówi się w tekście wokół niego –

12

Selenium 2 Webdriver daje nam opcję metody isDisplayed(), która zajmuje się tym problemem. Dobra robota współpracowników selenu.

+1

Czy to działa, jeśli atrybut ukryty na ekranie występuje w elemencie nadrzędnym, a nie w samym elemencie? –

+2

Tak, ale musisz sprawdzić to dla danego elementu, nie można dopasować całej kolekcji. – sitnarf

+1

Należy zachować ostrożność, ponieważ może to spowodować wyjątki 'StaleElementReferenceException' podczas zmiany elementów między pobieraniem (' find by * ') i sprawdzaniem ich widoczności za pomocą' isDisplayed() '. – Blaise

-3
//div[contains(@style,'display: block')] 

Kod ten znajdzie widocznym elementem XPath

Powiązane problemy