Selenium Webdriver:我无法切换到 iframe

Selenium Webdriver : I am not able to switch to iframe

这是我的代码 written.I 尝试添加 thread.sleep() 但它仍然不起作用也尝试使用 chromedriver 但结果相同

package com.thinksys.frames;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

public class Iframes 
{
    public static void main(String[] args) 
    {
        System.setProperty("webdriver.gecko.driver","C:\Users\thinksysuser\Downloads\geckodriver-v0.18.0-win64\geckodriver.exe");

        WebDriver driver = new FirefoxDriver();
        driver.get("https://www.irctc.co.in/eticketing/loginHome.jsf");

        WebElement e = driver.findElement(By.id("google_ads_iframe_/37179215/DFP_NGET_01_HomePage_RHS_ATF_479x266_ENG_0"));

        driver.switchTo().frame(e);

        driver.findElement(By.xpath(".//*[@id='image-11']/a/img")).click();
    }
}

可能是<ifram> id中的特殊字符引起的。使用partial id会提供两个匹配,所以我建议你使用name属性的两个部分

WebElement frame = driver.findElement(By.cssSelector("[name*='google_ads_iframe'][name*='DFP_NGET_01_HomePage_RHS']"));
driver.switchTo().frame(frame);

Edit

图像旋转,每个图像仅显示几秒钟。要单击特定图像,您需要等待它可见。您可以使用显式等待它

WebDriverWait wait = new WebDriverWait(driver, 60, 50);
wait.until(ExpectedConditions.visibilityOfElementLocatedBy.xpath(".//*[@id='image-11']/a/img"))).click();

这将每 100 毫秒触发一次 DOM,直到图像可见或时间到(60 秒)。

显示广告的浏览器各不相同。我已在 Firefox 中打开,但在 chrome 中显示时无法看到广告。以及当我使用脚本打开 Chrome 或 Firefox 浏览器时没有广告部分的情况。

根据这种情况,您可以检查天气框架是否可用,如果可用,然后切换到它并等待您要单击的图像可见,然后单击它

你可以这样试试:

WebDriverWait wait = new WebDriverWait(driver, 120);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(driver.findElement(By.xpath("//iframe[starts-with(@id,'google_ads_iframe')][@title='3rd party ad content']"))));

wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath("//div[@id='image-11']/a/img")))).click();

WebDriverWait wait = new WebDriverWait(driver, 120);
List <WebElement> adFrame = driver.findElements(By.xpath("//iframe[starts-with(@id,'google_ads_iframe')][@title='3rd party ad content']"))
   if(adFrame.size()>0)
    {
        driver.switchTo().frame(adFrame.get(0));
        wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath("//div[@id='image-11']/a/img")))).click();
    }
    else
    {
        System.out.println("Sorry there is no ads");
    }