在一个相当复杂的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
不等...?
附录
所以我想说这是一个定时问题,再加上硒中的一个 bug ...
答案 0 :(得分:1)
按照最佳实践的规定,必须使用expected_conditions子句frame_to_be_available_and_switch_to_it(locator)来诱使 WebDriverwait 转换为<iframe>
。
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