当前位置: 首页 > 知识库问答 >
问题:

在Selenium C#中切换到IFrame时出现异常

高自怡
2023-03-14
<div class="panel1" id="list_container" style="height: 181px;">
  <div class="control" id="FilteredDashboardList">


    <div class="splitter horizontal disabled" id="filteredlist_splitter">
      <div class="panel1" id="views_container" style="height: 23px;">

        <div style="display: none;" class="listheaderbar-bb" id="loading_container">
          <div title="Loading..." class="loading"></div>
        </div>
        <iframe width="100%" height="100%" frameborder="no" id="views_container_frame_2" style="display: block;" src="/WebUI/Editors/CME/Views/ListFilters/DefaultListBar.aspx"></iframe>
      </div>
      <div class="handle">
      </div>

      <div class="panel2" id="list_container" style="height: 157px;">
        <div c:headpath="/WebUI/Editors/CME/Xml/ListDefinitions/ListSearchItems.xml" c:textlookup="true" tabindex="-1" class="list stack horizontal" id="FilteredItemsList" style="outline: 0px none;">
          <div class="head stack-elem" style="display: block; -moz-user-select: none; cursor: default;">
            <div class="container" style="width: 1009px;">
              <div class="column" index="0" style="width: 12px;">
                <div class="text"></div>
                <div class="sort image"></div>
              </div>
              <div class="column" index="1" style="width: 102px;">
                <div class="text">Name</div>
                <div class="sort image"></div>
                <div class="filter" tabindex="0" style="outline: 0px none;"></div>
              </div>
              <div class="column" index="2" style="width: 102px;">
                <div class="text">Task Name</div>
                <div class="sort image"></div>
                <div class="filter" tabindex="0" style="outline: 0px none;"></div>
              </div>
              <div class="column" index="3" style="width: 102px;">
                <div class="text">Publication</div>
                <div class="sort image"></div>
                <div class="filter" tabindex="0" style="outline: 0px none;"></div>
              </div>
              <div class="column" index="4" style="width: 102px;">
                <div class="text">Assigned on</div>
                <div class="sort image"></div>
                <div class="filter" tabindex="0" style="outline: 0px none;"></div>
              </div>
              <div class="column" index="5" style="width: 102px;">
                <div class="text">Assigned To</div>
                <div class="sort image"></div>
                <div class="filter" tabindex="0" style="outline: 0px none;"></div>
              </div>
              <div class="column" index="6" style="width: 102px;">
                <div class="text">Due date</div>
                <div class="sort image"></div>
                <div class="filter" tabindex="0" style="outline: 0px none;"></div>
              </div>
              <div class="column" index="7" style="width: 102px;">
                <div class="text">State</div>
                <div class="sort image"></div>
                <div class="filter" tabindex="0" style="outline: 0px none;"></div>
              </div>
              <div class="column" index="8" style="width: 102px;">
                <div class="text">Owner</div>
                <div class="sort image"></div>
                <div class="filter" tabindex="0" style="outline: 0px none;"></div>
              </div>
              <div class="column" index="9" style="width: 101px;">
                <div class="text">Suspend Or Fail Reason</div>
                <div class="sort image"></div>
                <div class="filter" tabindex="0" style="outline: 0px none;"></div>
              </div>
            </div>
          </div>
          <div class="resizer"></div>
          <iframe width="100%" frameborder="no" tabindex="1" id="FilteredItemsList_frame_details" class="body stack-calc active" src="about:blank" style="height: 141px;">
            <html>
              <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                ....
              </tr>
              <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                .....
              </tr>
              <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                ....
              </tr>
              .....
              .....
            </html>
          </iframe>
        </div>
      </div>
    </div>
  </div>
</div>
driver.Navigate().GoToUrl("URL");
Thread.Sleep(60 * 500);
IWebElement containerFrame = A.WaitForElementByXPath(driver, ".//iframe[@class='body stack-calc active']", 60);
            driver.SwitchTo().Frame(containerFrame);
            driver.Close();

    public static class A
        {
            public static IWebElement WaitForElementByXPath(IWebDriver driver, string xPath, int waitTimeInSeconds)
            {
                WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(waitTimeInSeconds));
                return wait.Until(ExpectedConditions.ElementIsVisible(By.XPath(xPath)));
            }
        }

共有1个答案

轩辕鸿祯
2023-03-14

在Selenium中对此有一个特殊的构造,我喜欢使用它(示例):

By iFrameLocator = By.XPath("...");
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
wait.Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt(iFrameLocator));

还有一点:在HTML中,您不应该依赖于类名的顺序。

<iframe class="body stack-calc active">

意思与

<iframe class="stack-calc active body">
By locator = By.CssSelector("iframe.body.stack-calc.active")
 类似资料:
  • 问题内容: 我正在尝试使用Selenium,Python和BS4在iframe中访问iframe 在返回的文本中,似乎还有两个iframe。我将如何访问那些?我尝试上面的代码没有成功。 问题答案: 将返回到文档顶部。发生的事情是您切换到第一个,然后又切换回文档的顶部,然后尝试查找第二个。硒找不到第二个,因为它在第一个之内。 如果删除第二个,则应该没问题:

  • 问题内容: 我正在尝试使用Selenium,Python和BS4在iframe中访问iframe 在返回的文本中,似乎还有两个iframe。我将如何访问这些?我尝试上面的代码没有成功。 问题答案: 将返回到文档顶部。发生的事情是,您切换到第一个,切换回文档的顶部,然后尝试查找第二个。硒找不到第二个,因为它在第一个之内。 如果删除第二个,则应该没问题:

  • 我在 Windows 11 上的 IE10 中运行硒脚本,每当我尝试切换到新窗口时,都会低于: 检索当前窗口时出错 无法获取浏览器 然而,相同的代码在Windows 7上的IE11中运行良好。我已经尝试更改注册表以尝试设置功能。仍然面临这个问题。有人能建议解决这个问题吗?

  • 请回答如何从现有网页窗口切换到新的弹出窗口

  • 问题内容: 最近我将数据库从sqlite3更改为mysql。运行项目时,我在使用此查询的文件之一中遇到此错误。 日期= Date.today +1 @employees = Employee.where(“状态=?AND strftime(’%d /%m’,date_of_birth)=?”,“活动”,date.strftime(’%d /%m’) 问题答案: 只需替换一下即可尝试一下, 用