【问题标题】:Selenium can't locate iframeSelenium 找不到 iframe
【发布时间】:2019-07-01 17:44:18
【问题描述】:

Selenium 无法通过 IDName 定位 iframe。

这是针对 Shopify 上的自动结帐测试。具体问题在于支付领域。我找到了iframe 的ID 和名称,即card-fields-number-b1kh6njydiv00000

iframe 图片:

文本字段图像:

代码试验:

driver.switchTo().frame("card-fields-number-b1kh6njydiv00000");
System.out.println("Found iframe");

错误是:

org.openqa.selenium.NoSuchFrameException: No frame element found by name or id card-fields-number-b1kh6njydiv00000

【问题讨论】:

  • 我的猜测是ID正在改变......您是否尝试过刷新页面并再次检查ID?请阅读为什么a screenshot of code is a bad idea。粘贴代码并正确格式化。
  • 您的 iframe 名称或 ID 是动态的吗?

标签: java selenium iframe css-selectors webdriverwait


【解决方案1】:

我相信可以为此使用 XPath。您需要使用 XPath 找到 IFrame IWebElement,然后将 IWebElement 传递到 SwitchTo().Frame()

var ele = driver.FindElement(By.XPath("//iframe[contains(id, 'card-fields-number')]"));

driver.switchTo().frame(ele);

【讨论】:

    【解决方案2】:

    我的解决方案是为不同的动态 ID 寻找完全相同的关键字。在这种情况下,它是“card-fields-name”。我通过使用 XPath 定位器做到了这一点。

    driver.switchTo().frame(driver.findElement(By.xpath("//iframe[contains(@id,'card-fields-number')]")));
    

    【讨论】:

      【解决方案3】:

      根据您共享的图像,<iframe> 具有动态属性,因此要找到并切换到所需的<iframe>,您必须:

      • 诱导 WebDriverWait 使所需的框架可用并切换到它
      • 您可以使用以下任一解决方案:

        • cssSelector

          new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("iframe.card-fields-iframe[id^='card-fields-number-'][src*='shopifycs']")));
          
        • xpath

          new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[@class='card-fields-iframe' and starts-with(@id,'card-fields-number-')][contains(@src, 'shopifycs')]")));
          

      在这里你可以找到Ways to deal with #document under iframe的相关讨论

      【讨论】:

        【解决方案4】:

        我猜框架名称或 ID 每次都是动态的。在这种情况下,使用索引来标识框架。

        int size = driver.findElements(By.tagName("iframe")).size();
          for(int i=0; i<=size; i++){
            driver.switchTo().frame(i); 
            //Do necessary operation here.
            driver.switchTo().defaultContent();
           }
        

        希望对你有帮助

        【讨论】:

          【解决方案5】:

          您是否尝试使用 driver.switchTo().defaultContent();在 switchTo.frame 之前?

          也许你不是所有的框架

          driver.switchTo().defaultContent();
          driver.switchTo().frame("card-fields-number-b1kh6njydiv00000");
          System.out.println("Found iframe");
          

          【讨论】:

          • 试过了,没用。打印出同样的错误信息。
          猜你喜欢
          • 2021-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-28
          • 2021-06-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多