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

2024-12-20 08:37:00
admin
原创
141
摘要:问题描述:我正在使用使用 Python 和 Selenium 的 InstaPy。我按照 Cron 启动脚本,但有时它会崩溃。所以它真的很不规律,有时运行得很好。我也已经在 GitHub Repo 上发帖了,但没有得到答案,所以我现在在这里问是否有人知道原因。这是一台 Digital Ocean Ubuntu...

问题描述:

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

这是一台 Digital Ocean Ubuntu 服务器,我正在无头模式下使用它。驱动程序版本在日志中可见。以下是错误消息:

ERROR [2018-12-10 09:53:54] [user]  Error occurred while deleting cookies from web browser!
b'Message: invalid session id
  (Driver info: chromedriver=2.44.609551 (5d576e9a44fe4c5b6a07e568f1ebc753f1214634),platform=Linux 4.15.0-42-generic x86_64)
'
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
  (Driver info: chromedriver=2.44.609551 (5d576e9a44fe4c5b6a07e568f1ebc753f1214634),platform=Linux 4.15.0-42-generic x86_64)
'

主要例外是:

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 removed because of page crash from tab crashed ,这个问题可以通过以下任一解决方案解决:

  • 添加以下内容chrome_options

chrome_options.add_argument('--no-sandbox')         
  • 由于尺寸太小,Chrome 在某些页面上的 Docker 容器中似乎会崩溃/dev/shm。因此您可能需要修复/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_optionsas --disable-dev-shm-usage。这将强制 Chrome 使用/tmp目录。但这可能会减慢执行速度,因为将使用磁盘而不是内存。

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

来自标签崩溃

来自 tab crashed 的WIP(正在进行的工作)是Chromium 团队长期以来一直在进行的,它与Linux 尝试始终将 /dev/shm 用于非可执行内存有关。以下是参考资料:

  • Linux:Chrome/Chromium SIGBUS/Aw,Snap!小型 /dev/shm 上

  • 当 /dev/shm 太小时,Chrome 会崩溃/无法加载,并且无法覆盖位置

  • 根据Comment61#Issue 736452,修复似乎已在Chrome v65.0.3299.6中得到解决


参考

您可以在以下位置找到几个相关的讨论:

  • org.openqa.selenium.SessionNotCreatedException:从 Jenkins CI 服务器执行时,选项卡崩溃错误导致会话未创建异常

解决方案 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:消息:未知错误:由于选项卡崩溃导致页面崩溃,会话已被删除(会话信息:headless chrome=86.0.4240.111)(驱动程序信息:chromedriver=2.41.578700(2f1ed5f9343c13f73144538f15c00b370eda6706),平台=Linux 5.4.0-1029-aws x86_64)

事实证明,错误原因是服务器磁盘空间不足,解决方案是扩展磁盘空间。您可以查看此问题以获取更多信息。

解决方案 4:

上面的答案解决了我的问题,但由于我需要从 docker-compose.yml 运行它,所以我使用了这个配置,它调用我常规的不变的 DockerFile

docker-compose.yml

version: '1.0'
services:
  my_app:
    build:
      context: .
      #when building
      shm_size: 1gb
    #when running  
    shm_size: 1gb

DockerFile(Ubuntu 上的 selenium -WSL-)

FROM python:3.10

# install google chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
RUN apt-get -y update
RUN apt-get install -y google-chrome-stable

# install chromedriver
RUN apt-get install -yqq unzip
RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/

# set display port to avoid crash
ENV DISPLAY=:99

# install selenium
RUN pip install selenium==3.8.0


#install and prepar app

COPY ./requirements.txt ./
# COPY . /app
RUN pip3 install -r requirements.txt
RUN apt-get install -y libnss3

ENV APP_DIR=/app/my_app
RUN mkdir -p ${APP_DIR}
WORKDIR ${APP_DIR}

# COPY . ${APP_DIR} #not needed since we are mapping the volume in docker-compose

CMD [ "my_app.py" ]
ENTRYPOINT [ "python" ]

解决方案 5:

我们在 2024 年 1 月 30 日发布的版本121.0.6167.139中遇到了同样的问题

这是一个 chrome 错误。

降级到以前的版本:
120.0.6099.224并重新开始工作。

已向 Google 报告。更多信息请见此处。Google 拒绝了。该错误在更高版本中仍然出现...

解决方案 6:

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


服务:chrome:图像:selenium/node-chrome:4.0.0-rc-1-prerelease-20210823 shm_size:2gb

解决方案 7:

当我尝试使用相同的驱动程序打开新网页时发生了这种情况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()

解决方案 8:

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

  1. 在 Selenium Grid 节点的日志中(您可以通过在 docker 主机上执行以下命令来显示:)sudo docker logs <container-id>,我发现了很多错误,如下所示:[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()

结论

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

解决方案

鉴于上述结论,解决方案非常简单。我们必须将前面的代码包装driver.Quit()在 a 中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();
       }
}

解决方案 9:

就我而言sandboxshm设置没有帮助,所以我最终定期关闭当前选项卡并切换到新选项卡,如下所示:

import selenium
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def refresh_tab(driver):
    driver.execute(selenium.webdriver.remote.command.Command.NEW_WINDOW)
    WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
    driver.close()
    driver.switch_to.window(driver.window_handles[0])
    

解决方案 10:

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)

发生此错误的原因是网页加载等待时间不足

(错误消息表明会话由于网页崩溃而被删除。还有一个问题是它无法确定页面是否正在加载。经过研究,我发现主要问题是没有等待足够长的时间让网页加载。我通过检查错误、进行一些测试以及阅读有关会话和崩溃在无头 Chrome 版本 95.0.4638.69 中的工作方式来解决这个问题。)

解决方案 11:

我遇到了同样的问题,我检查了脚本中发生错误的日​​志,然后我添加了一些等待,即time.sleep(2)就在错误发生之前,我的问题就解决了。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用