Selenium webdriver。阅读较早的一行

时间:2014-10-10 11:06:31

标签: c# selenium

尝试使用selenium webdriver和C#自动化我们项目的几个测试,我遇到了以下情况: 当我尝试测试主菜单时,流程如下:

  1. 点击第一个菜单项(位于页面顶部)
  2. 等待页面中的最后一个元素加载,这样我就可以确保内容已满载(有时整页加载需要15-20秒)
  3. 断言位于主菜单下的div中的标题文字
  4. 点击下一个菜单项并继续使用类似的流程
  5. 现在我的问题是,在页面加载并且测试必须断言标题文本(3)之后,我得到了崩溃。我知道这种情况正在发生,因为C#只读取一次内容,并且一旦读取它就无法返回到前一个元素。 所以我认为让我解决的解决方案是先在变量中定义body标签,然后调用它进行断言和进一步导航:

    var body = driver.FindElement(By.TagName("body")); 
    
    driver.FindElement(By.XPath("/html/body/div[1]/div/div[2]/div[2]/div[2]")).Click();    // click on the first item in the main menu
    driver.WaitForElement(By.XPath("/html/path_to_the_last/div[1]"));    // waiting for the last element on the page
    Assert.AreEqual("Title text", body.FindElement(By.XPath("/html/body/div[1]/div/div[3]/div[3]/div[1]/div/div[1]/div[1]/div[1]/div[1]/div")).Text.Trim());     // assert the title text by calling the initially set variable
    
    body.FindElement(By.XPath("/html/body/div[1]/div/div[2]/div[2]/div[3]")).Click();   // click on the next item in the main menu.
    // similar flow to follow until each menu was checked
    

    问题是,当webdriver即将执行断言时 - 首先调用变量,它会崩溃并出现以下错误:

      

    OpenQA.Selenium.StaleElementReferenceException:在缓存中找不到元素 - 自查询以来页面可能已更改

    知道我做错了什么,我该怎么办?

1 个答案:

答案 0 :(得分:0)

我的猜测是,当从body-element中查找项目时,您的路径无法从根目录开始。所以在断言中你应该有这个:

body.FindElement(By.XPath("./div[1]/div/div[3]/div[3]/div[1]/div/div[1]/div[1]/div[1]/div[1]/div")

起点是指你的身体元素。