当前位置: 首页 > 面试题库 >

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

罗昊明
2023-03-14
问题内容

我正在尝试自动化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();

任何帮助将不胜感激


问题答案:

在您的代码中:

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();
}


 类似资料:
  • 问题内容: 我需要通过对象引用在其容器内找到元素的索引。奇怪的是,我找不到简单的方法。请不要jQuery-只有DOM。 是的,我可以为每个元素分配ID并遍历所有节点以匹配ID,但这似乎是一个不好的解决方案。没有更好的东西吗? 因此,就像上面的示例一样,我有一个对第三个LI的对象引用。我怎么知道它是索引2? 谢谢。 问题答案: 您可以使用。为此,我们需要在某种程度上“铸成” true 。例如: 然后

  • 问题内容: 我有一个看起来像这样的表: 还有其他几列与此问题无关。将它们存储为JSON是有原因的。 我要尝试的是查找具有特定 艺术家姓名 (精确匹配)的曲目。 我正在使用此查询: 例如 但是,这会进行全表扫描,而且速度不是很快。我尝试使用function创建一个GIN索引,并使用,但是未使用该索引,查询实际上要慢得多。 问题答案: 在Postgres 9.4+ 使用新的二进制JSON数据类型 ,P

  • 问题内容: 我知道方法rdd.firstwfirst(),它为我提供了RDD中的第一个元素。 还有rdd.take(num)方法,它给了我第一个“ num”元素。 但是,是否有可能通过索引获取元素? 谢谢 问题答案: 首先应为RDD建立索引,这应该是可能的。转换提供了稳定的索引,以其原始顺序对每个元素进行编号。 鉴于: 要按索引查找元素,此形式无用。首先,我们需要使用索引作为键: 现在,可以使用P

  • 问题内容: 我无法使用Beautifulsoup解析具有“ class”属性的HTML元素。代码看起来像这样 脚本完成后的同一行出现错误。 如何摆脱这个错误? 问题答案: 您可以使用BS3优化搜索以仅找到具有给定类的那些div:

  • 问题内容: 我正在寻找在Java中找到给定元素的索引,并知道其内容的方法。 我尝试了以下示例,该示例不起作用: 谁能解释这个问题是什么以及我需要做些什么来解决它? 问题答案: 在这种情况下,你可以从字符数组中创建一个新的String,然后对该字符串执行indeoxOf(“ e”): 但是在其他原始数据类型的情况下,你必须对其进行迭代。

  • 问题内容: 我有一个看起来像这样的表: 还有其他几列与此问题无关。将它们存储为JSON是有原因的。 我想做的是查找具有特定 艺术家姓名 (精确匹配)的曲目。 我正在使用此查询: 例如 但是,这会进行全表扫描,而且速度不是很快。我尝试使用function创建一个GIN索引,并使用,但是未使用该索引,查询实际上要慢得多。 问题答案: 在Postgres 9.4+ 使用新的二进制JSON数据类型 ,Po