testy selenium w javie - problem na jenkinsie

0

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

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?

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:**

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;
		}
	}
1

Czym jest selectActivity i UsersActivity?

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

WebDriverWait wait = new WebDriverWait(getDriver(), someTimeoutMiliseconds); 
wait.until(elementIsVisible(selector)) // get element and element.isVisible()
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.

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1