【问题标题】:Switch to correct iframe?切换到正确的 iframe?
【发布时间】:2020-01-19 10:04:39
【问题描述】:

在 Visual Studio 中,我使用 Selenium 尝试单击 iframe 内的元素。 代码:

问题是如果我像这样使用ECMMyChangeActions 会出错:

driver.SwitchTo().Frame("ECMMyChangeActions");

错误: Message: OpenQA.Selenium.NoSuchFrameException : No frame element found with name or id ECMMyChangeActions

使用 Selenium IDE 我已经记录了这个测试用例,并确认在单击此 iframe 中的任何元素之前需要更改 iframe。

使用 driver.SwitchTo().Frame(0); 在 Visual Studio 中有效,但我仍然无法在其中找到任何元素。所以我怀疑 iframe index=0 不正确。

我已尝试通过计算此 for 循环中页面上的所有 iframe 来确定使用哪个 iframe:

[Test]
        public void CountIframes()
        {
            int size = driver.FindElements(By.TagName("iframe")).Count();

            for (int i = 0; i <= size; i++)
            {
                driver.SwitchTo().Frame(i);
                int total = driver.FindElements(By.XPath("//td[contains(@title,'Find...')]")).Count();
                Console.Write(total);
                driver.SwitchTo().DefaultContent();
            }
        }

我使用这个 for 循环得到的输出是:000。据我了解这个 for 循环代码,如果在任何 iframe 中找到我指定的元素,它只会生成一个“1”。所以000 意味着在任何 iframe 中都找不到这样的元素。

这是该 iframe 的 HTML 图片:

请帮我找到正确的 iframe。

【问题讨论】:

    标签: c# visual-studio selenium iframe


    【解决方案1】:

    您可以像这样使用等待帧:

    wait.waitFrame("idFrame");
    driver.SwitchTo().Frame(driver.FindElement(By.Id("idFrame")));
    
    public void waitFrame(string idElement)
    {
       WebDriverWait wa = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
       wa.Until(c => c.FindElement(By.Id(idElement)));
    }
    

    另外,检查页面的所有框架:

    driver.FindElements(By.TagName("frame"))[n];
    

    其中 n 是所有帧的分子。

    【讨论】:

      【解决方案2】:

      我试图访问的 iframe (ECMMyChangeActions) 位于其他三个 iframe 中。当更彻底地阅读 html 时,这一点变得很明显。

      <HTML>
       <body>
        ...
        <iframe>name="firstiframe"
         ...
         <iframe>name="seconidframe"
          ...
          <iframe>name="thirdiframe"
           ...
           <iframe>name="ECMMyChangeActions"
      

      要访问ECMMyChangeActions,我首先必须重置 selenium 以查看 HTML 文档的根:

      driver.SwitchTo().DefaultFrame();

      然后我按以下顺序切换到每个 iframe,以依偎ECMMyChangeActions

      driver.SwitchTo().Frame("firstiframe");
      driver.SwitchTo().Frame("secondiframe");
      driver.SwitchTo().Frame("thirdiframe");
      driver.SwitchTo().Frame("ECMMyChangeActions");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-02
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        相关资源
        最近更新 更多