繁体   English   中英

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

[英]unknown error: session deleted because of page crash from unknown error: cannot determine loading status from tab crashed with ChromeDriver Selenium

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

尽管您将错误视为:

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 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')

从选项卡崩溃

来自选项卡崩溃的WIP(正在进行的工作)与Chromium 团队现在已经有一段时间了,这与Linux 试图始终使用 /dev/shm 作为非可执行内存有关 以下是参考资料:


参考

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

我在我的 Ubuntu 服务器上收到以下错误:

selenium.common.exceptions.WebDriverException:消息:未知错误:会话因选项卡崩溃而被删除(会话信息:无头 chrome=86.0.4240.111)(驱动程序信息:chromedriver=2.41.578700(2f1ed5f9343c13f7314450304b731445030700000000) .0-1029-aws x86_64)

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

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

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


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

当我尝试在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()

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

  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()

结论

就我而言,我发现即使我们在[TearDown]方法(我们使用 NUnit)中调用了driver.Quit() ),我们在该行之前还有一些代码,这些代码可能会引发和异常。 当这些前面的行之一抛出异常时,调用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();
       }
}
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)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM