java - 如何创建 List<WebElement> 并单击引发 java.lang.IndexOutOfBoundsException 的选项

标签 java selenium selenium-webdriver xpath indexoutofboundsexception

我正在测试一个 xpath 是动态的网站,并寻找一种方法来单击列表中的各个链接。我决定尝试在 ul 标记处创建一个静态的 webelements 列表。但是,当我这样做时,我收到如下所示的越界异常:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 
2, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.get(ArrayList.java:433)
at automationFramework.ThirdIronTest.main(ThirdIronTest.java:40)

我知道 li 元素的大小大于 1,并且在搜索每个元素之前我隐式等待,以便确保每个页面加载,但它似乎仍然不起作用。我错过了什么?

这是我的代码:

public static void main(String[] args) throws InterruptedException, IOException {

    // Open Chrome browser
    WebDriver driver = new ChromeDriver();

    // Maximize browser window
    driver.manage().window().maximize();

    // Navigate to QA Environment to begin test
    driver.get("https://qa-safari-develop.browzine.com/libraries/14/subjects");

    // Allow search for elements to wait for page(s) to load
    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

    //** HERE WE ARE CREATING ELEMNTS OF SUBJECT LIST
    List<WebElement> subjectElems = driver.findElements(By.xpath("//*[@id=\"subjects-list\"]"));

    // Click on the subject Biomedical and Health Sciences from the Browse Subjects Navigation
    subjectElems.get(2).click();

最佳答案

发生索引越界异常是因为您正在获取大小等于 1 的 WebElement 列表。我的意思是,您想检索 <LI>包含生物医学和健康科学链接的元素。然而,这段代码driver.findElements(By.xpath("//*[@id=\"subjects-list\"]"))得到 <UL> id 为 subject-list 的元素,在页面中是唯一的。因此,列表的大小为 1,并且当您调用 subjectElems.get(2).click() 时会引发异常。 .

总结一下,要使其正常工作,您应该执行类似以下操作:

// Navigate to QA Environment to begin test
driver.get("https://qa-safari-develop.browzine.com/libraries/14/subjects");

// Allow search for elements to wait for page(s) to load
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

//** Getting the ul with the links
WebElement subjectElems = driver.findElement(By.xpath("//*[@id=\"subjects-list\"]"));

  // looking for an element with link text = Biomedical and Health Sciences
   WebElement biomedicalAndHealthSciences = subjectElems.findElement(By.linkText("Biomedical and Health Sciences"));

System.out.println(biomedicalAndHealthSciences.getText());
// Click on the subject Biomedical and Health Sciences from the Browse Subjects Navigation
biomedicalAndHealthSciences.click();

如果你想迭代 <UL> 中的所有链接:

    WebElement subjectElems = driver.findElement(By.xpath("//*[@id=\"subjects-list\"]"));


 List<WebElement> linkList =  subjectElems.findElements(By.tagName("a"));

       for(WebElement link: linkList) {
             System.out.println(link.getText());
             link.click();
       }

关于java - 如何创建 List<WebElement> 并单击引发 java.lang.IndexOutOfBoundsException 的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51412964/

相关文章:

java - Kafka - 具有特定偏移量的消费者组创建?

python - 如何使用selenium获取 'href'链接?

python - 如何在一段时间没有事件后禁用 Selenium Chrome 驱动程序的自动关闭操作?

http - selenium 网格和节点 URL 可以安全使用吗?

java - BigDecimal 到 double 的转换

java - 为什么 RadioButton 的 onCheckedChanged() 在 android 中没有被提升?

java - 如何使用最新的 SDK 启动 Azure VM 异步

javascript - Selenium 测试未正确失败 - 通过但配置失败而不是 "proper"失败

java - Selenium 网络驱动程序 : Unable to access elements of a drop down list (un-ordered list)

selenium - 如何在日志中打印作为 TestNG 中一组的一部分运行的测试数?