Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决;OpenQA.Selenium.WebDriverException:目标帧分离;通过C#_Selenium_Google Chrome_Iframe_Selenium Chromedriver_Webdriverwait - Fatal编程技术网

如何解决;OpenQA.Selenium.WebDriverException:目标帧分离;通过C#

如何解决;OpenQA.Selenium.WebDriverException:目标帧分离;通过C#,selenium,google-chrome,iframe,selenium-chromedriver,webdriverwait,Selenium,Google Chrome,Iframe,Selenium Chromedriver,Webdriverwait,自从chrome升级到80版后,我开始得到: OpenQA.Selenium.WebDriverException: target frame detached 尝试切换帧时,chrome webdriver出错 甚至driver.switchTo().defaultContent()不起作用。它抛出一个超时 有什么方法可以避免或从这个异常中恢复吗?我也面临同样的问题。尝试使用selenium更新chromedriver版本80.0.3987.16。切换到iFrame应该可以正常工作。它适合我

自从chrome升级到80版后,我开始得到:

OpenQA.Selenium.WebDriverException: target frame detached
尝试切换帧时,chrome webdriver出错

甚至
driver.switchTo().defaultContent()不起作用。它抛出一个超时


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

我也面临同样的问题。尝试使用selenium更新chromedriver版本80.0.3987.16。切换到iFrame应该可以正常工作。它适合我。

此错误消息

WebDriverException: target frame detached
…表示生成的HttpServerResponseInfo是net::HTTP\u未找到


细节 根据讨论,仍然存在一些特定于Chrome的错误代码,大多数客户端将其视为未知错误。这些错误代码是:

  • 目标帧分离
  • 无法访问chrome
  • 断开连接
  • 禁止
  • 没有这样的执行上下文
  • 选项卡崩溃
此问题已通过/解决,当前状态为Toberelease


深潜 分离的错误目标帧在中定义,其中在中定义了
case kTargetDetached
,并在HttpServerResponseInfo包含
HTTP\u NOT\u 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;
  }

解决方案 要在
中切换的焦点,您必须诱导WebDriverWait以获得所需的帧,并按如下方式切换到该帧:

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;
  }
  • 使用CssSelector:

  • 使用XPath:


参考文献 您可以在以下内容中找到一些相关讨论:


奥特罗

上述解决方案不适用于最新的chrome 81版,也不适用于80版。
new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt(By.CssSelector("iframe#twitter-widget-0")));
new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt(By.XPath("//fieldset[@id='twitter-widget-0']")));