转到新页面后循环找不到元素.StaleElementReferenceException

时间:2017-02-15 18:12:24

标签: c# selenium

        List<IWebElement> shittyBiz = new List<IWebElement>();
        var myEles = driverGC.FindElements(By.CssSelector("div.search-result"));
        for (int i = 0;i<=1000;i++){
            myEles = driverGC.FindElements(By.CssSelector("div.search-result"));
            foreach (IWebElement business in myEles)
            {
                driverGC.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
                var starRating = " ";
                try
                {
                    starRating = business.FindElement(By.CssSelector("div.biz-rating > div.i-stars")).GetAttribute("title");
                }
                catch (OpenQA.Selenium.NoSuchElementException)
                {
                    MessageBox.Show("No stars");
                    continue;
                }
                starRating = Regex.Replace(starRating, @"[A-Za-z\s]", string.Empty);
                float stars = float.Parse(starRating);
                MessageBox.Show(stars.ToString());

                if (stars <= 3)
                {
                    //shittyBiz.Add(starRating);
                    MessageBox.Show("Shitty");
                    driverGC.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5));
                    var bizName = business.FindElement(By.CssSelector(".biz-name"));
                    MessageBox.Show(bizName.Text);
                    shittyBiz.Add(bizName);
                    var bizLocation = business.FindElement(By.CssSelector(".secondary-attributes"));
                    MessageBox.Show(bizLocation.Text);
                    shittyBiz.Add(bizLocation);
                }
                else
                {
                    driverGC.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5));
                    MessageBox.Show("Too good");
                }

            }
            try
            {
                driverGC.FindElement(By.CssSelector("div.arrange_unit > a.u-decoration-none")).Click();
                continue;
            }
            catch (OpenQA.Selenium.NoSuchElementException)
            {
                MessageBox.Show("No more pages");
                return;
                //driverGC.Quit();
            }
        }

我可以让程序第一次运行正常,但在最后使用try之后,转到下一页,我在第一次尝试时几乎立即在starRating上得到StaleElementReferenceException错误。我已经尝试了所有我能想到的东西,但不确定为什么它会让我犯这个错误。

1 个答案:

答案 0 :(得分:0)

当刷新或更改DOM时,驱动程序会丢失之前定位的所有元素。移至新页面后myEles无效,这就是当您尝试使用StaleElementReferenceException查找其他元素时business myEles的原因。解决方案是定位for每次迭代并使用带int size = 1; for (int i = 0; i < size; ++i) { var myEles = driverGC.FindElements(By.CssSelector("div.search-result")); size = myEles.Count(); driverGC.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10)); var starRating = " "; try { starRating = myEles[i].FindElement(By.CssSelector("div.biz-rating > div.i-stars")).GetAttribute("title"); } //... // and don't forget to go back driver.Navigate().Back(); } 循环的索引保留位置

mix.combine(['resources/libs/jquery/dist/jquery.min.js', 'resources/libs/semantic/dist/semantic.js'], 'public/js/vendor.js')
.combine(['resources/libs/semantic/dist/semantic.min.css', 'resources/libs/font-awesome/css/font-awesome.min.css'], 'public/css/vendor.css')
.js('resources/assets/js/scripts/login.validator.js', 'public/js/scripts.js')
.less('resources/assets/less/style.less', 'public/css');
相关问题