WebDriverException:消息:TypeError:无法访问死对象

时间:2018-07-05 09:33:33

标签: python selenium selenium-webdriver

在一个相当复杂的python-selenium测试脚本中(无法从外部访问它,因此我无法提供示例),我有以下代码行等待元素可见:

WebDriverWait(basedriver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"clb-iframe-workspace")))
elem = WebDriverWait(basedriver, 20).\
           until(EC.element_to_be_clickable((By.XPATH, '//div[contains(text(), "Feature extraction")]')))

在大多数情况下,没有问题,Web驱动程序会找到有问题的元素。但是有时候(大约每10例中有1例)我得到以下错误:

WebDriverException: Message: TypeError: can't access dead object

奇怪的是,这种情况马上就发生了!硒甚至不费心等待我希望使用WebDriverWait进行硒等待的20秒!

也许iframe开关可能与此有关? 我还尝试在失败的行之前制作屏幕截图-在两种情况下,我都会出现空白的白屏。那么,如何自己调试一下呢?为什么WebDriverWait不等...?

附录

  • 我已经执行了DebanjanB的建议,但仍然出现5%的错误。
  • 如果我使用较慢的Internet连接,几乎总是在所有时间发生错误!
  • 当我插入代码以截取屏幕截图并写出页面源代码(这需要一些时间)时,错误率再次降低。

所以我想说这是一个定时问题,再加上硒中的一个 bug ...

1 个答案:

答案 0 :(得分:1)

按照最佳实践的规定,必须使用expected_conditions子句frame_to_be_available_and_switch_to_it(locator)来诱使 WebDriverwait 转换为<iframe>


frame_to_be_available_and_switch_to_it(对象)类

class frame_to_be_available_and_switch_to_it(object)是检查给定帧是否可切换到的期望。如果该框架可用,则会将给定的驱动程序切换到指定的框架。


因此您需要替换以下行:

elem = WebDriverWait(basedriver, 20).\
        until(EC.presence_of_element_located((By.ID, 'clb-iframe-workspace')))
basedriver.switch_to_frame(elem)

为:

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"clb-iframe-workspace")))

注意:您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC