【问题标题】:unknown error: session deleted because of page crash from unknown error: cannot determine loading status from tab crashed with ChromeDriver Selenium未知错误:由于未知错误导致页面崩溃,会话被删除:无法从 ChromeDriver Selenium 崩溃的选项卡中确定加载状态
【发布时间】:2021-05-17 18:07:30
【问题描述】:

我正在使用使用 Python 和 Selenium 的 InstaPy。我按 Cron 启动脚本,但有时它会崩溃。所以它真的很不规则,有时它运行得很好。我也已经在 GitHub Repo 上发布过,但在那里没有得到答案,所以我现在在这里问是否有人知道原因。

这是一个数字海洋 ubuntu 服务器,我在无头模式下使用它。驱动程序版本在日志中可见。以下是错误消息:

ERROR [2018-12-10 09:53:54] [user]  Error occurred while deleting cookies from web browser!
b'Message: invalid session id\n  (Driver info: chromedriver=2.44.609551 (5d576e9a44fe4c5b6a07e568f1ebc753f1214634),platform=Linux 4.15.0-42-generic x86_64)\n'
Traceback (most recent call last):
  File "/root/InstaPy/instapy/util.py", line 1410, in smart_run
    yield
  File "./my_config.py", line 43, in <module>
    session.follow_user_followers(['xxxx','xxxx','xxxx','xxxx'], amount=100, randomize=True, interact=True)
  File "/root/InstaPy/instapy/instapy.py", line 2907, in follow_user_followers
    self.logfolder)
  File "/root/InstaPy/instapy/unfollow_util.py", line 883, in get_given_user_followers
    channel, jumps, logger, logfolder)
  File "/root/InstaPy/instapy/unfollow_util.py", line 722, in get_users_through_dialog
    person_list = dialog_username_extractor(buttons)
  File "/root/InstaPy/instapy/unfollow_util.py", line 747, in dialog_username_extractor
    person_list.append(person.find_element_by_xpath("../../../*")
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webelement.py", line 351, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webelement.py", line 659, in find_element
    {"using": by, "value": value})['value']
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: session deleted because of page crash
from unknown error: cannot determine loading status
from tab crashed
  (Session info: headless chrome=70.0.3538.110)
  (Driver info: chromedriver=2.44.609551 (5d576e9a44fe4c5b6a07e568f1ebc753f1214634),platform=Linux 4.15.0-42-generic x86_64)

During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
  File "/root/InstaPy/instapy/instapy.py", line 3845, in end
    self.browser.delete_all_cookies()
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 878, in delete_all_cookies
    self.execute(Command.DELETE_ALL_COOKIES)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: chrome not reachable
  (Session info: headless chrome=71.0.3578.80)
  (Driver info: chromedriver=2.44.609551 (5d576e9a44fe4c5b6a07e568f1ebc753f1214634),platform=Linux 4.15.0-42-generic x86_64)

知道可能是什么原因以及如何解决吗?

感谢您的意见。来自http://treestones.ch/ 的人帮助了我。

