未知错误:由于未知错误导致页面崩溃,会话被删除:无法从 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 crashed 是 Chromium 团队 的 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 status
和from 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 <container-id>
)我发现许多错误阅读:[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:未知错误:由于页面崩溃而删除会话”错误
[解决问题]未知的生成错误“已添加了具有相同键的项”(SVN进行更新后冲突,冲突解决等操作导致,并且无法定位到代码)