【问题标题】:Python - In case of an error occurs inside doPython - 如果内部发生错误
【发布时间】:2021-07-09 06:05:45
【问题描述】:

我正在使用 Selenium 运行一个进程并尽可能多地处理错误并为少数人创建自定义异常,但是如果进程中确实发生意外错误,我会遇到问题 Selenium 将继续运行并占用资源/内存,除非明确关闭下来,有没有更好的方法来处理它而不是将所有东西都包裹在 try except 和 inside 除了关闭 Selenium 之外?非常感谢

我想要某种“信号”,以防发生错误将错误发送到哨兵 io 并从 Selenium 释放 ram 空间

简单例子

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://www.example.com')
raise Exception()

如果你不明确说driver.quit() 它永远不会关闭

依赖https://pypi.org/project/webdriver-manager/ https://pypi.org/project/selenium/

再举一个例子

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

class Example:
    def __init__(self):
        self.driver = webdriver.Chrome(ChromeDriverManager().install())
        self.test()

    def test(self):
        # Random unexpected error occurs
        # This case driver "doesnt" exist
        driver.get('https://www.example.com')

Example()

类正在从另一个文件运行

我最终这样做了

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

_driver = webdriver.Chrome(ChromeDriverManager().install())

class Example:
    def __init__(self, driver):
        self.driver = driver
        self.test()

    def test(self):
        # Random unexpected error occurs
        # This case driver "doesnt" exist
        driver.get('https://www.example.com')

try:
    Example(_driver)
except Exception as e:
    print(e)
    _driver.quit()

【问题讨论】:

  • 能否请您提供一些代码/输入/输出?
  • 请稍等

标签: python selenium


【解决方案1】:

将所有内容包装在 try/finallywith 语句中听起来完全是正确的做法......

由于 Selenium 直接支持 with 语句,所以这是最简单的:

from selenium import webdriver

with webdriver.Chrome() as wd:
    res = wd.get('https://stackoverflow.com/questions/')
    print(res.page_source)

(另见https://stackoverflow.com/a/54149666/683329

要在文档中查找的短语是“(用作)上下文管理器”。

否则,如果您正在使用不支持with 语句的东西,或者您不能,您可以使用try/finally

wd = with webdriver.Chrome()
try:
    res = wd.get('https://stackoverflow.com/questions/')
    print(res.page_source) 
finally:
    wd.quit()

编辑:如果您使用的是测试框架,它将在模块和类级别具有设置/清理功能,即使测试失败,清理也会运行。

【讨论】:

  • 如果你有数百行代码,你可能在几个函数中都有它们;在一个函数中进行设置和清理(使用withtry/finally),然后调用其他函数。如果出现异常,它将传播到函数调用之外,直到到达具有withtry/finally 的函数调用。
  • PS:如果您使用的是测试框架,它将在模块和类级别具有设置/清理功能,即使测试失败,也会运行清理。
  • 谢谢,例如,它给了我一个想法,在 Class 将驱动程序传递给 Class 之前运行 Selenium,以防万一在 Class 内部发生预期以关闭 Selenium
猜你喜欢
  • 1970-01-01
  • 2018-10-31
  • 2017-06-24
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
相关资源
最近更新 更多