{"id":14978842,"url":"https://github.com/alcounit/selenosis","last_synced_at":"2025-04-07T11:06:55.563Z","repository":{"id":42368115,"uuid":"307371983","full_name":"alcounit/selenosis","owner":"alcounit","description":"Scalable, stateless selenium hub for Kubernetes cluster","archived":false,"fork":false,"pushed_at":"2024-02-27T22:25:56.000Z","size":168,"stargazers_count":82,"open_issues_count":11,"forks_count":26,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-03-31T09:06:32.845Z","etag":null,"topics":["automated-testing","automation","docker","go","golang","k8s","kubernetes","selenium","selenium-grid","selenium-server","selenium-webdriver","webdriver"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alcounit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-10-26T12:54:31.000Z","updated_at":"2025-02-02T17:44:45.000Z","dependencies_parsed_at":"2024-09-24T01:30:45.550Z","dependency_job_id":null,"html_url":"https://github.com/alcounit/selenosis","commit_stats":{"total_commits":73,"total_committers":2,"mean_commits":36.5,"dds":0.0273972602739726,"last_synced_commit":"afe761964ec20b9bc9a9661bf36b8da9cd870ce3"},"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alcounit%2Fselenosis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alcounit%2Fselenosis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alcounit%2Fselenosis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alcounit%2Fselenosis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alcounit","download_url":"https://codeload.github.com/alcounit/selenosis/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247640462,"owners_count":20971557,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automated-testing","automation","docker","go","golang","k8s","kubernetes","selenium","selenium-grid","selenium-server","selenium-webdriver","webdriver"],"created_at":"2024-09-24T13:58:30.791Z","updated_at":"2025-04-07T11:06:55.537Z","avatar_url":"https://github.com/alcounit.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"![GitHub release (latest by date)](https://img.shields.io/github/v/release/alcounit/selenosis)\n![Docker Pulls](https://img.shields.io/docker/pulls/alcounit/selenosis)\n![GitHub](https://img.shields.io/github/license/alcounit/selenosis)\n# selenosis\nScalable, stateless selenium hub for Kubernetes cluster.\n\n## Overview\n### Available flags\n```\n[user@host]$ ./selenosis --help\nScallable, stateless selenium grid for Kubernetes cluster\n\nUsage:\n  selenosis [flags]\n\nFlags:\n      --port string                          port for selenosis (default \":4444\")\n      --proxy-port string                    proxy continer port (default \"4445\")\n      --browsers-config string               browsers config (default \"./config/browsers.yaml\")\n      --browser-limit int                    active sessions max limit (default 10)\n      --namespace string                     kubernetes namespace (default \"selenosis\")\n      --service-name string                  kubernetes service name for browsers (default \"seleniferous\")\n      --browser-wait-timeout duration        time in seconds that a browser will be ready (default 30s)\n      --session-wait-timeout duration        time in seconds that a session will be ready (default 1m0s)\n      --session-idle-timeout duration        time in seconds that a session will idle (default 5m0s)\n      --session-retry-count int              session retry count (default 3)\n      --graceful-shutdown-timeout duration   time in seconds  gracefull shutdown timeout (default 30s)\n      --image-pull-secret-name string        secret name to private registry\n      --proxy-image string                   in case you use private registry replace with image from private registry (default \"alcounit/seleniferous:latest\")\n  -h, --help                                 help for selenosis\n\n```\n\n### Available endpoints\n| Protocol | Endpoint                    |\n|--------- |---------------------------- |\n| HTTP    | /wd/hub/session              |\n| HTTP    | /wd/hub/session/{sessionId}/ |\n| HTTP    | /wd/hub/status               |\n| WS      | /vnc/{sessionId}             |\n| WS/HTTP | /devtools/{sessionId}        |\n| HTTP    | /download/{sessionId}        |\n| HTTP    | /clipboard/{sessionId}       |\n| HTTP    | /status                      |\n| HTTP    | /healthz                     |\n\u003cbr/\u003e\n\n## Features\n### Scalability\nBy default selenosis starts with 2 replica sets. To change it, edit selenosis deployment file: \u003cb\u003e[03-selenosis.yaml](https://github.com/alcounit/selenosis-deploy/blob/main/03-selenosis.yaml)\u003c/b\u003e\n``` yaml\n\napiVersion: apps/v1beta1\nkind: Deployment\nmetadata:\n  name: selenosis\n  namespace: selenosis\nspec:\n  replicas: 2\n  selector:\n...\n```\n\u003cbr/\u003e\nby using kubectl\n\n```bash\nkubectl scale deployment selenosis -n selenosis --replicas=3\n```\n\n### Stateless\nWhen a new session request is received, selenosis creates a pod with 2 containers, one is a browser and the second is a lightweight sidecar called [seleniferous](https://github.com/alcounit/seleniferous). \nSeleniferous proxies all requests to the browser and replaces original sessionId returned by the browser with pod hostname. All other requests received by selenosis just proxied to the existing pod by using sessionId and [headless service](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/) as a hostname.\n\n### Hot config reload\nSelenosis supports hot config reload, to do so update you configMap\n```bash\nkubectl edit configmap -n selenosis selenosis-config -o yaml\n```\n\n### UI for debug\nSelenosis itself doesn't have ui. If you need such functionality you can use [selenoid-ui](https://github.com/aerokube/selenoid-ui) with special [adapter container](https://github.com/alcounit/adaptee). \nDeployment steps and minifests you can find in [selenosis-deploy](https://github.com/alcounit/selenosis-deploy) repository.\n\n\n## Configuration\nSelenosis can run any docker image with browser but best work with images debeloped by Aerokube:\n\u003cbr\u003e\n* [Android](https://aerokube.com/images/latest/#_android)\n* [Chrome](https://aerokube.com/images/latest/#_chrome)\n* [Firefox](https://aerokube.com/images/latest/#_firefox)\n* [Microsoft Edge](https://aerokube.com/images/latest/#_microsoft_edge)\n* [Opera](https://aerokube.com/images/latest/#_opera)\n\n### Basic config\nTo start browsers in kubernetes cluster you will need config, config can be JSON or YAML file.\u003cbr/\u003e\nBrowser name and browser version shoud be passed via selenium desired capabilities.\u003cbr/\u003e\nBasic configuration is be like (all fields in this example are mandatory):\n\n```json\n{\n    \"chrome\": {\n        \"defaultVersion\": \"85.0\",\n        \"path\": \"/\",\n        \"versions\": {\n            \"85.0\": {\n                \"image\": \"selenoid/vnc:chrome_85.0\"\n            },\n            \"86.0\": {\n                \"image\": \"selenoid/vnc:chrome_86.0\"\n            }\n        }\n    },\n    \"firefox\": {\n        \"defaultVersion\": \"82.0\",\n        \"path\": \"/wd/hub\",\n        \"versions\": {\n            \"81.0\": {\n                \"image\": \"selenoid/vnc:firefox_81.0\"\n            },\n            \"82.0\": {\n                \"image\": \"selenoid/vnc:firefox_82.0\"\n            }\n        }\n    },\n\n    \"opera\" : {\n        \"defaultVersion\": \"70.0\",\n        \"path\": \"/\",\n        \"versions\": {\n            \"70.0\": {\n                \"image\": \"selenoid/vnc:opera_70.0\"\n            },\n            \"71.0\": {\n                \"image\": \"selenoid/vnc:opera_71.0\"\n            }\n        }\n    }\n}\n```\n``` yaml\n---\nchrome:\n  defaultVersion: \"85.0\"\n  path: \"/\"\n  versions:\n    '85.0':\n      image: selenoid/vnc:chrome_85.0\n    '86.0':\n      image: selenoid/vnc:chrome_86.0\nfirefox:\n  defaultVersion: \"82.0\"\n  path: \"/wd/hub\"\n  versions:\n    '81.0':\n      image: selenoid/vnc:firefox_81.0\n    '82.0':\n      image: selenoid/vnc:firefox_82.0\nopera:\n  defaultVersion: \"70.0\"\n  path: \"/\"\n  versions:\n    '70.0':\n      image: selenoid/vnc:opera_70.0\n    '71.0':\n      image: selenoid/vnc:opera_71.0\n```\n\nEach browser type can have default spec/meta sections, same is applied to individual browser versions. Some properties like annotations and labels will be merged to specific browser version, others like resources stay unchanged(can't be overriden). Specific browser version properties have a higher priority on merge.\n### Managing Resources\n[CPU and Memory limits](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/) can be set globally to specific browser type or individually to specific browser version. \u003c/br\u003e\nIn the example below chrome browser v86.0 pod will be launched with resource limits that are set globally and browser v85.0 pod will be launched with individual resource limits that are set in browser version spec section.\n\n``` json\n{\n  \"chrome\": {\n    \"defaultVersion\": \"85.0\",\n    \"path\": \"/\",\n    \"spec\": {\n      \"resources\": {\n        \"requests\": {\n          \"memory\": \"500Mi\",\n          \"cpu\": \"0.5\"\n        },\n        \"limits\": {\n          \"memory\": \"1Gi\",\n          \"cpu\": \"1\"\n        }\n      }\n    },\n    \"versions\": {\n      \"85.0\": {\n        \"image\": \"selenoid/vnc:chrome_85.0\",\n        \"spec\": {\n          \"resources\": {\n            \"requests\": {\n              \"memory\": \"750Mi\",\n              \"cpu\": \"0.5\"\n            },\n            \"limits\": {\n              \"memory\": \"1.5Gi\",\n              \"cpu\": \"1\"\n            }\n          }\n        }\n      },\n      \"86.0\": {\n        \"image\": \"selenoid/vnc:chrome_86.0\"\n      }\n    }\n  }\n}\n```\n``` yaml\n---\nchrome:\n  defaultVersion: \"85.0\"\n  path: \"/\"\n  spec:\n    resources:\n      requests:\n        memory: 500Mi\n        cpu: '0.5'\n      limits:\n        memory: 1Gi\n        cpu: '1'\n  versions:\n    '85.0':\n      image: selenoid/vnc:chrome_85.0\n      spec:\n        resources:\n          requests:\n            memory: 750Mi\n            cpu: '0.5'\n          limits:\n            memory: 1.5Gi\n            cpu: '1'\n    '86.0':\n      image: selenoid/vnc:chrome_86.0\n\n```\n\n### Labels and annotations\n[Labels](https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/) and [annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) are supported by config and can be added globally or individually depends on your requirements.\n``` json\n{\n  \"chrome\": {\n    \"defaultVersion\": \"85.0\",\n    \"path\": \"/\",\n    \"meta\": {\n      \"labels\": {\n        \"environment\": \"aqa\",\n        \"app\": \"myCoolApp\"\n      },\n      \"annotations\": {\n        \"build\": \"dev-v1.11.2\",\n        \"builder\": \"jenkins\"\n      }\n    },\n    \"versions\": {\n      \"85.0\": {\n        \"image\": \"selenoid/vnc:chrome_85.0\"\n      },\n      \"86.0\": {\n        \"image\": \"selenoid/vnc:chrome_86.0\",\n        \"meta\": {\n          \"labels\": {\n            \"environment\": \"dev\",\n            \"app\": \"veryCoolApp\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n``` yaml\n---\nchrome:\n  defaultVersion: \"85.0\"\n  path: \"/\"\n  meta:\n    labels:\n      environment: aqa\n      app: myCoolApp\n    annotations:\n      build: dev-v1.11.2\n      builder: jenkins\n  versions:\n    '85.0':\n      image: selenoid/vnc:chrome_85.0\n    '86.0':\n      image: selenoid/vnc:chrome_86.0\n      meta:\n        labels:\n          environment: dev\n          app: veryCoolApp\n\n```\n\n### Adding Host Aliases\nYou can add the [host name and aliases](https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/) to /etc/hosts file by using hostAliases property.\n``` json\n{\n  \"chrome\": {\n    \"defaultVersion\": \"85.0\",\n    \"path\": \"/\",\n    \"spec\": {\n      \"hostAliases\": [\n        {\n          \"ip\": \"127.0.0.1\",\n          \"hostnames\": [\n            \"foo.local\",\n            \"bar.local\"\n          ]\n        }\n      ]\n    },\n    \"versions\": {\n      \"85.0\": {\n        \"image\": \"selenoid/vnc:chrome_85.0\",\n      \"spec\": {\n        \"hostAliases\": [\n          {\n            \"ip\": \"10.1.2.3\",\n            \"hostnames\": [\n            \"foo.remote\",\n            \"bar.remote\"\n            ]\n          }\n        ]\n      },\n      },\n      \"86.0\": {\n        \"image\": \"selenoid/vnc:chrome_86.0\"\n      }\n    }\n  }\n}\n```\n``` yaml\n---\nchrome:\n  defaultVersion: \"85.0\"\n  path: \"/\"\n  spec:\n    hostAliases:\n    - ip: 127.0.0.1\n      hostnames:\n      - foo.local\n      - bar.local\n  versions:\n    '85.0':\n      image: selenoid/vnc:chrome_85.0\n    spec:\n      - ip: 10.1.2.3\n        hostnames:\n        - foo.remote\n        - bar.remote\n    '86.0':\n      image: selenoid/vnc:chrome_86.0\n```\n\n### Environment Variables\nYou can set [environment variables](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/) for browser pods. To set environment variables, include the env in the configuration file.\n``` json\n{\n  \"chrome\": {\n    \"defaultVersion\": \"85.0\",\n    \"path\": \"/\",\n    \"spec\": {\n      \"env\": [\n        {\n          \"name\": \"TZ\",\n          \"value\": \"Europe/Kiev\"\n        },\n        {\n          \"name\": \"SCREEN_RESOLUTION\",\n          \"value\": \"1920x1080x24\"\n        },\n        {\n          \"name\": \"ENABLE_VNC\",\n          \"value\": \"true\"\n        }\n      ]\n    },\n    \"versions\": {\n      \"85.0\": {\n        \"image\": \"selenoid/vnc:chrome_85.0\",\n        \"spec\": {\n          \"env\": [\n            {\n              \"name\": \"SCREEN_RESOLUTION\",\n              \"value\": \"1024x768x24\"\n            }\n          ]\n        }\n      },\n      \"86.0\": {\n        \"image\": \"selenoid/vnc:chrome_86.0\"\n      }\n    }\n  }\n}\n```\n\n``` yaml\n---\nchrome:\n  defaultVersion: \"85.0\"\n  path: \"/\"\n  spec:\n    env:\n    - name: TZ\n      value: Europe/Kiev\n    - name: SCREEN_RESOLUTION\n      value: 1920x1080x24\n    - name: ENABLE_VNC\n      value: 'true'\n  versions:\n    '85.0':\n      image: selenoid/vnc:chrome_85.0\n    spec:\n      env:\n      - name: SCREEN_RESOLUTION\n        value: 1024x768x24\n    '86.0':\n      image: selenoid/vnc:chrome_86.0\n```\n\n### Mounting volumes to a browser pod\nIf you need a [directory](https://kubernetes.io/docs/concepts/storage/volumes/) with a data that is accessible to the browser use volume and volumeMount properties in your config\n``` json\n{\n  \"chrome\": {\n    \"defaultVersion\": \"85.0\",\n    \"path\": \"/\",\n    \"volumes\": [\n      {\n        \"name\": \"simple-vol\",\n        \"emptyDir\": {}\n      }\n    ],\n    \"versions\": {\n      \"85.0\": {\n        \"image\": \"selenoid/vnc:chrome_85.0\",\n        \"spec\": {\n          \"volumeMounts\": [\n            {\n              \"name\": \"simple-vol\",\n              \"mountPath\": \"/var/simple\"\n            }\n          ]\n        }\n      },\n      \"86.0\": {\n        \"image\": \"selenoid/vnc:chrome_86.0\"\n      }\n    }\n  }\n}\n```\n\n``` yaml\n---\nchrome:\n  defaultVersion: '85.0'\n  path: /\n  volumes:\n    - name: simple-vol\n      emptyDir: {}\n  versions:\n    '85.0':\n      image: 'selenoid/vnc:chrome_85.0'\n    spec:\n      volumeMounts:\n        - name: simple-vol\n          mountPath: /var/simple\n    '86.0':\n      image: 'selenoid/vnc:chrome_86.0'\n```\n\n\n\n### Assigning Browsers to Nodes\nYou can constrain a browser pods to only be able [to run on particular node(s)](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/), or to prefer to run on particular nodes. To do so add a nodeSelector property to your configuration.\n``` json\n{\n  \"chrome\": {\n    \"defaultVersion\": \"85.0\",\n    \"path\": \"/\",\n    \"spec\": {\n      \"nodeSelector\": {\n        \"disktype\": \"ssd\"\n      }\n    },\n    \"versions\": {\n      \"85.0\": {\n        \"image\": \"selenoid/vnc:chrome_85.0\",\n        \"spec\": {\n          \"nodeSelector\": {\n            \"nodeType\": \"N2D\"\n          }\n        }\n      },\n      \"86.0\": {\n        \"image\": \"selenoid/vnc:chrome_86.0\"\n      }\n    }\n  }\n}\n```\n\n``` yaml\n---\nchrome:\n  defaultVersion: \"85.0\"\n  path: \"/\"\n  spec:\n    nodeSelector:\n      disktype: N2D\n  versions:\n    '85.0':\n      image: selenoid/vnc:chrome_85.0\n    spec:\n      nodeSelector:\n        nodeType: ssd\n    '86.0':\n      image: selenoid/vnc:chrome_86.0\n```\n\n### Node affinity\nTo attract browser pods to [set of nodes](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) use tolerations property\n``` json\n{\n  \"chrome\": {\n    \"defaultVersion\": \"85.0\",\n    \"path\": \"/\",\n    \"spec\": {\n      \"tolerations\": [\n        {\n          \"key\": \"example-key\",\n          \"operator\": \"Exists\",\n          \"effect\": \"NoSchedule\"\n        }\n      ]\n    },\n    \"versions\": {\n      \"85.0\": {\n        \"image\": \"selenoid/vnc:chrome_85.0\"\n      },\n      \"spec\": {\n        \"tolerations\": [\n          {\n            \"key\": \"key1\",\n            \"operator\": \"Equal\",\n            \"value\": \"value1\",\n            \"effect\": \"NoSchedule\"\n          }\n        ]\n      },\n      \"86.0\": {\n        \"image\": \"selenoid/vnc:chrome_86.0\"\n      }\n    }\n  }\n}\n```\n\n``` yaml\n---\nchrome:\n  defaultVersion: \"85.0\"\n  path: \"/\"\n  spec:\n    tolerations:\n    - key: \"example-key\"\n      operator: \"Exists\"\n      effect: \"NoSchedule\"\n  versions:\n    '85.0':\n      image: selenoid/vnc:chrome_85.0\n    spec:\n      tolerations:\n      - key: \"key1\"\n        operator: \"Equal\"\n        value: \"value1\"\n        effect: \"NoSchedule\"\n    '86.0':\n      image: selenoid/vnc:chrome_86.0\n```\n\n### Custom UID and GID for browser pod\nBrowser pod can be run with custom UID and GID. To do so set runAs property for specific browser globally or per each browser version.\n``` json\n{\n  \"chrome\": {\n    \"defaultVersion\": \"85.0\",\n    \"path\": \"/\",\n    \"runAs\": {\n      \"uid\": 1000,\n      \"gid\": 2000\n    },\n    \"versions\": {\n      \"85.0\": {\n        \"image\": \"selenoid/vnc:chrome_85.0\",\n        \"runAs\": {\n          \"uid\": 1001,\n          \"gid\": 2002\n        }\n      },\n      \"86.0\": {\n        \"image\": \"selenoid/vnc:chrome_86.0\"\n      }\n    }\n  }\n}\n```\n\n``` yaml\n---\nchrome:\n  defaultVersion: '85.0'\n  path: \"/\"\n  runAs:\n    uid: 1000\n    gid: 2000\n  versions:\n    '85.0':\n      image: selenoid/vnc:chrome_85.0\n      runAs:\n        uid: 1001\n        gid: 2002\n    '86.0':\n      image: selenoid/vnc:chrome_86.0\n```\n\n### Custom Kernel Capabilities\nIn some cases you may need to run browser container with custom Linux capabilities. To do so set kernelCaps property for specific browser globally or per each browser version.\n``` json\n{\n  \"chrome\": {\n    \"defaultVersion\": \"85.0\",\n    \"path\": \"/\",\n    \"kernelCaps\": [\"SYS_ADMIN\"],\n    \"versions\": {\n      \"85.0\": {\n        \"image\": \"selenoid/vnc:chrome_85.0\",\n        \"kernelCaps\": [\"SYS_ADMIN\"]\n      },\n      \"86.0\": {\n        \"image\": \"selenoid/vnc:chrome_86.0\"\n      }\n    }\n  }\n}\n```\n\n``` yaml\n---\nchrome:\n  defaultVersion: '85.0'\n  path: \"/\"\n  kernelCaps:\n  - SYS_ADMIN\n  versions:\n    '85.0':\n      image: selenoid/vnc:chrome_85.0\n      kernelCaps:\n      - SYS_ADMIN\n    '86.0':\n      image: selenoid/vnc:chrome_86.0\n```\n\n## Deployment\nFiles and steps required for selenosis deployment available in [selenosis-deploy](https://github.com/alcounit/selenosis-deploy) repository\n\n ## Run yout tests\n ``` java\n DesiredCapabilities capabilities = new DesiredCapabilities();\ncapabilities.setBrowserName(\"chrome\");\ncapabilities.setVersion(\"85.0\");\n\nRemoteWebDriver driver = new RemoteWebDriver(\n    URI.create(\"http://\u003cloadBalancerIP|nodeIP\u003e:\u003cport\u003e/wd/hub\").toURL(), \n    capabilities\n);\n ```\n  ``` python\nfrom selenium import webdriver\n        \ncapabilities = {\n    \"browserName\": \"chrome\",\n    \"version\": \"85.0\",\n}\n\ndriver = webdriver.Remote(\n    command_executor=\"http://\u003cloadBalancerIP|nodeIP\u003e:\u003cport\u003e/wd/hub\",\n    desired_capabilities=capabilities)\n ```\n\nList of capabilities required for selenoid-ui compatibility:\n| key              | type    | description              |\n|----------------- |-------- |------------------------- |\n| enableVNC        | boolean | enables VNC support      |\n| name             | string  | name of test             |\n| screenResolution | string  | custom screen resolution |\n\n\u003c/br\u003e\n Note: you can omit browser version in your desired capabilities, make sure you set defaultVersion property in the config file.\n\u003c/br\u003e\u003c/br\u003e\n\n## Known issues\n### Browser pods are deleted right after start\nDepends on you cluster version in some cases you can face with issue when some browser pods are deleted right after their start and selenosis log will contains lines like this:\n```log\ntime=\"2020-12-21T10:28:20Z\" level=error msg=\"session failed: Post \\\"http://selenoid-vnc-chrome-87-0-af3177a0-5052-45be-b4e4-9462146e4633.seleniferous:4445/wd/hub/session\\\": dial tcp: lookup selenoid-vnc-chrome-87-0-af3177a0-5052-45be-b4e4-9462146e4633.seleniferous on 10.96.0.10:53: no such host\" request=\"POST /wd/hub/session\" request_id=fa150040-86c1-4224-9e5c-21416b1d9f5c time_elapsed=5.73s\n```\nTo fix this issue do the following:\n```bash\nkubectl edit cm coredns -n kube-system\n```\nadd following record to your coredns config\n```config\n    selenosis.svc.cluster.local:53 {\n        errors\n        kubernetes cluster.local {\n          namespaces selenosis\n        }\n    }\n```\nthis option will turn off dns caching for selenosis namespace, resulting config update should be as following:\n```yaml\napiVersion: v1\ndata:\n  Corefile: |\n    selenosis.svc.cluster.local:53 {\n        errors\n        kubernetes cluster.local {\n          namespaces selenosis\n        }\n    }\n    .:53 {\n        errors\n        health\n        ready\n        kubernetes cluster.local in-addr.arpa ip6.arpa {\n          pods insecure\n          fallthrough in-addr.arpa ip6.arpa\n        }\n        prometheus :9153\n        forward . /etc/resolv.conf\n        cache 30\n        loop\n        reload\n        loadbalance\n        import custom/*.override\n    }\n    import custom/*.server\nkind: ConfigMap\n...\n```\nCurrently this project is under development and can be unstable, in case of any bugs or ideas please report\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falcounit%2Fselenosis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falcounit%2Fselenosis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falcounit%2Fselenosis/lists"}