首页 > 解决方案 > 如何克服状态元素引用异常

问题描述

我正在尝试自动化以下操作:

  1. 启动https://www.flipkart.com > 单击手机 > 将鼠标悬停在电子设备上,然后单击 Mi。

我在线程“主”状态元素参考中得到期望:元素未附加到 miButton() 方法中的页面文档。

请参阅错误详细信息部分。

HTML 代码

小米按钮点击 - HTML

基类:

public class Base {
    
        static WebDriver driver;
        
        
    public void setupBrowser(String browser, String url) {
        String currDir = System.getProperty("user.dir");
        
        if(browser.equalsIgnoreCase("chrome")) {
            System.setProperty("webdriver.chrome.driver", currDir + "\\drivers\\chromedriver.exe");
            driver = new ChromeDriver();
        }
        else if(browser.equalsIgnoreCase("firefox")) {
            System.setProperty("webdriver.gecko.driver", currDir + "\\drivers\\geckodriver.exe");
            driver = new FirefoxDriver();
        }
        else if(browser.equalsIgnoreCase("edge")) {
            System.setProperty("webdriver.edge.driver", currDir + "\\drivers\\msedgedriver.exe");
            driver = new EdgeDriver();
        }
        else {
            System.out.println("Valid browser not found therefore quitiing");
            System.exit(0);
        }
        
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        
        if(url != "") 
            driver.get(url);
        else
            driver.get("about:blank");          
    }
    
    public void closeBrowser() {
        driver.close();
    }

    

页面类

    public class pagetest extends Base{
    
        Actions action;
    
        public void closebtn() {
            driver.findElement(By.cssSelector("button._2doB4z")).click();  
        }
    
        public void mibutton() {
            WebElement mobiles = driver.findElement(By.xpath("//div[text()='Mobiles']"));  
    
            action = new Actions(driver);
            action.moveToElement(mobiles).click().perform();
    
    
            WebElement electronicsmenu = driver.findElement(By.xpath("//span[text()='Electronics']"));
            action.moveToElement(electronicsmenu).click().perform();
    
            List <WebElement> value = driver.findElements(By.xpath("//div[@class='_1kidPb']/div[@class='_1QrT3s']//a");
            for(WebElement elem:value) {
                if(elem.getText().equals("Mi")) {
                    elem.click();
                }
            }
    
            WebElement label = driver.findElement(By.xpath("//p[text()='Latest from MI : ']"));
            System.out.println("The Label 'Latest from MI' is present : " +label.isEnabled());
        }
    
    public static void main(String[] args) {
            pagetest obj = new pagetest();
            obj.setupBrowser("chrome", "https://www.flipkart.com/");
            obj.closebtn();
            obj.mibutton();
        }
    
    }

错误详情

线程“main” org.openqa.selenium.StaleElementReferenceException 中的异常:过时的元素引用:元素未附加到页面文档(会话信息:chrome=89.0.4389.90)有关此错误的文档,请访问:https://www .seleniumhq.org/exceptions/stale_element_reference.html

标签: javaseleniumselenium-webdriver

解决方案


您永远不会找到元素,然后立即尝试单击它们。当页面加载时,元素被创建,但在几毫秒后它们会改变它们的属性、大小和/或位置。此异常意味着您找到了该元素,但到目前为止您“丢失”了它。

为了避免 StateElementReferecneException 使用 WebDriverWait 对象。您可以等待元素可见/可点击以及其他选项。最好的选择是等待元素可点击:

  WebDriverWait wait = new WebDriverWait(driver, 20, 10);        
  wait.until(ExpectedConditions.elementToBeClickable
  (By.id("elementID")));

推荐阅读