【问题标题】:WebDriverError: no such session error using ChromeDriver Chrome through Selenium and JasmineWebDriverError:通过 Selenium 和 Jasmine 使用 ChromeDriver Chrome 时没有此类会话错误
【发布时间】:2016-10-30 03:50:17
【问题描述】:

我正在尝试对我的网页进行自动化测试,并且我将 Jasmine 与 selenium 结合使用。

在 chrome 上进行测试(使用 chromedriver)时,我意外地得到了以下错误。它经常发生,以至于当我运行一个测试套件时它几乎没有完成。

我找到了这个错误的证据,但找不到可靠的答案:https://bugs.chromium.org/p/chromedriver/issues/detail?id=732(当然这是针对铬的,我正在使用铬)

WebDriverError: no such session
  (Driver info: chromedriver=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),platform=Mac OS X 10.11.5 x86_64)
    at WebDriverError (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/error.js:27:10)
    at Object.checkLegacyResponse (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/error.js:639:15)
    at parseHttpResponse (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/http/index.js:538:13)
    at /Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/http/index.js:472:11
    at ManagedPromise.invokeCallback_ (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:1379:14)
    at TaskQueue.execute_ (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:2913:14)
    at TaskQueue.executeNext_ (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:2896:21)
    at /Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:2820:25
    at /Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:639:7
    at process._tickCallback (node.js:369:9)
From: Task: WebElement.isDisplayed()
    at Driver.schedule (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/webdriver.js:377:17)
    at WebElement.schedule_ (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/webdriver.js:1744:25)
    at WebElement.isDisplayed (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/webdriver.js:2110:17)
    at driver.findElements.then.error (/Users/XXXXXXX/Documents/sweetmeeting/Test/front_end_testing/spec/dashboard_tester.js:251:34)
    at ManagedPromise.invokeCallback_ (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:1379:14)
    at TaskQueue.execute_ (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:2913:14)
    at TaskQueue.executeNext_ (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:2896:21)
    at /Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:2775:27
    at /Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:639:7
    at process._tickCallback (node.js:369:9)

【问题讨论】:

标签: selenium google-chrome selenium-webdriver jasmine selenium-chromedriver


【解决方案1】:

我们也一直在为这个问题苦苦挣扎,最近解决了这个问题,所以我想我会在这里发帖,以防它帮助其他人。

对我们来说,这与记忆有关。我们在 docker 容器中运行测试,docker 默认的 dev/shm 大小为 64mb。增加它为我们解决了“没有这样的会话”问题。

我们使用 docker compose,所以只需将 shm_size: 256M 添加到 docker-compose.yml 文件中。

【讨论】:

  • 有同样的问题,增加 shm 甚至 2GB!没有帮助我,似乎错误不是由 shm 大小引起的
  • 你能解释一下它与内存限制的关系吗?会不会是驱动因为内存不足而崩溃了,然后 Selenium 绑定无法与之通信?
【解决方案2】:

我最近也遇到了这个异常。它最初似乎也是不确定的,但经过彻底调查后,我意识到如果您调用 ChromeDriver.Close() 然后尝试 FindElement,它会确定地发生。

在我的例子中,ChromeDriver.Close() 是在 previous 测试的异常处理程序中调用的,这是由于时间问题而发生的。这仅影响了 next 测试,因此增加了这个问题不稳定的感觉。但正如我所说,我的调查显示它是确定性的。

话虽如此,这是我对该错误的体验。可能是你的情况不同...

