Selenium2 Webdriver C#。单击()列表-过时引用异常
我需要一些帮助,因为当我试图解析要单击的标记列表时,我总是得到一个StaleElementReference 我所做的是在PageLand上迭代页面,生成一个包含所有a标记的对象列表Selenium2 Webdriver C#。单击()列表-过时引用异常,c#,selenium-webdriver,C#,Selenium Webdriver,我需要一些帮助,因为当我试图解析要单击的标记列表时,我总是得到一个StaleElementReference 我所做的是在PageLand上迭代页面,生成一个包含所有a标记的对象列表 private List<IWebElement> _pageLinks; public List<IWebElement> pageLinks { get { if (_pageLinks == null)
private List<IWebElement> _pageLinks;
public List<IWebElement> pageLinks
{
get
{
if (_pageLinks == null)
{
_pageLinks = InfoDriver.FindElements(By.TagName("a")).ToList();
}
return _pageLinks;
}
}
发生的情况是,在第一次单击后,它进入新页面,然后返回起始页面,但无法获得下一个链接。我尝试将其设置为静态元素,设置一个备份字段,以便它检查是否已经存在数据,但似乎单击IwebElement会松开列表,并且也不会重建列表,因此我得到一个StaleElementReference异常未处理,且缓存中未找到元素
这是Selenium中IWebElement类的错误还是我做错了什么?任何帮助都将不胜感激。这是预期的行为。您离开了元素所在的页面。当您向后导航时,它是一个新页面,并且该元素不再位于该页面上 为了解决这个问题,如果可以的话,我建议你绕道而行。假设您的AnchorLink都有唯一的HREF,您可以生成如下列表(java代码,但应转换为c#):
私有静态列表getLinks(WebDriver驱动程序)
{
List anchorLinkBys=new ArrayList();
列表元素=driver.findElements(按.tagName(“a”));
for(WebElement e:elements)
{
add(By.cssSelector(“a[href=\”“+e.getAttribute(“href”)+“\”“]”);
//还可以使用另一个属性,如id。
}
返回锚地;
}
我不知道你的页面的组成,所以我不知道是否有可能动态生成唯一标识你想要的元素的By。例如,如果所有元素都具有相同的父元素,则可以使用css级别3选择器第n个子元素(n)。希望您能从上述代码中获得一些想法。private void YourTest()
private void YourTest()
{
IWebDriver browserDriver = new FirefoxDriver();
browserDriver.Navigate().GoToUrl(pageUrl);
int linkCount= browserDriver.FindElements(By.TagName("a")).Count;
for (int i = 0; i <= linkCount-1; i++ )
{
List<IWebElement> linksToClick = browserDriver.FindElements(By.TagName("a")).ToList();
linksToClick[i].Click();
System.Threading.Thread.Sleep(4000);
if(some boolean check)
{
//Do something here for validation
}
browserDriver.Navigate().Back();
}
broswerDriver.Quit();
}
{
IWebDriver browserDriver=新的FirefoxDriver();
browserDriver.Navigate().GoToUrl(页面URL);
int linkCount=browserDriver.FindElements(按.TagName(“a”)).Count;
对于(int i=0;很遗憾,这是问题的一部分。可能存在重复的HREF、重复的标记文本,在某些情况下元素上没有ID。我所做的概念是将整个站点的每个页面存储在一个列表中,然后为每个页面存储一个链接列表。然后测试每个链接以验证功能是否正确。i必须使用IList而不是List。
private static List<By> getLinks(WebDriver driver)
{
List<By> anchorLinkBys = new ArrayList<By>();
List<WebElement> elements = driver.findElements(By.tagName("a"));
for(WebElement e : elements)
{
anchorLinkBys.add(By.cssSelector("a[href=\"" + e.getAttribute("href") + "\"]"));
//could also use another attribute such as id.
}
return anchorLinkBys;
}
private void YourTest()
{
IWebDriver browserDriver = new FirefoxDriver();
browserDriver.Navigate().GoToUrl(pageUrl);
int linkCount= browserDriver.FindElements(By.TagName("a")).Count;
for (int i = 0; i <= linkCount-1; i++ )
{
List<IWebElement> linksToClick = browserDriver.FindElements(By.TagName("a")).ToList();
linksToClick[i].Click();
System.Threading.Thread.Sleep(4000);
if(some boolean check)
{
//Do something here for validation
}
browserDriver.Navigate().Back();
}
broswerDriver.Quit();
}