【问题讨论】:

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


    【解决方案1】:
    Message: unknown error: session deleted because of page crash from unknown error: cannot determine loading status from tab crashed
    (Session info: headless chrome=95.0.4638.69)
    

    出现此错误是因为没有足够的等待时间来加载网页

    【讨论】:

      【解决方案2】:

      我不确定这是否是唯一可能的原因和解决方案,但是在对我时不时遇到的这个错误进行彻底调查后,我发现了以下证据:

      1. 在 Selenium Grid 节点的日志中(您可以通过在 docker 主机上执行以下命令来显示:sudo docker logs &lt;container-id&gt;)我发现许多错误阅读:[SEVERE]: bind() failed: Cannot assign requested address (99)。根据我的阅读,这个错误通常意味着没有可用的端口。
      2. 当显示一个节点内运行的进程时(sudo docker exec -it bash 然后ps aux),我发现了超过 300 个 chrome-driver 进程实例(您可以使用 ps aux|grep driver|wc -l 计算它们)

      在本地运行时,我知道 chrome-driver 进程通常在您创建ChromeDriver 的实例时被调用,并在您调用driver.Quit() 时终止(我在 C# 中工作,而不是Python)。因此我得出结论,有些测试不会调用drive.Quit()

      结论

      在我的例子中,我发现即使我们在 [TearDown] 方法中调用了 driver.Quit()(我们使用 NUnit),我们在该行之前还有一些代码,可能会抛出异常。当前面的这些行之一引发异常时,调用 driver.Quit() 的行未到达,因此随着时间的推移,我们在 Selenium Grid 节点上“泄漏”了 chrome-driver 进程。这些孤儿进程导致可用端口(可能还有内存)的资源泄漏,这也导致浏览器页面崩溃。

      解决方案

      鉴于上述结论,解决方案非常简单。我们必须将driver.Quit() 之前的代码封装在try/finally 中,并将对driver.Quit() 的调用放在finally 子句中,如下所示:

      [TearDown]
      public void MyTearDown()
      {
             try
             {
                    // Perform any tear down code you like, like saving screenshots, page source, etc.
             }
             finally
             {
                    _driver?.Quit();
             }
      }
      

      【讨论】:

        【解决方案3】:

        这发生在我尝试使用Chromium 中的相同驱动程序打开一个新网页时。它在我使用 Chrome 的本地机器上运行良好。

        没有用:

        driver = webdriver.Chrome(options=options)
        driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
        driver.execute_cdp_cmd('Network.setUserAgentOverride', {
                "userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'})
        
        driver.get('url1')
        # Do operations with url1
        
        driver.get('url2')
        # Do operations with url2 -> did not work and crashed
        

        以下是我正在使用的解决方案,它对我有用。即重新初始化the driver

        def setup_driver():
            global driver
            driver = webdriver.Chrome(options=options)
            driver.maximize_window()
            driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
            driver.execute_cdp_cmd('Network.setUserAgentOverride', {
                "userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'})
        
        
        setup_driver()
        driver.get('url1')
        # Do operations with url1
        driver.close()
        
        setup_driver()
        driver.get('url2')
        # Do operations with url2
        driver.close()
        

        【讨论】:

        • 在您的“不起作用”示例中,您是否完全关闭了驱动程序?你是否一直得到错误?如果您根本没有关闭驱动程序并且不一致,那么您遇到的可能就是我在回答中描述的,所以最后关闭一次可能就足够了。
        • 是的,的确,我在尝试的最后关闭了,但效果不佳。崩溃也是一致的。一次都没通过。
        【解决方案4】:

        我们需要单独指定shm内存,--shm-size=2g 如果是码头工人, 使用以下配置 - 这对我来说很好


        服务: 铬合金: 图片:硒/节点铬:4.0.0-rc-1-prerelease-20210823 shm_size: 2GB

        【讨论】:

          【解决方案5】:

          如果有人在使用 docker 容器时遇到这个问题:

          在创建容器时使用标志--shm-size=2g,错误就消失了。 此标志使容器使用主机的共享内存。

          例子

          $ docker run -d --net gridNet2020 --shm-size="2g" -e SE_OPTS="-browser applicationName=zChromeNodePdf30,browserName=chrome,maxInstances=1,version=78.0_debug_pdf" -e HUB_HOST=selenium-hub-3.141.59 -P -p 5700:5555 --name zChromeNodePdf30 -v /var/lib/docker/sharedFolder:/home/seluser/Downloads selenium/node-chrome:3.141.59-xenon
          

          来源:https://github.com/SeleniumHQ/docker-selenium

          【讨论】:

            【解决方案6】:

            我的 Ubuntu 服务器上出现以下错误:

            selenium.common.exceptions.WebDriverException:消息:未知错误: 由于选项卡崩溃的页面崩溃而删除会话(会话 信息:无头铬=86.0.4240.111)(驱动程序信息: 铬驱动程序=2.41.578700 (2f1ed5f9343c13f73144538f15c00b370eda6706),平台=Linux 5.4.0-1029-aws x86_64)

            原来错误的原因是服务器上的磁盘空间不足,解决方法是扩展我的磁盘空间。您可以查看this question了解更多信息。

            【讨论】:

            • 很好的答案,经过数小时的尝试解决了问题:)
            【解决方案7】:

            虽然你看到的错误是:

            Error occurred while deleting cookies from web browser!
            b'Message: invalid session id\n  (Driver info: chromedriver=2.44.609551 (5d576e9a44fe4c5b6a07e568f1ebc753f1214634),platform=Linux 4.15.0-42-generic x86_64)\n'
            

            主要的例外是:

            selenium.common.exceptions.WebDriverException: Message: unknown error: session deleted because of page crash
            from unknown error: cannot determine loading status
            from tab crashed
            

            您的代码试验会给我们一些线索,说明出了什么问题。


            解决方案

            这个问题有多种解决方案。但是,根据UnknownError: session deleted because of page crash from tab crashed,此问题可以通过以下任一解决方案来解决:

            • 添加以下chrome_options

              chrome_options.add_argument('--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 用于不可执行的内存。以下是参考:


            参考

            您可以在以下位置找到一些相关讨论:

            【讨论】:

            • 我有同样的错误,并按照建议做了所有事情,但没有解决我的问题,错误继续存在。有什么不同的建议吗?
            • 使用 chrome_options.add_argument('--disable-dev-shm-usage') 参数结束了我为修复选项卡崩溃而进行的 5 小时搜索。非常感谢您的分享!
            • 这是我第二次重新审视这个 SO 解决方案。归根结底,添加这些选项似乎确实降低了cannot determine loading statusfrom tab crash 的可能性,但有时我仍然会面对它,但这种情况很少见,就像我刚刚处理的 10-20 个测试中的 1 个一样重新尝试测试。我正在使用最新的 chrome 和 selenium,所以真的希望这个问题能够得到很好的调查。好吧,也许有时我的`/dev/shm`对于硒来说太小了,即使有--disable-dev-shm-usage
            • 这个很好的答案并不能解决我的问题。我试图创建一个新问题,但它被关闭为重复。去年有什么建议或变化可能对我有帮助吗? stackoverflow.com/questions/66198126/…
            • options.addArguments("--disable-dev-shm-usage") 有效!
            猜你喜欢
            • 2021-10-05
            相关资源
            最近更新 更多