【讨论】:

    【解决方案3】:

    有时我们只是期望任何问题都非常复杂,并且在问题可能如此明显的情况下寻找其原因太深了。

    当我在我的logout() 方法中明确调用browser.close() 作为异常处理程序时,我看到了这个问题。它终止了会话,并且以下所有量角器测试都抛出了这个错误。

    一旦我删除了browser.close() 并抛出了一个错误,问题就解决了。

    【讨论】:

      【解决方案4】:

      此错误消息...

      WebDriverError: no such session
        (Driver info: chromedriver=a.b.c (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),platform=Mac OS X 10.11.5 x86_64)
      

      ...暗示 ChromeDriver 无法与现有的 Browsing ContextChrome 浏览器 会话进行通信。


      我们在Issue 732: No such session error - inconsistent problem which appears when running tests for a prolonged period 的讨论中讨论并分析了这个问题。此错误通常在长时间执行 Test Suite 后出现,如下所示:

      [0127/105308:ERROR:nacl_helper_linux.cc(289)] NaCl helper process running without a sandbox!
      Most likely you need to configure your SUID sandbox correctly
      [489.849][INFO]: RESPONSE FindElements unknown error: session deleted because of page crash
      from tab crashed
        (Session info: chrome=p.q.r.s)
      [489.849][DEBUG]: Log type 'driver' lost 0 entries on destruction
      [489.849][DEBUG]: Log type 'browser' lost 9 entries on destruction
      

      这个错误在nacl_helper_linux.cc中定义如下:

      // If the Zygote has started handling requests, we should be sandboxed via
      // the setuid sandbox.
      if (!IsSandboxed()) {
        LOG(ERROR) << "NaCl helper process running without a sandbox!\n"
          << "Most likely you need to configure your SUID sandbox "
          << "correctly";
      

      正是FindElement(s) 方法由于沙盒 问题而FAILED,而Page Crashsession deletion 而发生


      解决方案

      此错误可能由于多种原因而发生,解决此错误的解决方案如下:

      • 使用参数--disable-impl-side-painting 启动Chrome 会话配置ChromeDriver
        • 此外,您还可以添加参数--enable-gpu-rasterization,它允许启发式方法确定何时应使用 Skia GPU 后端绘制图层图块。仅适用于 GPU 加速合成 + impl-side painting。
        • 作为一个选项,您还可以添加参数--force-gpu-rasterization,它始终使用 Skia GPU 后端来绘制图层图块。仅对 GPU 加速合成 + impl-side 绘画有效。覆盖 kEnableGpuRasterization 标志。
      • 当服务器无法识别唯一会话标识符时也会出现此错误。如果会话已被删除或会话 ID 在以下任一情况下无效,则会发生这种情况:

        • Explicit session deletion:显式调用quit() 方法时,WebDriver 会话被显式删除,如下所示:

          from selenium import webdriver
          from selenium.common.exceptions import InvalidSessionIdException
          
          driver = webdriver.Chrome(executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
          print("Current session is {}".format(driver.session_id))
          driver.quit()
          try:
              driver.get("https://www.google.com/")
          except Exception as e:
              print(e.message)
          
          #Console Output:
          Current session is a9272550-c4e5-450f-883d-553d337eed48
          No active session with ID a9272550-c4e5-450f-883d-553d337eed48
          
        • Implicit session deletion:当您关闭最后一个调用close() 方法的窗口或选项卡时,WebDriver 会话将被隐式删除,如下所示:

          driver = webdriver.Chrome(executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
          print("Current session is {}".format(driver.session_id))
          # closes current window/tab
          driver.close()
          try:
              driver.get("https://www.google.com/")
          except Exception as e:
              print(e.message)
          
          #Console Output:
          Current session is a9272550-c4e5-450f-883d-553d337eed48
          No active session with ID a9272550-c4e5-450f-883d-553d337eed48
          
      • 您可能还需要添加参数 --no-sandbox

      • 由于/dev/shm 太小,Chrome 似乎在某些页面上的 Docker 容器中经常崩溃。同样,您可能需要修复较小的 /dev/shm 大小。
      • 一个例子:

        sudo mount -t tmpfs -o rw,nosuid,nodev,noexec,relatime,size=512M tmpfs /dev/shm
        
      • 如果您使用-v /dev/shm:/dev/shm 选项共享它也可以使用主机 /dev/shm

      • 另一种方法是将chrome_options 添加为--disable-dev-shm-usage。这将强制 Chrome 使用 /tmp 目录。这可能会减慢执行速度,因为将使用磁盘而不是内存。

        chrome_options.add_argument('--disable-dev-shm-usage')        
        

      参考

      您可以在以下位置找到一些详细的讨论:

      【讨论】:

        猜你喜欢
        • 2017-08-27
        • 2020-05-16
        • 2019-08-07
        • 2022-01-24
        • 1970-01-01
        • 2019-08-12
        • 2020-09-24
        相关资源
        最近更新 更多