2013-05-10 9 views
5

Mam stronę z dwoma listami rozwijanymi. Wybranie opcji w jednym menu spowoduje aktualizację listy opcji w innym menu rozwijanym za pomocą skryptu wywoływanego przez rozmycie. Zdarzenie rozmycia jest wyzwalane, gdy ostrość zostanie przesunięta z pierwszego menu rozwijanego. To wszystko działa poprawnie podczas ręcznego przeglądania strony.Akcje za pośrednictwem WebDriver nie wywołają zdarzenia rozmycia

Jednak podczas wykonywania tych samych czynności za pośrednictwem WebDriver, zdarzenie blur nie jest nigdy wyzwalane, a menu rozwijane nigdy nie jest aktualizowane, co powoduje, że mój skrypt nie działa.

Oto html dla rozwijanym wybiorę pierwszy (i który ma skrypt onblur z nim związane:

<select id="newOrder:shipToAddressType" class="fieldRequired"  onblur="PrimeFaces.ab({source:this,event:'blur',process:'newOrder:odShipData',update:'newO>rder:odShipData',partialSubmit:true,oncomplete:function(xhr,status,args)>{focusOnShipToZip();;}}, arguments[1]);" tabindex="47" size="1" name="newOrder:shipToAddressType"> 
<option selected="selected" value="125">Domestic</option> 
<option value="126">International</option> 
<option value="127">Military</option> 
</select> 

Oto, co starałem dotąd:

Poruszanie stronę jako I Ręcznie dokonam wyboru z rozwijanego menu, a następnie wpisuję tekst w innym polu, aby przenieść fokus z listy rozwijanej, aby wywołać zdarzenie blur. To nie zadziałało. Próbowałem też tab-out z listy rozwijanej, także nie powodzenia

Wykonanie javascript w celu wywołania rozmycia Wiem, że javascript jest poprawny, ponieważ mogę go uruchomić z firebug: uruchamia aktualizację drugiego menu rozwijanego. Jednak z WebDrivera nie wydaje się, by cokolwiek wyzwalało.

JavascriptExecutor js = (JavascriptExecutor) driver; 
js.executeScript("document.getElementById('newOrder:shipToAddressType').blur()"); 

Jakieś sugestie? Dzięki za pomoc.

Edytuj: Próbowałem dodać "return" do ciągu skryptu. Także nie działa:

JavascriptExecutor js = (JavascriptExecutor) driver; 
js.executeScript("return document.getElementById('newOrder:shipToAddressType').blur()"); 

Odpowiedz

5

Oto kilka pomysłów:

Użyj TAB, aby przejść do następnego pola. Symulowałoby to użytkownika, który kliknąłby klawisz TAB, aby przejść do następnego pola i teoretycznie powinien symulować rozmycie w przeglądarce.

Można to zrobić za pomocą metody SendKeys:

WebElement element = driver.findElement(By.id('newOrder:shipToAddressType')); 
element.sendKeys("\t"); 

wstrzyknąć javascript, aby symulować metodę rozmycia. Próbowałeś już tego spróbować, ale zapomniałeś jednego ważnego aspektu: executeScript - zawsze return Twój kod!

Ostatnią rzeczą, która mogłaby być pomocna w informowaniu o tym, której przeglądarki używasz, tylko w celach informacyjnych.

UPDATE

Spróbuj dać bezpośredni ostrość na elemencie, a następnie unfocus (rozmycie) to:

WebElement element = driver.findElement(By.id('newOrder:shipToAddressType')); 
JavascriptExecutor js = (JavascriptExecutor) driver; 
js.executeScript("arguments[0].focus(); arguments[0].blur(); return true", element); 
+0

Dzięki za wejście. Próbowałem już zaczepienia (zobacz mój oryginalny wpis), ale nie próbowałem jeszcze dodać zwrotu. Zrobi to. Dzięki. – user973718

+0

Dodano "powrót" do mojego łańcucha javascript. Bez zmian: nie jest wywoływane zdarzenie blur. Dodano to do OP – user973718

+0

W twoim javascriptu, upewnij się, że element WebDriver zostanie ci zwrócony przez usunięcie '.blur()'. Twoja zmienna 'js' powinna zawierać element WebDriver. Jeśli tak nie jest, to dlatego nie działa rozmycie ... nie może poprawnie znaleźć elementu! Jeśli tak, pójdziemy dalej. – bbbco

0

Spróbuj użyć klasy Akcje myszy wsparcie WebDriver i obsługi interakcji za pomocą tego Klasa coś takiego:

WebElement element = driver.findElement(By.id('newOrder:shipToAddressType')); 
(new Actions(driver)).moveToElement(element ,500,500).build().perform(); 

Pozwoli to przenieść jak najwięcej pikseli jak go ustawić i wyzwolić zdarzenie rozmycia

2

Inną opcją jest próba wywołania kliknięcia na coś poza wejściem, na przykład na ciele.

driver.findElement(By.tagName("body")).click(); 

To działa dla mnie.

Powiązane problemy