如何解决;OpenQA.Selenium.WebDriverException:目标帧分离;通过C#
自从chrome升级到80版后,我开始得到:如何解决;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应该可以正常工作。它适合我
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, ¶ms)) {
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, ¶ms)) {
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']")));