自从chrome更新到版本80以来,我开始得到:
OpenQA.Selenium.WebDriverException: target frame detached
尝试切换帧时,Chrome 网络驱动程序出错。
即使driver.switchTo().defaultContent();
也不起作用。它会引发超时。
有什么方法可以避免此异常或从此异常中恢复?
此错误消息...
WebDriverException: target frame detached
。意味着生成的HttpServerResponseInfo是net::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, ¶ms)) {
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 应该可以正常工作。它对我有用。