2013-10-29 15 views
5

Mam znacznik HTML div, a wewnątrz elementu div znajduje się element, który pojawia się, gdy mysz wchodzi w jego granice. Teraz chcę kliknąć element, który staje się widoczny po wprowadzeniu lub najechaniu myszą.Selenum Zawieszanie elementów z IE

Problem: element zaczyna migać. Przeglądarka: IE8

Używam poniższy kod

IWebElement we = addToBasket.FindElement(By.Id("MyBox")); 
    action.MoveToElement(we).MoveToElement(driver.FindElement(By.Id("plus-icon"))).Click().Build().Perform(); 

Wszelkie sugestie dlaczego jego miga?

+0

Którą wersję selenu używasz? – Karthikeyan

+0

IE11 nadal cierpi na ten problem. Na szczęście poniższe rozwiązanie nadal działa, też :). –

Odpowiedz

17

Element miga ze względu na funkcję sterownika IE o nazwie "uporczywe zawieszanie". Ta funkcja ma wątpliwą wartość, ale jest wymagana z powodu martwego w mózgu sposobu IE (przeglądarki, a nie sterownika) responds to WM_MOUSEMOVE messages podczas korzystania z interfejsu API SendMessage.

Masz kilka opcji. Można włączyć uporczywe najechania kursorem wyłączyć za pomocą kodu jak poniżej:

InternetExplorerOptions options = new InternetExplorerOptions(); 
options.EnablePersistentHover = false; 
IWebDriver driver = new InternetExplorerDriver(options); 

Należy pamiętać jednak, że będzie to narażać cię na kaprysy gdzie fizyczny kursor na ekranie jest wyświetlany podczas próby unosić. Jeśli to nie do przyjęcia, możesz wziąć couple of other approaches. Po pierwsze, możesz wyłączyć tak zwane "zdarzenia natywne", które spowodują, że sterownik będzie polegać wyłącznie na zsyntetyzowanych zdarzeniach JavaScript. To podejście ma swoje własne pułapki, ponieważ polega tylko na JavaScript, aby zsyntetyzować zdarzenia myszy.

InternetExplorerOptions options = new InternetExplorerOptions(); 
options.EnableNativeEvents = false; 
IWebDriver driver = new InternetExplorerDriver(options); 

Wreszcie, można migrować z użyciem domyślnego SendMessage Windows API do kodu, który używa więcej poprawnego SendInput API. Odbywa się to za pomocą właściwości RequireWindowFocus. Jego wadą jest to, że wejście myszy jest wstrzykiwane na bardzo niskim poziomie w systemie, co wymaga, aby okno IE było oknem pierwszego planu w systemie.

InternetExplorerOptions options = new InternetExplorerOptions(); 
options.RequireWindowFocus = true; 
IWebDriver driver = new InternetExplorerDriver(options); 

Na zakończenie nie należy ustawiać wszystkich tych właściwości naraz; wybierz podejście i trzymaj się go. Kilka z nich wzajemnie się wyklucza, a interakcja między nimi jest nieokreślona.

+0

Dzięki Jim. użyj powyższej opcji, gdy miganie zostało zatrzymane. ale potem musiałem fizycznie zawisnąć myszką, jak powiedziałeś. Znalazłem rozwiązanie, które pasowało do mojej sprawy. http://code.google.com/p/selenium/wiki/InternetExplorerDriver. tutaj mówią podczas wykonywania testu utrzymywać kurs myszy w granicach przeglądarki. przestałem mrugać i mogłem kliknąć element. – Aman

+0

Możesz to zaznaczyć jako odpowiednią odpowiedź. – JimEvans

+0

Od wersji Selon 2.47.1 interfejs API został zmieniony. Teraz jest to ieCapabilities.setCapability (InternetExplorerDriver.NATIVE_EVENTS, false) ;. –

0

To zadziałało dla mnie.

WebElement element = driver.findElement(By.xpath("element xpath")); 
Locatable hoverItem = (Locatable) element; 
Mouse mouse = ((HasInputDevice) driver).getMouse(); 
mouse.mouseMove(hoverItem.getCoordinates()); 
Powiązane problemy