硒的解释 "Session timed out or not found"

Explanation of Selenium "Session timed out or not found"

这个“会话超时或未找到”错误一直是我存在的诅咒。通常它最终会成为其他问题的征兆,但我目前在八个不同的地方使用 Selenium 和 Chromium(通过 Selenoid),它在其中的七个地方完美地工作并且在每个 [=18] =],在另一个看似没有理由的情况下:

...
  File "/opt/obo/virtualenv/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 333, in get
    self.execute(Command.GET, {'url': url})
  File "/opt/obo/virtualenv/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/opt/obo/virtualenv/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Session timed out or not found

我还没有看到它与超时有任何实际关系,但我仍然将我能找到的每次超时都增加了一倍或三倍,而且它仍在发生。我将从 Javascript 返回的数据量减少到 Python,并且它仍在发生。然后我计算发生这种情况需要多长时间,何时发生,看起来像 (0) 秒。似乎没有关于此错误的文档,一般参考也很少。所以,在我必须自己拆开它之前,也许有人有一些建议或者至少可以描述导致这种情况的原因?

这是 Selenium Grid 实例不再保持会话的信号。

请在没有 Selenoid 的情况下尝试 运行 测试,使用本地网格查看错误是否仍然存在

Selenoid 可能存在的问题:

  1. 默认会话超时(如果我没记错的话是 60 秒)发生在连续调用该会话之间的时间超过超时设置时。解决方案是审查测试或延长超时。

  2. Selenoid 主机负载不当(CPU 或内存太少或实例太多)导致争夺资源,因此 Selenoid 实例可能表现不稳定。解决方案:修复 Selenoid 设置

也可能是因为某些页面元素(脚本、图像等)缺少防火墙规则。由于防火墙的原因,这些请求需要无限长的时间才能完成,因此您的页面加载速度太慢,最终会发生超时。

这个问题似乎每次在我 运行 通过另一个 window 无限滚动后都会发生。它很少在其他时间以看似 运行dom 的间隔发生。

可能是某些网站做了一些让 window 处于不良状态的事情。可能是我没有做一些我不知道在进行无限滚动后需要做的事情。

无论哪种方式,我都添加了一个应急措施来检测特定的异常和消息并关闭那个 window 然后在下一个周期打开一个新的。这完全消除了这个 error/symptom 并且表面上阻止了它再次出现。

我也遇到过类似的问题。根据我的研究,我发现如下:

根据您的代码尝试保持 Selenoid 会话 less than 100%。任何暂停的会话都可能遇到此问题。

例如:

您可以运行 10 个并行线程(默认配置),尝试一次只启动 8 个线程。这将帮助您避免不必要的失败。

我在 python 中使用 pytest-parallel link 进行了如下处理:

pytest --workers 8 --tests-per-worker 1

这将一次启动 8 个会话,每个工作人员进行 1 个测试,并且您的 selenoid 一次使用率为 80%,即 less than 100 %