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

如何克服状态元素引用异常

万俟玉书
2023-03-14

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

  1. 启动https://www.flipkart.com

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

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

HTML代码

Mi按钮点击-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”组织中出现异常。openqa。硒。StaleElementReferenceException:stale element reference:element未附加到页面文档(会话信息:chrome=89.0.4389.90)有关此错误的文档,请访问:https://www.seleniumhq.org/exceptions/stale_element_reference.html

共有1个答案

万俟玉书
2023-03-14

你永远找不到元素,然后立即尝试点击它们。当页面加载时,会创建元素,但几毫秒后,它们会更改属性、大小和/或位置。这个异常意味着你找到了元素,但现在你“丢失”了它。

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

  WebDriverWait wait = new WebDriverWait(driver, 20, 10);        
  wait.until(ExpectedConditions.elementToBeClickable
  (By.id("elementID")));
 类似资料:
  • 嗨,我是硒的新手 我正在使用,已经尝试了和驱动程序。 我正在运行一个循环。有趣的是,循环有时会工作3、2次,它并不总是在同一次迭代中失败。我假设它与某种竞争条件有关(例如等待页面加载)。如果我在调试模式下运行,它似乎可以完美地工作。 我已经尝试了其他答案的建议,比如显式等待和隐式等待,但仍然没有帮助。也许如果你看到密码你可以帮我一把。 这是一个循环。 解决方案 解决方案是彻底破解。我仍然不明白,但

  • 我正在使用for循环来处理表元素。在第一次迭代中,它将在页面上搜索所需的元素。如果该元素在该页面上不可用,那么它将在第二个页面上搜索。如果元素在第一个页面上可用,Webdriver会成功地找到该元素,但如果元素在第一个页面上不可用,则它会在第二个页面上查找该元素。但在这里,for循环失败,出现称为“stale Element exception”的异常。 错误消息: 线程“main”org.ope

  • 问题内容: 我在Selenium 2 Web驱动程序测试中具有以下代码,该代码在调试时有效,但是在构建中运行它时,大多数情况下会失败。我知道这一定与未刷新页面的方式有关,但不知道如何解决它,因此,任何有关我做错事情的指针都应该受到赞赏。我正在使用JSF primefaces作为我的Web应用程序框架。当我单击添加新链接时,会出现一个弹出对话框,其中包含一个输入框,我可以在其中输入日期,然后单击“保

  • 我读过一些在线文章,它们都指向一个方向,即当页面加载元素时,找不到元素。在my setData()中,您可以看到我尝试了一些方法,例如使用wait、implicitwait和第一次单击然后发送用户名。然而,一切似乎都不起作用。我还想过在pageProperties中使用“wait”,但后来改变了主意,因为这可能是一个糟糕的设计。 错误: 系统信息:Windows 10,ChromeDriver 2

  • 在使用Python进行测试驱动开发时,我目前在迁移后立即运行功能测试时遇到了“StaleElementReferenceException”。以下是错误的全文: 以下是测试: 如何配置测试以防止出现这种情况?Selenium自己的页面表示,页面刷新时可能会出现此问题,但这是应用程序逻辑的一个必要部分,因为到目前为止,它已经配置好了。