未知错误:由于未知错误导致页面崩溃,会话被删除:无法从 ChromeDriver Selenium 崩溃的选项卡中确定加载状态

Posted

技术标签:

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

我正在使用使用 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/ 的人帮助了我。

【问题讨论】:

【参考方案1】:

虽然你看到的错误是:

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

Linux: Chrome/Chromium SIGBUS/Aw, Snap! on small /dev/shm Chrome crashes/fails to load when /dev/shm is too small, and location can't be overridden 根据Comment61#Issue 736452,该修复似乎已通过 Chrome v65.0.3299.6

参考

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

org.openqa.selenium.SessionNotCreatedException: session not created exception from tab crashed error when executing from Jenkins CI server

【讨论】:

我有同样的错误,并按照建议做了所有事情,但没有解决我的问题,错误仍然存​​在。有什么不同的建议吗? 使用 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 这个很好的答案并不能解决我的问题。我试图创建一个新问题,但它被关闭为重复。去年有什么建议或变化可能对我有帮助吗? ***.com/questions/66198126/… options.addArguments("--disable-dev-shm-usage") 有效!【参考方案2】:

如果有人在使用 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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

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

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


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

【讨论】:

【参考方案5】:

这发生在我尝试使用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()

【讨论】:

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

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

    在 Selenium Grid 节点的日志中(您可以通过在 docker 主机上执行以下命令来显示:sudo docker logs &lt;container-id&gt;)我发现许多错误阅读:[SEVERE]: bind() failed: Cannot assign requested address (99)。根据我的阅读,这个错误通常意味着没有可用的端口。 当显示一个节点内运行的进程时(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();
       

【讨论】:

【参考方案7】:
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)

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

【讨论】:

以上是关于未知错误:由于未知错误导致页面崩溃,会话被删除:无法从 ChromeDriver Selenium 崩溃的选项卡中确定加载状态的主要内容,如果未能解决你的问题,请参考以下文章

执行自动化脚本时出现“org.openqa.selenium.WebDriverException:未知错误:由于页面崩溃而删除会话”错误

如何解决sprintf参数类型错误导致程序崩溃

[解决问题]未知的生成错误“已添加了具有相同键的项”(SVN进行更新后冲突,冲突解决等操作导致,并且无法定位到代码)

由于未知的列族,卡桑德拉没有开始

循环到未知 JSON 数据时如何在 allKeys 上捕获错误?

react-native APK 崩溃并出现“未知”错误