2012-12-06 9 views
8

Chciałbym sprawdzić, czy użytkownik może zobaczyć element w bieżącym widoku przeglądarki bez przewijania.Sprawdzanie, czy element jest rzeczywiście widoczny dla użytkownika

Co znalazłem może sprawdzić, czy element jest gdzieś na stronie.

Inną wskazówką zasugerował, by sprawdzić położenie elementów, ale wtedy musiałbym dostać wymiary widocznym oknie przeglądarki oraz jej x/y offset 0/0.

Byłbym wdzięczny, gdyby ktoś mógł wskazać mi rozwiązanie, które nie wymaga kodu JavaScript.

+2

Niestety, nie ma mowy bez JavaScript. Czemu tego nie chcesz? Czy cokolwiek z [tutaj] (http://stackoverflow.com/questions/704758/how-to-check-if-an-element-is-really-visible-with-javascript) pomaga? –

+0

@Slanec Na przykład, mam błąd, w którym z powodu słabego CSS, przycisk, który musi zostać kliknięty, jest pozycjonowany, na przykład przy szerokości widoczności wynoszącej 110%, a przepełnienie jest ustawione na ukryte. Zatem przycisk NIGDY nie będzie kliknięciem, a nie przewijaniem, zmianą rozmiaru ani niczym. Dzieje się tak tylko w IE11. Tak więc teraz chcę, żeby przypadek testowy sprawdzał, czy przycisk jest widoczny, aby dodać do regresji produktu. Niestety funkcja isDisplayed() jest prawdziwa dla elementu. – dmansfield

+0

Sprawdzam widoczność elementu za pomocą Css, indeks Z. Czy mogę sprawdzić widoczność elementu, w tylnej warstwie innego elementu. – bcrajkumar

Odpowiedz

2

Jak definiujesz "widoczny dla użytkownika"? Jak masz zamiar to sprawdzić? Jeśli ma wysokość? Jeśli nie jest ukryty przez CSS? A co, jeśli element nadrzędny jest ukryty przez CSS?

Najbardziej niezawodnym sposobem będzie użycie wbudowanej w Selenium właściwości .Displayed (jeśli używasz języka C#, Java ma coś podobnego) i połączyć ją z "widocznym" selektorem jQuery: http://api.jquery.com/visible-selector/. Przykład poniżej, w C#.

var element = Driver.FindElement(By.Id("test")); 
bool isVisible = element.Displayed; 
var javascriptCapableDriver = (IJavascriptExecutor)Driver; 
bool jQueryBelivesElementIsVisible = javascriptCapableDriver.ExecuteScript("return $('#myElement').is(:visible);"); 
bool elementIsVisible = isVisible && jQueryBelievesElementIsVisible; 

Otrzymają one większość przypadków.

Nie jest możliwe bez kodu po stronie klienta lub w przygotowaniu, że ktoś inny znajdzie sposób, w jaki można to zrobić w języku po stronie serwera, mam duże wątpliwości, że będzie ładny, czytelny lub niezawodny.

jQuery ma metodę offset():

http://api.jquery.com/offset/

To jednak nie będzie działać, gdy biorąc pod uwagę granice, marginesy, tego rodzaju rzeczy.

+1

Chciałbym zdefiniować ** widoczny **, ponieważ element jest w widoku portu i nie jest ukryty przez inne elementy przed nim. – Cani

+0

@Cani To naprawdę powinno być wykonalne, metoda 'click()' podnosi wyjątek w tych właśnie okolicznościach (z komunikatem "Element <> nie można kliknąć w punkcie (546, 18) .Inny element otrzyma kliknięcie: <> "). Po prostu nie mogę wymyślić, jak to zrobić bez wywoływania kliknięcia, jeśli jest widoczne ... – Izkata

Powiązane problemy