Chromdriver2.21.2失败"没有这样的会话"

时间:2016-06-28 01:29:31

标签: google-chrome selenium jasmine selenium-chromedriver

我试图对我的网页进行自动化测试,并且我正在使用Jasmine与硒一起使用。

在测试镀铬(使用镀铬液)时,我不可预测地得到下面的错误。它经常发生,当我运行一个测试套件时,它几乎没有完成。

我发现了这个错误的证据但是找不到可靠的答案: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)

4 个答案:

答案 0 :(得分:9)

我们也一直在努力解决这个问题很长一段时间,并且最近已经解决了这个问题,所以我想在这里发布它可以帮助其他人。

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

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

答案 1 :(得分:6)

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

就我而言,ChromeDriver.Close()是在之前的测试的异常处理程序中调用的,该测试由于计时问题而发生。这只会影响 next 测试,所以它增加了这个问题的缺点。但正如我所说,我的调查显示它是确定性的。

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

答案 2 :(得分:0)

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

当我在browser.close()方法中显式调用logout()作为异常处理程序时,我看到了这个问题。它终止了会话,并且随后的所有量角器测试都引发了此错误。

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

答案 3 :(得分:0)

此错误消息...

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

...表示 ChromeDriver 无法与现有的浏览上下文 Chrome浏览器会话进行通信。


我们已经在讨论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";

由于{em>沙盒问题,精确地FindElement(s)方法已失败,而由于Page Crash

而发生了session deletion

解决方案

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

  • 使用参数--disable-impl-side-painting启动配置 ChromeDriver Chrome 会话
    • 此外,您还可以添加参数--enable-gpu-rasterization,该参数允许试探法确定何时应使用Skia GPU后端绘制图层图块。仅在GPU加速合成+侧面绘画时有效。
    • 作为一种选择,您还可以添加参数--force-gpu-rasterization,该参数始终使用Skia GPU后端绘制图层图块。仅在GPU加速合成+侧面绘画时有效。覆盖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选项共享 host /dev/shm

  • ,它也将起作用
  • 使其生效的另一种方法是将chrome_options添加为 --disable-dev-shm-usage 。这将强制Chrome使用/tmp目录。尽管这会减慢执行速度,因为将使用磁盘而不是内存。

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

参考

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