如何通过 C# 使用 Selenium 解决"OpenQA.Selenium.WebDriverException: target frame detached"问题



自从chrome更新到版本80以来,我开始得到:

OpenQA.Selenium.WebDriverException: target frame detached

尝试切换帧时,Chrome 网络驱动程序出错。

即使driver.switchTo().defaultContent();也不起作用。它会引发超时。

有什么方法可以避免此异常或从此异常中恢复?

此错误消息...

WebDriverException: target frame detached

。意味着生成的HttpServerResponseInfonet::HTTP_NOT_FOUND


根据讨论,有些错误代码不符合标准,还有一些特定于Chrome的错误代码仍然存在,大多数客户端将它们视为unknown error。这些错误代码是:

  • target frame detached
  • chrome not reachable
  • disconnected
  • forbidden
  • no such execution context
  • tab crashed

此问题已通过错误/提交得到解决,当前状态为ToBeRelease


深入探讨

错误目标帧分离是在 kTargetDetached 的情况下定义的,其中case kTargetDetached在 http_handler.cc 中定义,当HttpServerResponseInfo包含HTTP_NOT_FOUND时发生,如下所示:

void HttpHandler::HandleCommand(
const net::HttpServerRequestInfo& request,
const std::string& trimmed_path,
const HttpResponseSenderFunc& send_response_func) {
base::DictionaryValue params;
std::string session_id;
CommandMap::const_iterator iter = command_map_->begin();
while (true) {
if (iter == command_map_->end()) {
if (w3cMode(session_id, session_thread_map_)) {
PrepareResponse(
trimmed_path, send_response_func,
Status(kUnknownCommand, "unknown command: " + trimmed_path),
nullptr, session_id, true);
} else {
std::unique_ptr<net::HttpServerResponseInfo> response(
new net::HttpServerResponseInfo(net::HTTP_NOT_FOUND));
response->SetBody("unknown command: " + trimmed_path, "text/plain");
send_response_func.Run(std::move(response));
}
return;
}
if (internal::MatchesCommand(
request.method, trimmed_path, *iter, &session_id, &params)) {
break;
}
++iter;
}

在您的情况下,很可能原因是 kTargetDetached:

case kTargetDetached:
response.reset(new net::HttpServerResponseInfo(net::HTTP_NOT_FOUND));
break;

溶液

要在<iframe>内切换Selenium的焦点,您必须诱导WebDriverWait所需的帧可用并切换到它,如下所示:

  • 使用CssSelector

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt(By.CssSelector("iframe#twitter-widget-0")));
    
  • 使用XPath

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt(By.XPath("//fieldset[@id='twitter-widget-0']")));
    

参考

您可以在以下位置找到一些相关的讨论:

  • 在找到元素之前如何等待框架加载?
  • 如何使用Webdriver和C#通过Selenium找到并单击嵌套在多个框架和框架集中的元素

尾声

在iframe 下处理 #document 的方法

我也遇到了同样的问题。尝试使用硒更新 chromedriver 版本 80.0.3987.16。切换到 iFrame 应该可以正常工作。它对我有用。

相关内容

  • 没有找到相关文章

最新更新