无法在iFrame中找到元素

时间:2019-12-11 22:09:37

标签: java selenium selenium-webdriver iframe

我正在尝试为某个按钮/框架获取xpath。我可以使用xpath来定位元素,但是在运行自动化时却找不到元素异常。我试图切换到特定的框架,然后找到按钮,但是没有用。附加页面和图像的链接。 链接:https://www.msn.com/en-in/weather/today/New-Delhi,Delhi,India/we-city-28.608,77,201?iso=IN enter image description here

这是我尝试的代码。

WebDriverWait wait = new WebDriverWait(cdriver,30);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@id='foot']//following::iframe[@style='width:9.7rem;']")));
System.out.println("Ive waited for the frame to load");
int size = cdriver.findElements(By.tagName("iframe")).size();
System.out.println(size);

/*for(int i=0; i<=size; i++){
cdriver.switchTo().frame(i);
System.out.println("Switched to frame "+i);
int total=  cdriver.findElements(By.xpath("//*[@id='u_0_0']/div/button/span")).size();
System.out.println(total);
cdriver.switchTo().defaultContent();
}*/

cdriver.switchTo().frame(2);
System.out.println("Switched to frame");

cdriver.findElement(By.xpath("//*[@id='u_0_0']/div/button/span")).click();

获取存在的帧数,然后为每个元素检入,但无法切换到该帧。

2 个答案:

答案 0 :(得分:0)

要访问所需元素,因为所需元素位于<iframe>中,因此您必须:

  • 为所需的frameToBeAvailableAndSwitchToIt()诱导 WebDriverWait
  • 您可以使用以下任一Locator Strategies

    • 使用CSS_SELECTOR

      driver.get("https://www.msn.com/en-in/weather/today/New-Delhi,Delhi,India/we-city-28.608,77,201?iso=IN")
      new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("iframe[src^='//www.facebook.com/plugins/like']")));
      
    • 使用XPATH

      driver.get("https://www.msn.com/en-in/weather/today/New-Delhi,Delhi,India/we-city-28.608,77,201?iso=IN")
      new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[starts-with(@src, '//www.facebook.com/plugins/like')]")));
      
  

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

答案 1 :(得分:0)

使用switchTo().frame(2)时,您实际上切换到了第三个<iframe>。您可以使用switchTo().frame(1),但更好的选择是使用唯一标识符而不是索引

WebElement iframe = cdriver.findElement(By.csSelector("#fbcount > iframe"));
cdriver.switchTo().frame(iframe);

要等待帧加载,请使用frameToBeAvailableAndSwitchToIt,而不要使用elementToBeClickable

wait.until(ExpectedConditions.elementToBeClickable(By.csSelector("#fbcount > iframe")));
System.out.println("Switched to frame");