【问题标题】:Selenium can't locate iframe elementSelenium 无法定位 iframe 元素
【发布时间】:2019-08-28 03:23:20
【问题描述】:

我想在 iframe 中找到输入元素,但是 selenium 无法找到它。

我同时使用了switchTo().frame(id)switchTo().frame(index),但都不起作用。

这是我的代码:

driver.switchTo().defaultContent();
WebElement ele = driver.findElement(By.xpath("//iframe[contains(id, 'braintree-hosted-field-number')]"));
driver.switchTo().frame(ele);

错误信息:

没有这样的元素:无法定位元素:{"method":"xpath","selector":"//iframe[contains(id, 'braintree-hosted-field-number')]"} (会话信息:chrome=76.0.3809.132)

截图:

Application HTML

【问题讨论】:

  • 将 id 更改为 @id 或只是 .
  • 您应该在 xpath 中将属性 id 指定为 @id。如果仍然没有检测到 iframe,则检查它是否是另一个父 iframe。顺便说一句,发布截图的html不是一个好主意。
  • @supputuri 抱歉,我对发帖很陌生,我应该如何发布 html?我也使用了@id,但仍然没有检测到框架。

标签: java selenium iframe


【解决方案1】:

尝试将WebDriverWaitframeToBeAvailableAndSwitchToIt 一起使用,如下所示:

new WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("braintree-hosted-field-number")));

导入后:

import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;

【讨论】:

    【解决方案2】:

    在 iframe 中,我们可以使用名称、id 或索引进行切换

    driver.switchTo().frame("name or ID");    
    driver.switchTo().frame(index);
    

    一帧-直接切换到一帧(用上面的代码)

    多帧 - 切换到确切的帧

    嵌套框架 - 切换到父框架(父框架)再切换到子框架(内框架

    driver.switchTo().frame("parent frame");
    driver.switchTo().frame("child frame"); 
    

    切换到带有 ID 或名称的框架如果您只有一个 iframe,则直接切换到该框架,否则切换到父框架,然后指向子框架。

    driver.switchTo().frame("braintree-hosted-field-number");
    

    切换到带有索引的框架 看到你的 html 看起来好像有一个 iframe,然后索引以“0”开头。 示例:如果您有 5 个 iframe,则索引将为 0 1 2 3 4

    driver.switchTo().frame(0);
    

    【讨论】:

      【解决方案3】:

      看来你很接近了。要切换到所需的<iframe>,您需要:

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

      【讨论】:

        【解决方案4】:

        通过使用https://github.com/nick318/FindElementInFrames,您可以委派此手动 iframe 切换,只需搜索您需要的元素。

        SearchByFrames searchInFrame = searchFactory.search(() -> driver.findElement(By.tagName("body")));
        Optional<WebElement> elem = searchInFrame.getElem();
        

        它将在所有可用的 iframe 中查找您的元素,它运行稳定且快速。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-10-22
          • 1970-01-01
          • 2022-01-06
          • 2021-06-21
          • 1970-01-01
          相关资源
          最近更新 更多