selenium 未知错误:由于页面崩溃而删除了会话,未知错误:无法确定使用ChromeDriver Selify崩溃的选项卡的加载状态

gt0wga4j  于 2022-11-10  发布在  其他
关注(0)|答案(9)|浏览(274)

我使用的是InstaPy,它使用的是Python和Selify。我按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/的人帮了我。

pdsfdshx

pdsfdshx1#

尽管您看到的错误是:

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')
  • 在某些页面的Docker容器中,由于/dev/shm太小,Chrome似乎崩溃了。因此,您可能必须修复较小的/dev/shm大小。
  • 举例说明:
sudo mount -t tmpfs -o rw,nosuid,nodev,noexec,relatime,size=512M tmpfs /dev/shm
  • 如果您使用-v /dev/shm:/dev/shm选项共享host/dev/shm,也同样有效
  • 另一种方法是将chrome_options添加为**--disable-dev-shm-usage**。这将迫使Chrome改用/tmp目录。但是,这可能会减慢执行速度,因为将使用磁盘而不是内存。
chrome_options.add_argument('--disable-dev-shm-usage')

From标签页崩溃

从选项卡崩溃是WIP(工作进行中)在Chromium团队工作了很长一段时间,这与Linux试图始终使用/dev/shm作为非执行内存有关。以下是参考资料:

参考

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

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

fiei3ece2#

如果有人在码头集装箱方面遇到此问题:
在创建容器时使用标志--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

7fhtutme

7fhtutme3#

我在我的Ubuntu服务器上收到以下错误:
Selenium.common.exceptions.WebDriverException:消息:未知错误:由于标签页崩溃而删除会话(会话信息:无头Chrome=86.0.4240.111)(驱动程序信息:chromeDRIVER=2.41.578700(2f1ed5f9343c13f73144538f15c00b370eda6706),Platform=linux 5.4.0-1029-awsx86_64)
原来,错误的原因是服务器上磁盘空间不足,解决方案是扩展我的磁盘空间。您可以查看this question了解更多信息。

643ylb08

643ylb084#

我们需要单独指定shm内存,--shm-size=2g在docker的情况下,使用以下配置-这对我来说很好
服务:Chrome:图片:selenium/node-chrome:4.0.0-rc-1-prerelease-20210823 shm_Size:2 GB

iaqfqrcu

iaqfqrcu5#

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)

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

8oomwypt

8oomwypt6#

上面的答案解决了我的问题,但是因为我需要从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-WSL-上的Selify)

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" ]
rta7y2nd

rta7y2nd7#

当我试图打开一个在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()
ojsjcaue

ojsjcaue8#

我不确定这是否是唯一可能的原因和解决方案,但在对我偶尔遇到的这个错误进行彻底调查后,我发现了以下证据:
1.在Selify Grid节点的日志中(您可以通过在docker主机上执行以下命令来显示),我发现了许多错误:[SEVERE]: bind() failed: Cannot assign requested address (99)。据我所知,此错误通常意味着没有可用的端口。
1.在展示一个节点(sudo docker exec -it bashps aux)内部运行的进程时,发现了300多个Chrome-Driver进程的示例(可以使用ps aux|grep driver|wc -l统计)
在本地运行时,我知道当您创建ChromeDriver的示例时,通常会调用Chrome-Driver进程,当您调用driver.Quit()(我在C#中工作,而不是在Python中工作)时,该进程将终止。因此,我得出结论,有些测试不调用drive.Quit()

结论

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

解决方案

根据上面的结论,解决方案非常简单。我们必须将driver.Quit()之前的代码 Package 在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();
       }
}
khbbv19g

khbbv19g9#

我也遇到了同样的问题,我检查了脚本中错误发生时的日志,并在错误发生前添加了一些等待,即time.sleep(2),我的问题被修复了。

相关问题