我需要测试一个相当复杂的网页设置,其中包含嵌套框架。
在实际问题中,硒代码正在加载包含我想切换到的框架的新网页内容。为了避免任何显式等待,我尝试了以下代码片段:
self.driver.switch_to_default_content()
WebDriverWait(self.driver, 300).\
until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'frame1')))
WebDriverWait(self.driver, 300).\
until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'frame2')))
但是,此代码段总是失败并导致以下错误:
...
File "/home/adietz/Projects/Venv/nosetests/local/lib/python2.7/site-packages/selenium/webdriver/support/wait.py", line 71, in until
value = method(self._driver)
File "/home/adietz/Projects/Venv/nosetests/local/lib/python2.7/site-packages/selenium/webdriver/support/expected_conditions.py", line 247, in __call__
self.frame_locator))
File "/home/adietz/Projects/Venv/nosetests/local/lib/python2.7/site-packages/selenium/webdriver/support/expected_conditions.py", line 402, in _find_element
raise e
WebDriverException: Message: TypeError: can't access dead object
但是,如果我另外使用睡眠:
time.sleep(30)
self.driver.switch_to_default_content()
WebDriverWait(self.driver, 300).\
until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'frame1')))
WebDriverWait(self.driver, 300).\
until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'frame2')))
selenium 能够在框架内找到框架并切换到它。看起来在错误情况下 selenium 切换到“frame1”,而“frame2”尚未加载,但“frame2”在“frame1”的其他实例中加载,或者 selenium 无法识别(可能是错误?)。所以现在硒在一些'frame1'内,由于某些原因没有意识到'frame2'已经加载。
我可以解决这个问题(不使用长时间睡眠)的唯一方法是使用这段丑陋的代码:
mustend = time.time() + 300
while time.time() < mustend:
try:
self.driver.switch_to_default_content()
self.driver.switch_to.frame(self.driver.find_element_by_id("frame1"))
self.driver.switch_to.frame(self.driver.find_element_by_id("frame2"))
break
except WebDriverException as e:
self.log("Sleeping 1 sec")
time.sleep(1)
if time.time() > mustend:
raise TimeoutException
所以每当我得到一个WebDriverException
(死物)时,我都会去顶层框架并尝试切换到内部框架 - 逐帧。
我可以尝试其他方法吗?
附加信息
- iframe 是嵌套的,即“frame2”在“frame1”内。