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