Czy w Selenium 1.x lub 2.x istnieje sposób przewijania okna przeglądarki, tak aby określony element identyfikowany przez XPath był widoczny w przeglądarce? W Selenium istnieje metoda ustawiania ostrości, ale nie wydaje się, aby fizycznie przewijała widok w FireFox. Czy ktoś ma jakieś sugestie, jak to zrobić?
Potrzebuję tego, dlatego, że testuję kliknięcie elementu na stronie. Niestety zdarzenie nie działa, chyba że element jest widoczny. Nie mam kontroli nad kodem, który uruchamia się po kliknięciu elementu, więc nie mogę debugować ani modyfikować go, więc najłatwiejszym rozwiązaniem jest przewinięcie elementu do widoku.
selenium
scroll
automated-tests
Dan at Demand
źródło
źródło
Odpowiedzi:
Próbowałem wielu rzeczy w odniesieniu do przewijania, ale poniższy kod zapewnił lepsze wyniki.
To będzie przewijać, dopóki element nie będzie widoczny:
źródło
position: fixed
na swojej stronie i przesłania on element, który Selenium chce kliknąć. Dość często te stałe elementy znajdują się na dole, więc ustawieniescrollIntoView(true)
ładnie przenosi je na górę rzutni.true
doscrollIntoView
jeżeli przedmiotem jesteś przewijając jest pod którym aktualnie jesteś,false
jeśli obiekt jesteś przewijając jest powyżej, gdzie aktualnie jesteśmy. Trudno mi było to rozgryźć.Możesz użyć
org.openqa.selenium.interactions.Actions
klasy, aby przejść do elementu.Jawa:
Pyton:
źródło
Możesz spróbować tego.
źródło
js.ExecuteScript("arguments[0].scrollIntoView(true);" + "window.scrollBy(0,-100);", e);
z IE, Firefox ijs.ExecuteScript("arguments[0].scrollIntoViewIfNeeded(true);", e);
Chrome. Prosty.((JavascriptExecutor) driver).executeScript("javascript:window.scrollBy(0,250)");
To działało w Chrome. I jedyne rozwiązanie, które faktycznie dla mnie zadziałało. Taka sama sytuacja, jak w przypadku pierwszego komentatora, miałem na dole stały element, który zasłaniał element, który musiałem kliknąć.Jeśli chcesz przewijać okno Firefox za pomocą webdriver Selenium, jednym ze sposobów jest użycie JavaScript w kodzie Java. Kod JavaScript do przewijania w dół (na dół strony internetowej) wygląda następująco:
źródło
Wydaje się, że celowanie w dowolny element i wysyłanie klawiszy w dół (lub w górę / w lewo / w prawo) również działa. Wiem, że to trochę włamanie, ale tak naprawdę nie jestem zainteresowany użyciem JavaScript do rozwiązania problemu z przewijaniem.
Na przykład:
źródło
var elem = driver.FindElement(By.Id("element_id")); elem.SendKeys(Keys.PageDown);
Aby uzyskać więcej przykładów, przejdź tutaj . Wszystko po rosyjsku, ale kod Java jest międzykulturowy :)
źródło
W Selenium musimy skorzystać z pomocy JavaScript, aby przewinąć do elementu lub przewinąć stronę:
W powyższym zestawieniu
element
jest dokładny element, w którym musimy przewijać. Wypróbowałem powyższy kod i zadziałał on dla mnie.Mam kompletny post i wideo na ten temat:
http://learn-automation.com/how-to-scroll-into-view-in-selenium-webdriver/
źródło
Możesz użyć tego fragmentu kodu, aby przewijać:
DO#
Masz to
źródło
To działało dla mnie:
źródło
Selenium 2 próbuje przewinąć do elementu, a następnie kliknąć go. Wynika to z faktu, że Selenium 2 nie będzie oddziaływać z elementem, dopóki nie uzna, że jest widoczny.
Przewijanie do elementu odbywa się niejawnie, więc wystarczy znaleźć element, a następnie z nim pracować.
źródło
WebElement.click()
wymaga, aby element był widoczny, aby go kliknąć. Nie będzie przewijać się w twoim imieniu.Użyj sterownika, aby wysłać klucze takie jak klawisz pagedownlub downarrow, aby wyświetlić element. Wiem, że jest to zbyt proste rozwiązanie i może nie mieć zastosowania we wszystkich przypadkach.
źródło
element
na widocznej stronie i wysłanie PageDownelement.SendKeys(Keys.PageDown);
działało dla mnie.Z mojego doświadczenia wynika, że Selenium Webdriver nie przewija automatycznie do elementu po kliknięciu, gdy na stronie znajduje się więcej niż jedna przewijana sekcja (co jest dość powszechne).
Używam Ruby, a dla mojego AUT musiałem załatać metodę kliknięcia w następujący sposób;
Metoda „location_once_scrolled_into_view” jest istniejącą metodą klasy WebElement.
Doceniam, że nie używasz Ruby, ale powinno dać ci kilka pomysłów.
źródło
module Capybara :: module Node
i musiałem zadzwonićnative.location_once_scrolled_into_view
zamiast po prostulocation_once_scrolled_into_view
. Uratowałem również::Selenium::WebDriver::Error::UnknownError
, co często otrzymuję w Firefoksie 44.0.2. Uważam jednak, że to rozwiązanie nie jest wystarczająco elastyczne, i ostatecznie poddałem<Element>.native.location_once_scrolled_into_view
wywołania samemu testowi akceptacji, a następnie wpage.execute_script('window.scrollByPages(-1)')
razie potrzeby natychmiast .Element#scroll_into_view
która deleguje do Seleniumlocation_once_scrolled_into_view
. Ale oba nie robią nic innego niż domyślne zachowanie Selenium, więc elementy przepełnienia nadal mogą blokować to, co próbujemy kliknąć.Skrypt Ruby do przewijania elementu do widoku jest jak poniżej.
źródło
Czasami miałem również problem z przewijaniem za pomocą Selenium. Więc użyłem javaScriptExecuter, aby to osiągnąć.
Aby przewinąć w dół:
Lub też
Do przewijania w górę:
Lub,
źródło
Jeśli uważasz, że inne odpowiedzi były zbyt hackerskie, ta też jest taka, ale nie wiąże się to z iniekcją JavaScript.
Gdy przycisk jest poza ekranem, łamie się i przewija do niego, więc spróbuj ponownie ... ¯ \ _ (ツ) _ / ¯
źródło
Jest to powtarzające się rozwiązanie z JavaScript, ale z dodanym oczekiwaniem na element.
W przeciwnym razie
ElementNotVisibleException
może się pojawić, jeśli wykonywana jest akcja na elemencie.źródło
Użyłem tego sposobu do przewijania elementu i kliknięcia:
źródło
scrollIntoView(false)
działało, alescrollIntoView(true)
nie działało . Albo może działać , to zależy od twojego scenariusza.źródło
Możesz odwiedzić stronę Przewiń elementy sieciowe i stronę internetową Selenium WebDriver za pomocą Javascript :
źródło
W większości sytuacji do przewijania ten kod będzie działał.
źródło
JAWA
Spróbuj przewinąć do elementu użyj
x y
pozycji i użyjJavascriptExecutor
z tym argumentem:"window.scrollBy(x, y)"
.Po imporcie:
Najpierw musisz uzyskać
x y
lokalizację elementu.źródło
Nie jestem pewien, czy pytanie jest nadal aktualne, ale po odwołaniu się do dokumentacji scrollIntoView z https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView .
Najłatwiejszym rozwiązaniem byłoby
Spowoduje to przewinięcie elementu do środka strony.
źródło
Domyślne zachowanie Selenium polegające na przewijaniu powoduje, że element jest ledwo widoczny u góry rzutni. Ponadto nie wszystkie przeglądarki zachowują się dokładnie tak samo. To jest bardzo niezadowalające. Jeśli nagrywasz filmy z testów przeglądarki, tak jak ja, chcesz, aby element przewinął się do widoku i był wyśrodkowany pionowo .
Oto moje rozwiązanie dla Java:
A następnie, aby przewinąć, nazywasz to tak:
źródło
Oto jak to zrobić z PHP webDriver dla Selenium. Działa dla autonomicznego serwera Selenium 2.39.0 + https://github.com/Element-34/php-webdriver + Firefox 25.0
Uwaga: korzystam z dostosowanej wersji elementu WWW PHP Element34 PHP. Ale w rdzeniu nie ma żadnych zmian. Po prostu używam mojego „powitania” zamiast „elementu”. Ale nie ma to wpływu na przedmiotową sprawę. Autor sterownika mówi „aby zezwolić, aby prawie wszystkie wywołania API były bezpośrednią transformacją tego, co zdefiniowano w samym protokole WebDriver”. Więc nie powinieneś mieć problemu z innymi językami programowania.
Samo kliknięcie nie działa w mojej konfiguracji. Spowoduje to przewinięcie zamiast kliknięcia, więc musiałem kliknąć dwa razy bez wywoływania „location_in_view ()”.
Uwaga: Ta metoda działa w przypadku elementów, które można wyświetlić, takich jak przycisk wprowadzania typu.
Spójrz na: http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/location
Opis JsonWireProtocol # sugeruje użycie położenia + moveto, ponieważ lokalizacja _w_view jest metodą wewnętrzną.
źródło
Coś, co zadziałało, to użycie metody Browser.MoveMouseToElement na elemencie w dolnej części okna przeglądarki. Cudem działało w Internet Explorerze, Firefoksie i Chrome.
Wybrałem to zamiast techniki wstrzykiwania JavaScript tylko dlatego, że było mniej hackerskie.
źródło
Testowałem komponenty ADF i musisz mieć osobne polecenie przewijania, jeśli używane jest opóźnione ładowanie. Jeśli obiekt nie zostanie załadowany, a Ty spróbujesz go znaleźć za pomocą Selenium, Selenium zgłosi wyjątek polegający na nieodnalezieniu elementu.
źródło
Jeśli nic nie działa, wypróbuj to przed kliknięciem:
źródło
W Javie możemy przewijać za pomocą JavaScript, jak w poniższym kodzie:
Możesz przypisać żądaną wartość do zmiennej „elm.scrollTop”.
źródło
Rozwiązaniem jest:
źródło
Ten kod działa dla mnie:
źródło