如何使用 Selenium WebDriver 单击 iFrame 中的接受 Cookie 按钮?

问题描述 投票:0回答:2

html 代码显示存在 4 个 iframe,并且接受按钮位于嵌套的 iframe 内。但是,我似乎无法切换到按钮所在的第二个 iframe(我已经尝试过索引、定位器和名称),我收到一条错误消息,指出找不到 iframe。如果有人能解决这个问题,这将极大地影响我的学习之旅。谢谢!

我尝试过以下方法:

driver.get("https://www.jetblue.com/");
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
driver.switchTo().frame(0);
driver.switchTo().frame(1);
    
//Accept cookies locator 
driver.findElement(By.xpath("//div[@class='pdynamicbutton']/a")).click();
javascript selenium-webdriver
2个回答
0
投票

如果您注意到 HTML DOM(见下文),就会发现只有一个 IFRAME 中包含所需的元素。所以你只需要担心一个 IFRAME。

参考以下工作代码:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    WebDriver driver = new ChromeDriver();
    driver.get("https://www.jetblue.com/");
    driver.manage().window().maximize();
        
    // Create explicit wait object with 30s wait
    WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(30));
        
    // switch into the frame
    wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[@title='TrustArc Cookie Consent Manager']")));
    // click on Accept all cookies button
    wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[text()='Accept All Cookies']"))).click();
        
    // Below code is to come out of frame to main content
    driver.switchTo().defaultContent();
}

0
投票

切换到嵌套框架可能很棘手,但这绝对是可能的。您需要了解的一件事是,每次使用 driver.switchTo().frame() 时,WebDriver 将开始查找当前上下文的直接子帧。当您位于顶层时,您位于 html 元素的上下文中。如果您切换到某个框架,您现在就处于该框架的上下文中。

在您的代码中,当您尝试切换到第 0 帧,然后立即尝试切换到第 1 帧时,WebDriver 将在第一个帧内查找第二个帧。但是,如果它们是同级框架(即,主文档的直接子级),则第二个切换将失败,因为第一个框架内没有第二个框架。

如果“接受cookies”按钮位于顶层第二个框架中,则应先切换回默认内容,然后再切换到第二个框架。方法如下:

driver.get("https://www.jetblue.com/");
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));

// Switch to the first frame
driver.switchTo().frame(0);

// ... do stuff in the first frame ...

// Switch back to the top level document
driver.switchTo().defaultContent();

// Now switch to the second frame
driver.switchTo().frame(1);

// Accept cookies
driver.findElement(By.xpath("//div[@class='pdynamicbutton']/a")).click();

另外,请记住,帧可以从 0 开始索引,因此第二个帧的索引为 1。

最后,始终确保您要查找的元素实际上位于您认为它所在的框架中。如果您不确定,您可以检查页面的 HTML 并查找 iframe 或框架标签,然后按照它们向下查找找出该元素在哪里。

在您的具体情况下,还要确保等到页面完全加载并且所有框架都可用,然后再尝试切换到它们。由于该网站可能使用动态内容加载,因此您可能需要使用 WebDriverWait 和 ExpectedConditions.frameToBeAvailableAndSwitchToIt。

© www.soinside.com 2019 - 2024. All rights reserved.