Selenium 如何判断浏览器是否被冻结

1 投票
2 回答
3151 浏览
提问于 2025-04-17 13:41

我正在用selenium做一些事情,这涉及到加载很多页面,可能还有很多图片和闪动的广告,这对浏览器来说压力很大,所以我的火狐浏览器经常卡住。
selenium能不能检测到浏览器是否卡住了?比如在任务管理器里显示“未响应”,而我点击标签页也没有反应?
如果不能,有没有人知道怎么处理这种情况?

编辑:

我最后用了以下代码:

  browser = webdriver.Firefox()
  try:
    browser.set_page_load_timeout(_DEFAULT_LOAD_TIME)
    browser.get('http://' + domain)
  except TimeoutException as te:
    print "Loading %s timed out. Killing browser." % domain
    print te
    browser.close()

虽然这段代码不能在浏览器卡住时直接关闭它,但如果把_DEFAULT_LOAD_TIME设置得足够低,通常可以在浏览器卡住之前就把它杀掉。

2 个回答

0

我想到的最佳方法就是直接结束那些运行时间超过设定阈值的进程(比如说孤儿进程)。这个代码片段可以通过 child_process.execFile('powershell.exe') 来调用。当浏览器因为不正常的javascript而卡住时,这个方法对chromedriver和webdriverJS特别有用。

清理运行时间超过30分钟的孤儿进程

# View Processes Running > 30 MIN
Get-Process -name firefox | ? { $_.StartTime -lt (Get-Date).AddMinutes(-30) } | select pid, starttime | Sort-Object starttime

# Terminate Processes Running > 30 MIN
Get-Process -name firefox | ? { $_.StartTime -lt (Get-Date).AddMinutes(-30) } | Stop-Process -Force
2

至少你可以为Selenium设置一个超时时间。在下面的例子中,webdriver会最多等待10秒钟,如果在这段时间内没有响应,就会关闭浏览器并标记测试失败。这样,你就可以确保所有的测试最终都会被执行。

from selenium import webdriver

ff = webdriver.Firefox()
ff.implicitly_wait(10) # seconds
ff.get("http://somedomain/url_that_delays_loading")
myDynamicElement = ff.find_element_by_id("myDynamicElement")

想了解更多信息,可以访问 Selenium官网

撰写回答