Selenium 4 grid를 사용할 때에 어떤 노드/슬롯에 세션이 할당되어있고, 어떤 노드에 세션이 할당되어있지 않은지를 확인할 수 있습니다.
https://www.selenium.dev/documentation/grid/advanced_features/endpoints/#grid-status
{허브 URL}/status
를 GET으로 호출하게 되면 대강 아래와 같은 json 응답값을 받아볼 수 있습니다.
{
"value": {
"ready": true,
"message": "Selenium Grid ready.",
"nodes": [
{
"id": "c0de4f4c-bb81-4da6-b617-55353b0bbade",
"uri": "~~~~",
"maxSessions": 4,
"osInfo": {
"arch": "aarch64",
"name": "Mac OS X",
"version": "14.4.1"
},
"heartbeatPeriod": 60000,
"availability": "UP",
"version": "4.12.0 (revision 249f2a7d1b*)",
"slots": [
{
"id": {
"hostId": "c0de4f4c-bb81-4da6-b617-55353b0bbade",
"id": "4406d9fe-ee8a-45f0-8201-770453f42b07"
},
"lastStarted": "2024-12-09T09:19:32.141015Z",
"session": null,
"stereotype": {
"appium:automationName": "UiAutomator2",
"appium:platformVersion": "14",
"appium:systemPort": "8210",
"appium:udid": "~~~~",
"platformName": "ANDROID"
}
},
{
"id": {
"hostId": "c0de4f4c-bb81-4da6-b617-55353b0bbade",
"id": "dbaf6db5-7194-4f10-8e7f-be2bc2e22b72"
},
"lastStarted": "2024-12-09T09:21:32.301461Z",
"session": {
"capabilities": {
...
},
"sessionId": "417f5ef1-3b42-45f7-8502-7a1fc3d81581",
"start": "2024-12-09T09:21:32.301461Z",
"stereotype": {
"appium:automationName": "UiAutomator2",
"appium:platformVersion": "13",
"appium:systemPort": "8230",
"appium:udid": "R3CR705TTTT",
"platformName": "ANDROID"
},
"uri": "~~~"
},
"stereotype": {
"appium:automationName": "UiAutomator2",
"appium:platformVersion": "13",
"appium:systemPort": "8230",
"appium:udid": "R3CR705TTTT",
"platformName": "ANDROID"
}
},
{
"id": {
"hostId": "c0de4f4c-bb81-4da6-b617-55353b0bbade",
"id": "3e5f2bcf-e143-4b1a-ab98-996cef0e93dc"
},
"lastStarted": "2024-12-09T09:21:49.726799Z",
"session": {
"capabilities": {
....
},
"sessionId": "3825cfc5-4132-43ff-a72e-a42abc112197",
"start": "2024-12-09T09:21:49.726799Z",
"stereotype": {
"appium:automationName": "UiAutomator2",
"appium:platformVersion": "14",
"appium:systemPort": "8220",
"appium:udid": "~~~~",
"platformName": "ANDROID"
},
"uri": "~~~"
},
"stereotype": {
"appium:automationName": "UiAutomator2",
"appium:platformVersion": "14",
"appium:systemPort": "8220",
"appium:udid": "~~~",
"platformName": "ANDROID"
}
},
{
"id": {
"hostId": "c0de4f4c-bb81-4da6-b617-55353b0bbade",
"id": "04699647-8809-4565-bf8e-f7c204318515"
},
"lastStarted": "2024-12-09T09:20:42.165752Z",
"session": null,
"stereotype": {
"appium:automationName": "UiAutomator2",
"appium:platformVersion": "13",
"appium:systemPort": "8200",
"appium:udid": "~~~~",
"platformName": "ANDROID"
}
}
]
}
]
}
}
위 json의 구조를 잘 확인하시면, 하나의 노드에 4개의 슬롯이 있습니다.
하나의 노드로 최대 4개의 세션을 연결할 수 있는 셈입니다.
여기서 session
필드를 확인하면, 세션이 연결되지 않은 슬롯은 null
이고, 세션이 연결된 슬롯은 capabiliteis
라던지 그 외 다른 정보들이 포함되어있다는 것을 알 수 있습니다. 이 걸로 어떤 슬롯이 비어있는지, 어떤 슬롯에는 세션이 연결되어 테스트가 수행중인지를 알 수 있습니다.
Selenium grid는 기본적으로, Selenium / Appium 테스트 실행 시에 request에 포함되어서 온 capabilites
와 일치하는 정보를 가진 노드의 슬롯을 찾아 연결해줍니다. 다만 해당 정보를 가진 슬롯에 지금 세션이 할당되어있다면, 추가로 들어온 세션을 큐에 집어넣었다가 먼저 들어온 세션이 종료하면 이어서 연결을 해줍니다. 다만 이렇게되면 테스트 실행시간이 늘어난다거나 하는 이슈가 있습니다. (이전 테스트의 실행시간이 너무 길어져서 큐에 들어간 세션이 그대로 타임아웃이 발생해서 테스트가 실행실패되는 경우도 있을 수 있음)
혹은 특정 테스트는 특정 단말기 / 특정 환경에만 할당되는 이슈가 있을 수 있습니다.
위의 /status
의 session
필드값의 상태를 통해 호출하고자 하는 슬롯이 실행중이면 다른 슬롯을 찾아 세션을 이어줄 수 있어서, 테스트 실행 시간을 좀 더 빠르게 가져감은 물론이고, 특정 테스트가 특정 환경에서만 실행되는 이슈도 막을 수 있을 것 입니다.
간만에 포스팅 끝!
ref.