当前位置: 首页 > 知识库问答 >
问题:

遍历WebElements列表时获取StaleElementReessceException

柏正平
2023-03-14

我试图自动化以下场景:

    < li >访问amazon.com < li >搜索耳机 < li >将第一个结果页面中的所有畅销书添加到购物车中

我为编写此场景所遵循的步骤:

    < li >访问amazon.com < li >在搜索字段中输入文本“耳机” < li >单击搜索按钮 < li >单击标记为“畅销书”的链接 < li >单击“添加到购物车”按钮 < li >导航回结果页面 < li >单击另一个标记为“畅销书”的链接 < li >单击“添加到购物车”按钮 < li >导航回结果页面

所有畅销书都有相同的xpath:

//span[.='Best Seller']/../../../../../../../../following-sibling::div/div/following-sibling::div/div/div/div/div/div/h2/a/span

因此,我实现了以下 Web 元素列表:

List<WebElement> bestsellers = driver.findElements(By.xpath("xpath of bestsellers"));

我已经用如下3种方式实现了点击链接并添加到购物车的循环:

for(WebElement product: bestsellers) {
    product.click();
    clickOnAddToCartButton();
    driver.navigate().back();
}



for(int i=0; i<bestsellers.size(); i++) {
        System.out.println(bestsellers.size());
        bestsellers.get(i).click();
        clickOnAddToCartButton();
        driver.navigate().back();

    }



Iterator<WebElement> i = bestsellers.iterator();
    while(i.hasNext()) {
        WebElement product = i.next();
        wait.until(ExpectedConditions.elementToBeClickable(product));

        product.click();
        clickOnAddToCartButton();
        driver.navigate().back();
    }

当我运行脚本时,“畅销书”列表中有3个元素。执行循环时,单击第一个元素并将其添加到购物车,驱动程序导航回结果页面。然后,我使用上述3种方法获取staleElementReferenceException。

更新:我已按如下方式实现了该方案:

for(int i=0; i<bestsellers.size(); i++) {

        System.out.println("Current :" + i);
        wait.until(ExpectedConditions.elementToBeClickable(By.xpath(".//span[.='Best Seller']/../../../../../../../../following-sibling::div/div/following-sibling::div/div/div/div/div/div/h2/a/span")));
        driver.findElements(By.xpath(".//span[.='Best Seller']/../../../../../../../../following-sibling::div/div/following-sibling::div/div/div/div/div/div/h2/a/span")).get(i).click();
        clickOnAddToCartButton();
        //clickOnViewCart();
        try {
            wait.until(ExpectedConditions.elementToBeClickable(cartButton));
        }catch(TimeoutException e) {
            wait.until(ExpectedConditions.elementToBeClickable(viewCartButton));
        }
        if(i==(bestsellers.size()-1)) {
            try {
                wait.until(ExpectedConditions.elementToBeClickable(cartButton));    
                cartButton.click();
                break;
            }catch(TimeoutException e) {
                wait.until(ExpectedConditions.elementToBeClickable(viewCartButton));    
                viewCartButton.click();
                break;
            }
        }

        driver.navigate().back();

共有1个答案

元嘉木
2023-03-14

当您在浏览器中单击元素或back()时,元素引用将在selenium中更新,因此您无法指向具有旧引用并导致StatleElementException的元素。

当您必须遍历多个元素交互时,请考虑这种方法。

List<WebElement> bestsellers = driver.findElements(By.xpath("xpath of bestsellers"));
for(int i=0; i<bestsellers.size(); i++) {
    System.out.println("Current Seller " + i);
    // here you are getting the elements each time you iterate, which will get the
    // latest element references
    driver.findElements(By.xpath("xpath of bestsellers")).get(i).click();
    clickOnAddToCartButton();
    driver.navigate().back();

}
 类似资料:
  • 问题内容: 我想遍历一个webelements列表并从每个元素中返回文本,但是我只从第一个元素而不是从其他标记内的其余元素中获取文本,然后存在存在该循环的代码 这是我要从中提取文本的HTML代码的一部分: 这是Pyhton代码: 问题答案: 一直在我的脸上,这将打印每个元素的文本,很高兴我能发现

  • 输入是一个列表列表。请看下面。文件名是一个列表,包含的名称与列表中的列表数量相同(,,) 每个名称都附加到路径中:-- 程序在遍历列表时遍历包含路径的列表,并打印路径及其文件名。我希望输出是--。然而,我得到了下面的输出。请查看输入后的输出 输入 输出 我希望输出是-- 然而,我得到的结果如下: 我无法理解为什么在遍历列表时不能使用文件名遍历路径列表。我希望这有助于澄清问题。有人能帮忙吗? 我已经

  • 问题内容: 当我执行以下代码时,我得到ConcurrentModificationException 即使我正在使用Collections.synchronizedList,为什么也会出现异常? 当我将myCollection更改为 我没有那个例外。 java.util.concurrent中的ConcurrentLinkedQueue与Collections.synchronizedList有何

  • 问题内容: 我想要一种算法来遍历列表切片。切片大小在功能之外设置,可以不同。 在我看来,这就像: 有没有一种使用python 2.5正确定义的方法或其他方法? edit1:澄清 “分区”和“滑动窗口”这两个术语听起来都适用于我的任务,但是我不是专家。因此,我将更深入地解释该问题并添加到问题中: FatherList是我从文件中获取的一个多级numpy.array。函数必须找到序列的平均值(用户提供

  • 问题内容: 我有两个列表和数字,我想使用相同的指令遍历它们。像这样: 但这感觉多余。我知道我会写,但是要付出一定的时间。 有没有办法做到这一点而又不浪费时间呢? 问题答案: 这可以通过以下方式完成 : 将打印: 根据文档,请执行以下操作: 创建一个迭代器,该迭代器从第一个可迭代对象返回元素,直到耗尽为止,然后继续进行下一个可迭代对象,直到所有可迭代对象都耗尽为止。 如果列表中有列表, 则可用: 产

  • 本文向大家介绍common-lisp 遍历列表,包括了common-lisp 遍历列表的使用技巧和注意事项,需要的朋友参考一下 示例 可以使用~{和~}指令遍历列表。 ~^ 如果没有更多元素了,可以用来转义。 可以使用数字参数~{来限制可以执行的迭代次数: ~@{ 将遍历其余参数,而不是列表: 子列表可以使用~:{以下命令进行迭代: