testy selenium w javie - problem na jenkinsie

testy selenium w javie - problem na jenkinsie
AW
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 7 lat
  • Postów:5
0

hej,
mam problem z testami na jenkinsie. Lokalnie mi przechodzą a tam nie chcą. Mam błędy typu:

Kopiuj
Error Message

Index: 1, Size: 1

Stacktrace

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
	at java.util.ArrayList.rangeCheck(ArrayList.java:653)
	at java.util.ArrayList.get(ArrayList.java:429)
	at AgentPages.RecordWindow.selectClassifier(RecordWindow.java:88)
	at Agent.InboundTest.shouldToIdentifyInboundAuto(InboundTest.java:79)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

myślę że może to być wina tej metody. Czy ktoś ma pomysł dlaczego?

Kopiuj
public static  int classifierInputsValue = 1;
public void selectClassifier(int value) {
		waitforelement(2);

		findByNameAll("classifierId").get(classifierInputsValue).sendKeys(Keys.ARROW_DOWN);;
		waitforelement(2);

		driver.findElements(By.cssSelector("div.x4-boundlist-list-ct.x4-unselectable > ul > li")).get(value).click(); 
		waitforelement(1);
		driver.findElements(By.cssSelector(".Test-FCC-classifier-save-button")).get(classifierInputsValue).click();
		waitforelement(3);
	} 

**
albo ten. Ciężko mi stwierdzic:**

Kopiuj
public void state(int state){
		switch (state) {
		case 1:// agent is logged 
			
			List<String> activity = selectActivity(ConfigDB.agents_selenium_id); 
			Assert.assertEquals(UsersActivity.activity[0], activity.get(0));
			Assert.assertEquals(UsersActivity.activity[1], activity.get(1));
			Assert.assertEquals(UsersActivity.activity[2], activity.get(2));	
			break;
			
		case 2: 
			List<String> activityCall = selectActivity(ConfigDB.agents_selenium_id); 
			Assert.assertEquals(UsersActivity.activity[4], activityCall.get(0));
			Assert.assertEquals(UsersActivity.activity[3], activityCall.get(1));
			Assert.assertEquals(UsersActivity.activity[0], activityCall.get(2));
			Assert.assertEquals(UsersActivity.activity[1], activityCall.get(3));
			Assert.assertEquals(UsersActivity.activity[2], activityCall.get(4));
			break;
			
		case 3: 
			List<String> activityWrap = selectActivity(ConfigDB.agents_selenium_id); 
			Assert.assertEquals(UsersActivity.activity[5], activityWrap.get(0));
			Assert.assertEquals(UsersActivity.activity[3], activityWrap.get(1));
			Assert.assertEquals(UsersActivity.activity[0], activityWrap.get(2));
			Assert.assertEquals(UsersActivity.activity[1], activityWrap.get(3));
			Assert.assertEquals(UsersActivity.activity[2], activityWrap.get(4));
			break;

		default:
			
			break;
		}
	}
edytowany 2x, ostatnio: Agnieszka_W
shagrin
  • Rejestracja:około 17 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:Norwegia, Stavanger
1

Czym jest selectActivity i UsersActivity?

Z doswiadczenia wiem, ze waitForelement(x) jest malo stabilne, lepiej jest wykorzystac cos w stylu

Kopiuj
WebDriverWait wait = new WebDriverWait(getDriver(), someTimeoutMiliseconds); 
wait.until(elementIsVisible(selector)) // get element and element.isVisible()

AW
to są aktywności z bazy agentów. Np pracują na mailu mają 1, pracują na sms to mają 2.
krzysiek050
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:1272
1

Sprawdź czy odpalane jest to na tym samym silniku. Np. taki HTMLUnit jest mocno ograniczony w porównaniu do Chrome i dla bardziej skomplikowanych stron coś się może nie wyświetlić. U Ciebie znajduje odpowiedni element, a na Jenkinsie nie. Przy inicjalizacji testu, zaloguj nazwę silnika i porównaj. Dodatkowo w miejscu w którym się wykrzacza zaloguj rozmiar listy.

zyxist
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:101
1

Przy testach GUI musisz zawsze brać pod uwagę czasy ładowania się strony oraz jej przetwarzania przez przeglądarkę, które mogą być różne w zależności od maszyny. Z Selenium miałem dużo do czynienia i regularnie widywałem przypadki, o jakich mówisz: "lokalnie mi działa, a na Jenkinsie nie chce". Czemu? Bo maszyna z Jenkinsem była obciążona, sieć wprowadzała dodatkowe opóźnienie, a timeouty były wyskalowane pod aplikację uruchomioną lokalnie na komputerze programisty. Albo test w ogóle nie wykonywał żadnego czekania i nawet minimalne opóźnienie go wykrzaczało.

Twój konkretny błąd wynika z tego, że wywołanie findElements(By.cssSelector("div.x4-boundlist-list-ct.x4-unselectable > ul > li")) zwróciło pustą listę.

Ja mam dwie dobre strategie przy pisaniu testów GUI, które zawsze mi się sprawdzały w praktyce i poprawiały stabilność testów:

Konfigurowalne limity czasu

Wszystkie timeouty mnożę przez pewną liczbę, którą mogę podać do testów z zewnątrz. Domyślnie wynosi ona 1, ale jak widzę, że na Jenkinsie maszyna jest mocniej obciążona i nie wyrabia, to mogę ją zmienić na 1.5 i wtedy wszystkie timeouty będą dłuższe o 50%.

Czekanie na element charakterystyczny

Po wykonaniu jakiejś akcji (np. kliknięcie na element, wpisanie tekstu) czekam aktywnie na pojawienie się jakiegoś charakterystycznego elementu, który mówi mi, że przeglądarka już wyświetla to, co powinna. Dopiero wtedy przechodzę do szczegółowej weryfikacji. Przykład: przechodzę na inną podstronę, na której wyświetla się formularz, który chcę sprawdzić.

  1. Klikam w odnośnik,
  2. Czekam na pojawienie się na stronie znacznika <form> (mój wyróżnik) - czekanie jest aktywne, tj. w pętli odpytuję przeglądarkę o ten element co np. 250 ms (z limitem czasu np. 10 sekund).
  3. Dopiero gdy znacznik się pojawi, robię coś z polami formularza.

edytowany 1x, ostatnio: zyxist
AW
Dziękuję bardzo ! uczę się i szukam wszelkich praktycznych wskazówek. :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.