陈旧元素引用异常 c# Selenium Webdriver

Stale Element Reference Exception c# Selenium Webdriver

我正在使用 C# selenium web 驱动程序来实现可视化中的某些自动化目的 studio.When 我 运行 我的代码有时运行良好,但有时会抛出错误 "Exception has been thrown by the target of an invocation"。当我重新启动我的系统时它工作正常,在多次 runs.It 发生后再次显示错误,同时在 username.The 网页之后输入密码就像用户名,提交按钮,密码,提交按钮登录到 website.Without 给密码,又是点击提交按钮。

发生异常的代码

if (ConfigurationManager.AppSettings["IsEncrypted"].ToLower() =="true")
                {

                    UserName.SendKeys(ConfigurationManager.AppSettings["UserName"]);
                    Submit.Click();
                    Thread.Sleep(2000);
                    Password.SendKeys(Base64Decode(ConfigurationManager.AppSettings["Password"]));
                    Submit.Click();
                }

这是例外

  Exception occured:Exception has been thrown by the target of an invocation.
        Exception occured:Exception has been thrown by the target of an invocation.
        Exception occured System.Reflection.TargetInvocationException: Exception has bee
        n thrown by the target of an invocation. ---> OpenQA.Selenium.StaleElementRefere
        nceException: stale element reference: element is not attached to the page docum
        ent
          (Session info: chrome=58.0.3029.110)
          (Driver info: chromedriver=2.25.426923 (0390b88869384d6eb0d5d09729679f934aab9e
        ed),platform=Windows NT 6.1.7601 SP1 x86_64)
           at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response erro
        rResponse)
           at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecu
        te, Dictionary`2 parameters)
           at OpenQA.Selenium.Remote.RemoteWebElement.Click()
           --- End of inner exception stack trace ---
           at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments,
         Signature sig, Boolean constructor)
           at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Objec
        t[] parameters, Object[] arguments)
           at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invoke
        Attr, Binder binder, Object[] parameters, CultureInfo culture)
           at OpenQA.Selenium.Support.PageObjects.WebDriverObjectProxy.InvokeMethod(IMet
        hodCallMessage msg, Object representedValue)
           at OpenQA.Selenium.Support.PageObjects.WebElementProxy.Invoke(IMessage msg)
           at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgDa
        ta, Int32 type)
           at OpenQA.Selenium.IWebElement.Click()
           at JiraExtract.PageObjects.LoginPage.LoginToApplication() in C:/Program.cs:line 72
           at JiraExtract.Automation.AutomationTest() in c:/Program.cs:line 80
           at JiraExtractor.Program.Main(String[] args) in c:/Program.cs:line 14

我假设您正在使用 PageObject 工厂来初始化您的 Web 元素。

正如您所注意到的,您的第一个 Submit.Click(); 执行时没有任何错误,但是当您输入用户名并尝试再次单击“提交”按钮时,它会抛出一个 Stale Element Exception.

陈旧元素异常发生在:

  • 该元素已被完全删除

  • 元素不再附加到 DOM

在你的情况下,我想你的页面将 Submit 按钮从 DOM 分离并在你输入用户名时重新附加。

解决方法:尝试调用PageFactory.initElements(getDriver(), ClassWhichHasSubmitButton.class);

编辑: 您应该在输入 密码 之后和点击提交按钮 PageFactory.initElements(getDriver(), ClassWhichHasSubmitButton.class);

之前调用它

@Rameshwar 告诉我们 true.Submit 按钮与 DOM 分离。

解决方法: 不要直接点击提交按钮,而是查找直到找到元素再点击。

  {   
   Password.SendKeys(Base64Decode(ConfigurationManager.AppSettings["Password"]));
    Click(By.Id("login-submit"));
   }


 public bool Click(By by)
        {
           bool status = false;
           int i = 0;
           while (i==0) 
           try
           {
             driver.FindElement(by).Click();
             status = true;
             break;
           }
           catch (StaleElementReferenceException e)
           {
           }
           return status;
        }

'Stale element reference error' 当您第一次移动到下一页然后您尝试找出相应的元素时发生。 为避免此错误,您必须首先创建一个新的 Web 元素,然后应用 findElement 方法,因为当您单击当前页面上可用的下一页 link 时 DOM 会发生变化。

整数计数=0;

// **Initial web element**

WebElement element= driver.findElement(By.xpath("//*[@id=\"mainC\"]/h3/a[3]/b"));   

try {
    while (element.isDisplayed()) {             
        Thread.sleep(2000);
        int a1= driver.findElements(By.xpath("//*[@id=\"mainC\"]/ul[1]/li")).size();
        System.out.println(a1);

        element.click();            
        count = a1+count;   

  // **New web element to avoid this error**

    WebElement element1= driver.findElement(By.xpath("//*[@id=\"mainC\"]/h3/a[3]/b"));
    element=element1;           
    }

} catch (Exception e) {

    //e.printStackTrace();
}