使用 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");
我在 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");