2017-02-15 91 views
-1
 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(); 
      } 
     } 

我可以让程序运行正常第一次,但它使用了在尝试结束后,要到下一个页面,我得到的StaleElementReferenceException在第一次尝试中几乎立即在starRating上发生错误。我尝试了所有我能想到的,但不知道为什么它会抛出我的错误。循环没有找到元素

回答

0

当DOM刷新或更改时,驱动程序会丢失先前所在的所有元素。移至新页面myEles后无效,因此当您尝试使用它来定位另一个元素时,您在business上获得StaleElementReferenceException。解决的办法是找到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(); 
} 
+0

不知道为什么,但是这并没有工作,它并没有给我一个不同的值,每个元素和我仍然得到陈旧错误时我去下一页。 –

+0

@JustinKowalsky你可以发布你的新代码吗?你究竟在哪里得到例外? – Guy

+0

不确定如何正确发布代码,所以继承了粘贴bin。 http://pastebin.com/jJk1hWCw当我运行代码时,它第一次运行良好。然后到达第88行,点击下一个按钮,然后返回到顶部,在那里我立即捕获StaleElementReferenceException,然后它会一遍又一遍地重复错误,但是需要继续并转到下一页。 –