Selenium在ChromeDriver中没有此类会话错误

时间:2017-04-02 07:40:26

标签: selenium selenium-webdriver

当我从Jenkins运行脚本时,我经常遇到这样的会话错误。它的原因是什么?是否有任何连接失败或是由于其他原因(我运行了大约26个脚本,并且至少有一个脚本没有这样的会话错误)

脚本是不同的脚本,并且不会再为同一个脚本重复此类会话错误

5 个答案:

答案 0 :(得分:9)

我有时会遇到这种情况。我使用ChromeDriver和Laravel Dusk,而不是Selenium。但是,我认为原因在于ChromeDriver,而不是Selenium

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

当我的C盘空间不足时,ChromeDriver将无法启动,然后向我返回错误消息" Facebook \ WebDriver \ Exception \ NoSuchDriverException:没有此类会话"。

解决方案:

  1. 转到临时文件夹,删除所有可以清理C空间的ChromeDriver缓存文件夹。
  2. 创建可删除/清理ChromeDriver缓存文件夹的脚本。
  3. <强> - UPDATE -

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

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

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

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

    <强>溶液

    1. 在jenkins中安装构建阻止程序
    2. 在构建阻止程序中设置项目,目标项目需要等待它直到完成。
    3. 我的案例是使用没有硒的Laravel Dusk。我不确定当测试通过selenium服务器时它是否会有所不同

答案 1 :(得分:3)

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

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 无法与现有的浏览上下文 Chrome浏览器会话进行通信。


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

由于{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')        
    

从标签页崩溃

标签中的

崩溃了是与 Chromium小组进行的WIP( Work In Progress ),现在已经与Linux相关尝试始终将/ dev / shm用于不可执行的内存。这里是参考:


参考

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

答案 2 :(得分:0)

我使用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中进行的初始登录持续通过我运行的所有测试,因此我可以编写测试方法,以便像我以前那样定位单个功能。

答案 3 :(得分:0)

在我的情况下,是在错误的位置调用了driver.quit()。

答案 4 :(得分:0)

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

解决方案:删除一个。