selenium.common.exceptions.WebDriverException:消息:无效的会话 id 使用 Selenium 与 ChromeDriver 和 Chrome 通过 Python

are*_*end 15 python selenium google-chrome webdriver selenium-chromedriver

我正在使用 Selenium 编写一些代码,并且有一次我向不同的网站发出了 7 个请求。对于第一个,这很好用。但是,对于其他人,我收到会话 ID 错误。我认为我的浏览器配置正确,因为我确实从第一个网站获得了结果。我试图在请求之间放置一个 WebDriverWait,但无济于事。我认为这些网站可能会阻止我的请求。有谁知道如何解决这个问题?

如果这是愚蠢的事情或者我做错了什么,我很抱歉,我很新^^

提前致谢!

Traceback (most recent call last):
  File "/home/cena/PycharmProjects/Frikandelbroodje/main.py", line 56, in <module>
    dirk_price = get_price(dirk_url, dirk_classname)
  File "/home/cena/PycharmProjects/Frikandelbroodje/main.py", line 44, in get_price
    browser.get(url)
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 333, in get
    self.execute(Command.GET, {'url': url})
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: invalid session id
  (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Linux 4.15.0-50-generic x86_64)
Run Code Online (Sandbox Code Playgroud)

Deb*_*anB 22

无效的会话 ID

无效的会话ID错误是webdriver的错误当服务器无法识别唯一的会话标识符发生。如果会话已被删除会话 ID 无效,则会发生这种情况。

可以通过以下任一方式删除 WebDriver 会话:

  • 显式会话删除:当显式调用quit()方法时,WebDriver 会话被显式删除,如下所示:

    • 代码块:

      from selenium import webdriver
      from selenium.common.exceptions import InvalidSessionIdException
      
      driver = webdriver.Chrome(executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
      print("Current session is {}".format(driver.session_id))
      driver.quit()
      try:
          driver.get("https://www.google.com/")
      except Exception as e:
          print(e.message)
      
      Run Code Online (Sandbox Code Playgroud)
    • 控制台输出:

      Current session is a9272550-c4e5-450f-883d-553d337eed48
      No active session with ID a9272550-c4e5-450f-883d-553d337eed48
      
      Run Code Online (Sandbox Code Playgroud)
  • 隐式会话删除:当您关闭最后一个窗口或选项卡调用close()方法时,将隐式删除 WebDriver 会话,如下所示:

    • 代码块:

      driver = webdriver.Chrome(executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
      print("Current session is {}".format(driver.session_id))
      # closes current window/tab
      driver.close()
      try:
          driver.get("https://www.google.com/")
      except Exception as e:
          print(e.message)
      
      Run Code Online (Sandbox Code Playgroud)
    • 控制台输出:

      Current session is a9272550-c4e5-450f-883d-553d337eed48
      No active session with ID a9272550-c4e5-450f-883d-553d337eed48
      
      Run Code Online (Sandbox Code Playgroud)

结论

由于第一个请求工作正常,但对于其他请求,您会收到会话 ID错误,很可能是检测到WebDriver控制的Web 浏览器,因此阻止了下一个请求。

WebDriver控制的Web 浏览器被检测并同时被阻止的原因有多种。您可以在以下位置找到一些详细的讨论:


use*_*745 9

我收到此错误消息是因为我在 docker 中运行 Selenium 并且没有安装足够的交换内存,因此在几页后它就会崩溃。

为了解决这个问题,我使用了相同的 docker 命令,但-v /dev/shm:/dev/shm在 docker run 之后添加。

如果你有这个

docker run -d -p 5901:5900 -p 127.0.0.1:4445:4444 selenium/standalone-chrome
Run Code Online (Sandbox Code Playgroud)

然后改成这个

docker run -v /dev/shm:/dev/shm -d -p 5901:5900 -p 127.0.0.1:4445:4444 selenium/standalone-chrome
Run Code Online (Sandbox Code Playgroud)

我在这里这里找到了这个信息。

这将为 docker 容器提供更多交换内存。其中docker run --help写道:

-v, --volume list                    Bind mount a volume
    --volume-driver string           Optional volume driver for the container
    --volumes-from list              Mount volumes from the specified container(s)
Run Code Online (Sandbox Code Playgroud)

简单来说,我认为它告诉 docker 容器可以使用你的主机(即你的笔记本电脑)内存。