Selenium2 Webdriver C #. Список щелчка () - исключение устаревшей ссылки - PullRequest
2 голосов
/ 19 сентября 2011

Мне нужна помощь, потому что я продолжаю получать ссылку StaleElementReference, когда пытаюсь проанализировать список тегов для щелчка.

То, что я сделал, находится на земле страницы, я перебираю страницу и генерирую список объектов<> со всеми тегами a

    private List<IWebElement> _pageLinks;
    public List<IWebElement> pageLinks
    {
        get
        {
            if (_pageLinks == null)
            {
                _pageLinks = InfoDriver.FindElements(By.TagName("a")).ToList();
            }
            return _pageLinks;
        }
    }

Затем я хочу проанализировать этот список и щелкнуть по каждому из них, а затем вернуться на страницу, на которую ссылались.

    private static SeleniumInformation si = new SeleniumInformation(ffDriver);

        si.pageLinks.ForEach(i =>
        {
            i.Click();
            System.Threading.Thread.Sleep(1000);
            ffDriver.Navigate().Back();
        });

Происходит следующее: после первого щелчка он переходит на новую страницу, а затем возвращается на начальную страницу, но не может получить следующую ссылку.Я попытался установить его для статического элемента, установить вспомогательное поле так, чтобы он проверял, есть ли там данные, но кажется, что при щелчке IwebElement теряет список и не перестраивает список, так что я получаюисключение StaleElementReference не обработано и элемент не найден в кэше.

Это ошибка в Selenium с классом IWebElement или я что-то не так делаю?Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 27 сентября 2011
    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();
    }
1 голос
/ 24 сентября 2011

Это ожидаемое поведение.Вы покинули страницу, на которой был элемент.Когда вы вернулись назад, это новая страница, и этого элемента больше нет на ней.

Чтобы обойти это, я бы предложил вместо этого обойтись Bys, если вы можете.Предполагая, что все ваши якорные ссылки имеют уникальные ссылки, вы могли бы вместо этого создать список следующим образом (код Java, но следует перевести на c #):

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

Я не знаю структуру вашей страницы, поэтому я неНе знаю, возможно ли динамически генерировать By, чтобы однозначно идентифицировать элементы, которые вы хотите.Например, если все элементы имеют одного и того же родителя, вы можете использовать селектор уровня 3 css nth-child (n).Надеюсь, вы получите некоторые идеи из приведенного выше кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...