Как обратиться к «OpenQA.Selenium.WebDriverException: целевой кадр отключен», используя Selenium через C# - PullRequest
0 голосов
/ 13 февраля 2020

После обновления chrome до версии 80 я начал получать:

OpenQA.Selenium.WebDriverException: target frame detached

ошибка от веб-драйвера chrome при попытке переключения фреймов.

Даже driver.switchTo().defaultContent(); не работает. Это бросает тайм-аут.

Есть ли способ избежать или восстановиться после этого исключения?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Это сообщение об ошибке ...

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, &params)) {
      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

0 голосов
/ 13 февраля 2020

Я тоже сталкивался с такой же проблемой. Попробуйте обновить версию chromedriver 80.0.3987.16 с селеном. Переключение на iFrame должно работать нормально. У меня это работает.

...