【问题标题】:I am getting this error "stale element reference: element is not attached to the page document",我收到此错误“过时的元素引用:元素未附加到页面文档”,
【发布时间】:2022-01-25 15:15:40
【问题描述】:

我正在尝试将多个产品添加到购物车中

WebElement ele = driver.findElement(By.xpath("//li[text()='Grocery ']"));

//Creating object of an Actions class
Actions action = new Actions(driver);

//Performing the mouse hover action on the target element.
action.moveToElement(ele).perform();
Thread.sleep(3000);
driver.findElement(By.xpath("//li[@title='staples']")).click();
               
Thread.sleep(5000);
              
List<WebElement> products = driver.findElements(By.xpath("//div[@class='product-grid-img']"));
              
for(int i=0;i<products.size();i++)
{
                
    products.get(i).click();
    Thread.sleep(3000);
    driver.findElement(By.xpath("(//span[text()='ADD TO CART'])[1]")).click();
    driver.navigate().back();
    driver.navigate().refresh();
}

【问题讨论】:

    标签: java selenium


    【解决方案1】:

    正如我们所见,通过单击产品会打开一个新页面,因此要返回,您需要明确导航到前一页面并刷新页面。
    当您离开原始页面或刷新它时,Selenium 在该页面上收集的元素变得不再相关 AKA Stale。
    您可以阅读here 或任何其他有关此问题的在线资源。
    要使您的代码正常工作,您必须重新获得该产品。
    这样的事情应该可以工作:

    List<WebElement> products = driver.findElements(By.xpath("//div[@class='product-grid-img']"));
                  
    for(int i=0;i<products.size();i++)
    {                
        List<WebElement> products = driver.findElements(By.xpath("//div[@class='product-grid-img']"));
    
        products.get(i).click();
        Thread.sleep(3000);
        driver.findElement(By.xpath("(//span[text()='ADD TO CART'])[1]")).click();
        driver.navigate().back();
        driver.navigate().refresh();
        Thread.sleep(3000);
    }
    

    【讨论】:

      【解决方案2】:

      每次您导航到任何地方时,您的浏览器都会在内存中构建一个页面类型的地图。这称为DOM。当您在其他地方导航时,DOM 会被新页面的新 DOM 替换。浏览器不会保留您访问过的 DOM 的历史记录,因此当您导航回您已经去过的某个地方时,浏览器必须再次构建 DOM。

      让我们看看你代码的相关部分:

      List<WebElement> products = driver.findElements(By.xpath("//div[@class='product-grid-img']"));
      

      在当前 DOM 中找到一堆元素。

      for(int i=0;i<products.size();i++)
      {
          products.get(i).click();
      

      第一次导航到另一个页面。所以丢弃你刚才在上面找到的所有元素并重建 DOM。

      第二次循环,您尝试使用 current DOM 中不再存在的元素。这会引发 StaleElementException。

          Thread.sleep(3000);
          driver.findElement(By.xpath("(//span[text()='ADD TO CART'])[1]")).click();
          driver.navigate().back();
      

      再次导航到某个地方。 DOM 的另一次重建。

          driver.navigate().refresh();
      

      不会有帮助的。

      }
      

      您需要重新构建循环以每次都找到该元素。也许是这样的:

      for(int i=0;i<products.size();i++)
      {
          // You will have to find the correct XPath here!
          WebElement product = driver.findElement(By.xpath("//div[@class='product-grid-img'][" + i + "]"));
          product.click();
          Thread.sleep(3000);   // You might want to use a proper wait here.
          driver.findElement(By.xpath("(//span[text()='ADD TO CART'])[1]")).click();
          driver.navigate().back();
      }
      

      【讨论】:

        【解决方案3】:

        StaleElementExceptions 是由转到新页面并访问不再有效的旧元素引起的。

        您可以做其他人所做的事情并重新获取这些值,或者如果它在 a 标签中,您可以只收集所有的 href,然后只需 driver.get() 给他们,就不需要 driver.navigate().back() ;

        .getAttribute("href")
        

        【讨论】:

          【解决方案4】:

          我刚刚在 Google 中搜索了您的查询以进行检查,以了解更多有关问题和主题的详细信息, 我明白了:

          “人们也问”

          (Q)如何修复过时的元素引用元素未附加到 selenium 中的页面文档?

          解决方案:没有找到 DOM 中的元素,因为 Selenium 搜索该元素时您的页面没有完全加载。为了解决这个问题,你可以设置一个明确的等待条件,告诉 Selenium 等待,直到元素可以被点击。

          https://www.google.com/search?q=his+error+%22stale+element+reference%3A+element+is+not+attached+to+the+page+document%22%2C&sourceid=chrome&ie=UTF-8

          【讨论】:

          • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
          猜你喜欢
          • 2023-03-24
          • 1970-01-01
          • 1970-01-01
          • 2021-12-15
          • 2021-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多