【问题标题】:"Malformed URL: can't access dead object" in selenium when trying to open google尝试打开谷歌时硒中的“格式错误的 URL:无法访问死对象”
【发布时间】:2017-12-12 10:46:36
【问题描述】:

我目前正在使用 python selenium 开发一个非常复杂的测试用例。在其中(页面可能正在加载,iframe 内有 iframe 等),我只想通过以下操作打开网页:

driver.get("https://www.google.com")

但我收到以下错误:

InvalidArgumentException: Message: Malformed URL: can't access dead object

我不能在硒测试中的某个地方只打开一个网页吗?为什么这是格式错误的 URL?死对象与导航到新网页有什么关系...?

【问题讨论】:

标签: python selenium iframe


【解决方案1】:

我认为您在 .get() 之前切换到了一个框架。而且您无法在框架中打开网址。试试driver.switch_to_default_content()

【讨论】:

  • 是的,就是这样。我真的需要围绕 selenium 编写一个包装器,所以它变得可用....
【解决方案2】:

为什么我们会看到错误can't access dead object

让我们假设我们有一个Web Page,其中包含一个iframe,它位于另一个iframe 中。所以层次结构如下:

page root (grandparent) -> iframe (parent) -> iframe (child)

现在,在 iframe (child) 中,如果我们与销毁/关闭孩子的 WebElement(例如 click a button)交互,我们可能会遇到错误 can't access dead object

原因:

似乎驱动程序正在尝试维护对所单击按钮的引用。但是,该按钮不再存在,因此 webdriver 内爆。

可能出了什么问题:

为了提高内存使用率并防止内存泄漏,Firefox 不允许加载项在其父文档被销毁后保留对 DOM 对象的强引用。持有对 DOM 元素的强引用的死对象即使在 DOM 中被销毁后仍然存在,这是导致此错误的根本原因。

例如,GeckoDriver 的当前实现并不总是检查有效的顶级浏览上下文。这意味着如果离开框架并尝试调用 get() 方法,这可能会关闭它,以下命令可能会失败,因为上下文不再可用。

解决办法:

在这些情况下,解决方案是导航回 default_contentparent_frame,然后尝试调用 get() 方法如下:

driver.switch_to.frame("iframe_name")
//frame tasks
driver.switch_to.default_content()
driver.get("https://www.google.com")

HerearethereferencesofthisAnswer

【讨论】:

  • @Alex 这个答案应该会给你一些见解。不过,让我们尝试用更好的解释来回答您当前的问题
猜你喜欢
  • 1970-01-01
  • 2013-04-30
  • 2017-03-19
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
相关资源
最近更新 更多