Это сообщение об ошибке ...
WebDriverException: target frame detached
... означает, что результирующий HttpServerResponseInfo был net :: HTTP_NOT_FOUND .
Подробности
Согласно обсуждению Некоторые коды ошибок не соответствуют стандарту есть некоторые Chrome -specifi c коды ошибок, которые все еще существуют, и большинство клиентов будут обрабатывать их как unknown error
. Эти коды ошибок:
target frame detached
chrome not reachable
disconnected
forbidden
no such execution context
tab crashed
Эта проблема была устранена с помощью ошибки / commit , и текущий статус ToBeReleased .
Deep Dive
Ошибка отсоединение целевого кадра определяется в case 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>
Вы должны вызвать WebDriverWait для желаемого рамка должна быть доступна и переключиться на нее следующим образом:
Использование * 1 097 * 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']")));
Ссылка
Вы можете найти пару соответствующих обсуждений в:
Outro
Способы работы с #document в iframe