gpt4 book ai didi

python - 如何解决 "WebDriverException: Message: TypeError: can' t 访问死对象”并使用 Selenium 和 Python 等待框架可用

转载 作者:行者123 更新时间:2023-11-28 22:22:14 24 4
gpt4 key购买 nike

我有一个相当复杂的网页设置需要测试,其中包含嵌套框架。

在实际问题中,selenium 代码正在加载包含框架的新网页内容,我想切换到该框架。为了避免任何显式等待,我尝试了以下代码片段:

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

但是,如果我另外使用 sleep :

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 识别(可能是错误?)。所以现在 selenium 在一些“frame1”中并且由于某些原因没有意识到“frame2”已经加载。

我解决这个问题的唯一方法(不用长时间 sleep )是使用这段丑陋的代码:

    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”内。

最佳答案

更好的方法是创建您自己的 expected_condition。例如:

class nested_frames_to_be_available_and_switch:
def __init__(self, *args):
"""
:param args: locators tuple of nested frames (BY.ID, "ID1"), (BY.ID, "ID2"), ...
"""
self.locators = args

def __call__(self, driver):
try:
for locator in self.locators:
driver.switch_to.frame(driver.find_element(*locator))
except WebDriverException:
driver.switch_to_default_content()
return False
return True

WebDriverWait(driver, 300).until(nested_frames_to_be_available_and_switch((By.ID, 'frame1'), (By.ID, 'frame1')))

但也许没有必要..为了告诉我需要查看您的 html DOM。

关于python - 如何解决 "WebDriverException: Message: TypeError: can' t 访问死对象”并使用 Selenium 和 Python 等待框架可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47811895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com