【问题标题】:WebDriverError: no such session error using ChromeDriver Chrome through Jenkins and SeleniumWebDriverError:通过 Jenkins 和 Selenium 使用 ChromeDriver Chrome 时没有此类会话错误
【发布时间】:2017-08-27 05:03:32
【问题描述】:

当我从 Jenkins 运行脚本时,我通常不会收到此类会话错误。它的原因是什么?是否有任何连接失败或者是由于其他原因(我正在运行大约 26 个脚本,其中至少一个脚本没有此类会话错误)

这些脚本是不同的脚本,没有这样的会话错误不会再次为相同的脚本重复

【问题讨论】:

  • 您能用更多信息完成您的问题吗?您使用的是什么浏览器和 Selenium 版本?您是否正在与 Selenium Grid 竞争?如果有,你在上面设置了多少个节点?
  • 我正在使用最新的 selenium 版本的 Chrome 和 ChromeDriver,但问题仍然存在
  • 你可以查看at Chromium关于它的长时间讨论。我仍然为此感到头疼。我正在将 Selenium3 与 Docker 映像一起使用,但无法获得稳定的行为。
  • 我确实检查过,但我认为这不是内存问题,因为我在 16GB 机器上运行这些文件
  • 正如我之前所说,您的问题细节很差。如果使用 Docker 运行 Selenium Grid(您刚刚说您是从 Jenkins 运行,但您的问题或 cmets 中未提供此信息),如 Selenium Github page 所述,您应该使用 -v /dev/shm:/dev/shm 运行容器(或者应该在设置一些大小的docker-compose 文件中执行此操作)。无论如何,这仍然是 Chromium 中所说的间歇​​性错误(之前的评论)。

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


【解决方案1】:

我有时会遇到这种情况。我将 ChromeDriver 与 Laravel Dusk 一起使用,而不是 Selenium。但是,我相信原因在于 ChromeDriver,而不是 Selenium

ChromeDriver 会在文件夹:C:\Users\(yourAccountName)\AppData\Local\Temp 中创建一些缓存文件。在此文件夹中,您将看到许多类似于scoped_dir1234_5678 的缓存文件夹。每个文件夹占用大约 10mb。如果 Jenkins 经常运行 ChromeDriver,ChromeDriver 可能会过度填充临时文件夹中的缓存文件。你应该在你的 C 盘上考虑 30-50GB 的缓存文件,并充分利用你的 C 驱动。

当我的C盘空间不足时,ChromeDriver将无法启动,然后返回给我错误信息“Facebook\WebDriver\Exception\NoSuchDriverException: no such session”。

解决办法:

  1. 进入temp文件夹,删除所有ChromeDriver缓存文件夹即可清理C空间。
  2. 创建可以删除/清理ChromeDriver缓存文件夹的脚本。

--更新--

找出导致问题的另一种情况。

如果您在同一操作系统上同时运行相同的脚本以在两个不同的实例中启动 ChromeDriver,则当一个实例完成并关闭 chromedriver 时,另一个 chrome 浏览器实例也可能会关闭。

比如你打开两个控制台执行chromeDriver脚本,或者你的Jenkins项目同时启动。

我相信即使您运行不同的脚本但同时需要 chromeDriver,由于 chrome 浏览器实例关闭,其中一个脚本将“没有这样的会话”。

解决方案:

  1. 在 jenkins 中安装构建阻止程序
  2. 在构建拦截器中设置项目,目标项目需要等待它完成。

我的案例是使用没有硒的 Laravel Dusk。我不确定通过 selenium 服务器进行测试时是否会有所不同

【讨论】:

  • 你是对的!在运行每个测试用例之前不要关闭 chrome 实例。只需在 after 块中关闭它,以便每个测试用例都使用相同的 chrome 实例而不会出现任何错误。
  • 与此类似的东西也适用于我,但在 Mac 上,您需要使用 open $TMPDIR (apple.stackexchange.com/questions/94964/…) 找到临时文件夹。然后我发现 VS Code 制作了一个巨大的 typescript 文件夹。一旦我把它清理干净,我的 Spectron 测试就会再次运行。
【解决方案2】:

平台上使用 时出现此错误消息...

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

或者

平台上的此错误消息...

WebDriverError: no such session
    (Driver info: chromedriver=p.q.r,platform=Linux 3.2.0-4-amd64 x86_64) (Selenium::WebDriver::Error::NoSuchDriverError)

或者

平台上的此错误消息...

WebDriverError: no such session 
(Driver info: chromedriver=x.y.z (52179c1b310fec1797c81ea9a20326839860b7d3),platform=Windows NT 6.1 SP1 x86_64) (NoSuchDriver)

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


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

[489.798][DEBUG]: DEVTOOLS EVENT Inspector.targetCrashed {

}
[489.798][INFO]: Waiting for pending navigations...
[489.798][INFO]: Done waiting for pending navigations
[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 Crash 发生是由于session 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')        
    

从标签崩溃

from tab crashedChromium 团队 的 WIP(Work In Progress) 已经有一段时间了,这与 Linux 有关试图始终将 /dev/shm 用于不可执行的内存。以下是参考:


参考

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

【讨论】:

    【解决方案3】:

    在我的例子中是 driver.quit() 在错误的位置被调用。

    【讨论】:

      【解决方案4】:

      我在使用chromediver_binaryselenium 的python selenium 端到端测试中遇到了这个问题。该错误是由于尝试多次运行driver.close() 引起的。

      我意识到我的方法被多次调用,而我真正想要的是setUpClasstearDownClass。我将提出我的最终解决方案,因为它避免了这个错误并且很好地满足了我的目的。

      class SeleniumTestCase(TestCase):
          """
          A wrapper of TestCase which will launch a selenium server, login, and add
          cookies in the setUp phase of each test.
          """
          @classmethod
          def setUpClass(cls, *args, **kwargs):
              cls.driver = webdriver.Chrome(port=4444)
              cls.driver.implicitly_wait(15)
              cls.driver.maximize_window()
              cls.driver.get(HOST)
              # page obect I wrote which accepts the driver and can login to my app
              cls.login = LoginPage(cls.driver)
              cls.login.log_into_app()
      
          @classmethod
          def tearDownClass(cls):
              cls.driver.close()
      

      这允许我编写如下所示的测试:

      class TestNavigation(SeleniumTestCase):
      
          def setUp(self):
              # Initialize page objects for each test
              self.module1 = Module1Page(self.driver)
              self.module2 = Module2Page(self.driver)
              # launch page
              self.driver.get(HOST)
      
          def test_module1(self):
              self.module1.nav_link.click()
              self.assertEqual(self.module1.title.text, 'Module One')
      
          def test_module2(self):
              self.module2.nav_link.click()
              self.assertEqual(self.module2.title.text, 'Module Two')
      

      我在SeleniumTestCase 中进行的初始登录在我运行的所有测试中都持续存在,因此我可以编写测试方法df 以像我习惯的那样针对单个功能。

      【讨论】:

        【解决方案5】:

        nosuchsessionException 检查您的代码可能是您调用了Driver.close();Driver.quit(); 两次或两者。

        解决方案:删除一个。

        【讨论】:

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