To stare pytanie, ale wciąż aktualne. Używam Chrome Driver v2.53.
Wygląda na to, że klucze są wysyłane jeden po drugim do przeglądarki (np. Oddzielne zdarzenia keyDown). Kiedy zdarza się zbyt szybko, a następnie jeden z dwóch wyników można zaobserwować:
- znaki są przesunięte
- znaków brakuje
Moje rozwiązanie jest następujące:
protected void sendKeys(final WebElement element, final String keys) {
for (int i = 0; i < keys.length(); i++){
element.sendKeys(Character.toString(keys.charAt(i)));
waitUntil(attributeContains(element, "value", keys.substring(0, i)));
}
}
Jest niezawodne i działa wystarczająco szybko. Co więcej, gdy chcemy wyczyścić pole wejściowe przed wysłaniem kluczy, może nastąpić to samo przesunięcie zdarzenia, np.g:
element.clear();
element.sendKeys("abc");
Jest możliwe, że wyraźna operacja nastąpi w jednym z czterech miejsc:
- przed wysłaniem literę "a"
- przed wysłaniem litera "B"
- przed wysłaniem listu "c"
- po wysłaniu listu "c"
polecam zawsze sprawdzić, czy operacja my właśnie wykonany został zrealizowany z powodzeniem, np: gdy chcemy wyczyścić pole wprowadzania jest to dobra praktyka, aby:
- sprawdzić wartość pola wprowadzania
- jeśli wartość jest pusta struna następnie powrócić
- jeśli wartość nie jest pustym ciągiem następnie wywołać clear() funkcję i czekać, aż wartość będzie równa pusty ciąg
to dużo operatu jon do wykonania dla prostego zadania. Jednak sprawi to, że test będzie bardziej stabilny.
Czy próbowałeś wysłać ciąg z wieloma wywołaniami 'sendKeys'? Czy jest jakaś różnica? – LaurentG
Zobacz także http://stackoverflow.com/questions/18013821/pythons-selenium-send-keys-with-chrome-driver-drops-characters –