C# SeleniumWebDriver。读前一行

C# SeleniumWebDriver。读前一行,c#,selenium,C#,Selenium,尝试使用selenium webdriver和C#为我们的项目自动化一些测试,我遇到了以下情况: 当我尝试测试主菜单时,流程如下所示: 单击第一个菜单项(位于页面顶部) 等待页面中的最后一个元素加载,这样我就可以确保内容已完全加载(有时加载整个页面需要15-20秒) 断言位于主菜单下div中的标题文本 单击下一个菜单项并继续类似的流程 现在我的问题是,在加载页面并且测试必须断言标题文本(3)之后,我遇到了崩溃。我理解之所以会发生这种情况,是因为C#只读取内容一次,一旦读取内容就无法返回到上一个元

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

  • 单击第一个菜单项(位于页面顶部)
  • 等待页面中的最后一个元素加载,这样我就可以确保内容已完全加载(有时加载整个页面需要15-20秒)
  • 断言位于主菜单下div中的标题文本
  • 单击下一个菜单项并继续类似的流程
  • 现在我的问题是,在加载页面并且测试必须断言标题文本(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即将执行assert时(变量第一次被调用的地方),它会崩溃,并出现以下错误:

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


    知道我做错了什么吗?该如何继续?

    我的猜测是,当从body元素查找项目时,您的路径不能从根开始。因此,在断言中,您应该具有以下内容:

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

    在这里,起始点表示您的body元素。

    这并不能直接回答您的问题,但是除了使用11个嵌套div的xpath之外,您真的不能识别元素吗?也许是身份证?上课?名称?首先,无论如何,这不是编写xpath的好方法。我不确定你的html是什么样子。该问题可能特定于选择器。用html snippet
    C#提供更多信息,它只读取内容一次,一旦读取内容就不能返回到上一个元素。
    那么,您遇到了什么问题使您认为这是错误的(顺便说一句)?您已经向我们展示了您为克服该问题所做的努力,但没有展示您最初收到的异常和错误消息。@JoriO,如果所有div都有类、名称或id,但它们没有,我会这样做,因此我必须检查整个嵌套。幸运的是,firebug只需简单的右键单击,就可以正确地找到整个路径。@Arran-我的说法错了吗?当测试在等待加载最后一个div之后无法点击页面顶部的按钮时,我得出了这个结论。我得到的错误是“缓存中找不到元素”,您是指其他内容吗?谢谢,但这并没有解决我的问题。我之前没有提到的一点是(虽然它不是那么相关)发布的内容位于一个框架内。所以一个可行的解决方案是切换到默认内容,然后返回到iframe,就在断言行之前。使用一个标记变量,我可以随时调用它,只要我想回到顶部,它会非常有用