Python Selenium 超时异常捕获

34

在我的线程中,我使用一个简单的变量,将其设置为'1'或'0',以指示它是否再次准备就绪。尝试调试问题时,有时这个变量没有被重置,我想我可能找到了原因。

我不希望连接超时进入一些无限加载时间(我认为Selenium的默认值不是有超时),所以我使用了:

Driver.set_page_load_timeout(30)

然后在那个线程中,我会检查

If condition:
 isrunning = 0

我最初认为set_page_load_timeout会在30秒后停止页面加载,但如果我理解正确的话,它实际上会抛出异常,所以我需要做类似以下的操作:

try:
  Driver.set_page_load_timeout(30)
except:
  isrunning = 0
  Driver.Close()

-Do whatever else in function -
If condition:
  isrunning = 0
  Driver.Close()

如果它运行超过30秒,它将关闭并设置为0;否则,它将继续运行并稍后进行检查并设置为0。

我知道这只是一小段代码,但整个代码相当冗长,我认为这是重要的部分。

我希望有人可以确认我在这里的想法是正确的。我非常愿意进行测试,但这个问题每8个小时才会出现一次,这使得难以分析,但我认为这可能符合条件。


很多文字,但是这是一个问题吗?如何拦截TimeOutException或者说什么? - Andersson
2个回答

75

除了 Driver.Close() 之外,你的代码基本都能正常工作。应该改为 Driver.close() 。当页面在特定时间内未加载时,将抛出 TimeoutException 异常。请参见下面的代码:

from selenium import webdriver
from selenium.common.exceptions import TimeoutException

Driver = webdriver.Firefox()
try:
    Driver.set_page_load_timeout(1)
    Driver.get("http://www.engadget.com")
except TimeoutException as ex:
    isrunning = 0
    print("Exception has been thrown. " + str(ex))
    Driver.close()

在我的代码中有 except TimeoutException:。然而,在出现selenium.common.exceptions.TimeoutException: Message: timeout: Timed out receiving message from renderer: xxx的情况下,该异常未被捕获,导致打印Traceback (most recent call last):Stacktrace:Backtrace:,随后 Python 脚本异常退出。为什么?如何正确捕获这个异常? - pmor
@pmor 我认为你的错误不在 try/catch 之内。请检查抛出错误的行号。 - Buaban
谢谢!我之前以为Selenium提供了对部分DOM的访问(因此即使出现TimeoutException,我也会执行'page_source'),然而它实际上并没有提供该功能(可参考链接https://dev59.com/Mgf4s4cB2Jgan1zn1drm#45237189)。 - pmor

0

这应该可以运行

from selenium import webdriver
from selenium.common.exceptions import TimeoutException

try:
    Driver.set_page_load_timeout(1)
    Driver.get("http://www.engadget.com")
except TimeoutException
    pass
isrunning = 0
Driver.close()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接