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");
}
这是我的代码 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");
}