Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium2 Webdriver C#。单击()列表-过时引用异常_C#_Selenium Webdriver - Fatal编程技术网

Selenium2 Webdriver C#。单击()列表-过时引用异常

Selenium2 Webdriver C#。单击()列表-过时引用异常,c#,selenium-webdriver,C#,Selenium Webdriver,我需要一些帮助,因为当我试图解析要单击的标记列表时,我总是得到一个StaleElementReference 我所做的是在PageLand上迭代页面,生成一个包含所有a标记的对象列表 private List<IWebElement> _pageLinks; public List<IWebElement> pageLinks { get { if (_pageLinks == null)

我需要一些帮助,因为当我试图解析要单击的标记列表时,我总是得到一个StaleElementReference

我所做的是在PageLand上迭代页面,生成一个包含所有a标记的对象列表

    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();
    }