一尘不染

如何在Selenium WebDriver for Java中按索引查找元素

selenium

我正在尝试自动化Google图片页面:

https://www.google.com/search?q=pluralsight&biw=1416&bih=685&source=lnms&tbm=isch&sa=X&ei=qGd6VN6bEZTooAT7q4C4BQ&sqi=2&ved=0CAgQ_AUoAw

所有图像都具有相同的类,但没有id,并且结果在不断变化。因此,我希望能够基于它们的索引单击图像。

我知道如何在C#中执行此操作…但是我无法弄清楚如何在Java中的索引中指定。当我尝试选择一个大于0的索引时,出现和IndexOutOfBounds错误,但是我无法弄清为什么

WebElement image = chromeDriver.findElement(By.className("rg_di"));
WebElement imageLink = image.findElements(By.tagName("a")).get(1);
imageLink.click();

这是我正在使用的整个代码…任何帮助将不胜感激:

    System.setProperty("webdriver.chrome.driver", "/Users/user/chromedriver");
    WebDriver chromeDriver = new ChromeDriver();
    chromeDriver.get("http://www.google.com");

    WebElement searchBox = chromeDriver.findElement(By.id("gbqfq"));
    searchBox.sendKeys("pluralsight");
    searchBox.sendKeys(Keys.RETURN);

    chromeDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    WebElement imagesLink = chromeDriver.findElement(By.linkText("Images"));
    imagesLink.click();

    WebElement image = chromeDriver.findElement(By.className("rg_di"));
    WebElement imageLink = image.findElements(By.tagName("a")).get(1);
    imageLink.click();

任何帮助将不胜感激


阅读 333

收藏
2020-06-26

共1个答案

一尘不染

在您的代码中:

WebElement image = chromeDriver.findElement(By.className("rg_di"));

将返回在页面上找到的带有“ rg_di”类的第一个元素。

该元素中只有一个<a href=... /a>标签。

您正在获取IndexOutOfBounds异常,因为您正在请求 第二个 异常(从零开始的索引编制)。如果将最终的WebElement更改为:

WebElement imageLink = image.findElements(By.tagName("a")).get(0);

只需很小的改动,代码就可以为您工作。

这是我的快速版本(请注意,由于缺少存储元素,因此只需要做一件事情作为WebElements即可):

public static void main(String[] args) {
    // I don't have Chrome installed >.<
    WebDriver driver = new FirefoxDriver();

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    driver.get("http://www.google.com");

    WebElement searchBox = driver.findElement(By.id("gbqfq"));
    searchBox.sendKeys("pluralsight");
    searchBox.sendKeys(Keys.RETURN);

    driver.findElement(By.linkText("Images")).click();

    WebElement image = driver.findElement(By.className("rg_di"));
    image.findElements(By.tagName("a")).get(0).click();

    // super-shortened version:
    // driver.findElement(By.className("rg_di")).findElements(By.tagName("a")).get(0).click();
}
2020-06-26