使用 Selenium WebDriver 实现深层嵌套元素 (Java)

Reach for the deep nested element using Selenium WebDriver (Java)

我在 Whosebug 上浏览了很多主题并尝试了一些建议,但几乎无法成功解决我的特殊情况。我正在尝试使用 Selenium WebDriver + Java 自动化 Google Cloud Pricing Calculator。我需要使用 Java 代码插入实例数(页面上的第一个输入区域)。

我的 Java 代码如下:

WebDriver driver = new ChromeDriver();
    driver.get("https://cloud.google.com/products/calculator");

    new WebDriverWait(driver, 10)
            .until(ExpectedConditions.presenceOfElementLocated(By.xpath("//iframe[contains (@name, 'goog_')]")));

    WebElement document = driver.findElement(By.xpath("//iframe[contains (@name, 'goog_')]"));
    var iframe = document.findElement(By.xpath("//iframe[@id='myFrame']"));
    var input = iframe.findElement(By.xpath("//input[@id='input_66']"));
    input.click();
    input.sendKeys("4");

但是当我启动代码时抛出 NoSuchElementException:“没有这样的元素:无法定位元素:{“method”:“xpath”,“selector”:“//iframe[@id='myFrame']"}.

Xpath 是正确的,但是这个元素隐藏在 html 树的深处。在这种特殊情况下,如何获取元素(实例数)?提前致谢!

您首先需要切换到父 iframe 元素,然后切换到内部 iframe,然后才尝试访问输入元素。
我看到你试图找到 iframe 元素,但你没有切换到它们。
试试这个:

WebDriver driver = new ChromeDriver();
driver.get("https://cloud.google.com/products/calculator");

//Find and switch to outer iframe
new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//iframe[contains(@src,'product')]")));
driver.switchTo().frame(driver.findElement(By.xpath("//iframe[contains(@src,'product')]")));

driver.switchTo().frame(driver.findElement(By.xpath("//iframe[@id='myFrame']")));

WebElement input = driver.findElement(By.xpath("//input[@id='input_66']"));
input.click();
input.sendKeys("4");

你能试试下面这行代码吗?

    WebDriver driver = new ChromeDriver();
    driver.get("https://cloud.google.com/products/calculator");

    new WebDriverWait(driver, 10)
            .until(ExpectedConditions.presenceOfElementLocated(By.xpath("//iframe[contains (@name, 'goog_')]")));

    WebElement document = driver.findElement(By.xpath("//iframe[contains (@name, 'goog_')]"));
    driver.switchTo().frame(document).switchTo().frame("myFrame");
    
    
    //var iframe = document.findElement(By.xpath("//iframe[@id='myFrame']"));
    WebElement ele = driver.findElement(By.xpath("//input[@id='input_66']"));
    
    ele.click();
    ele.sendKeys("4");