Selenium WebDriver - 无法找到元素异常

时间:2017-09-16 10:45:17

标签: c# selenium selenium-webdriver selenium-chromedriver

我正在尝试使用webdriver从网站上获取一些分数。我到目前为止尝试了XPath,CSS,Classname但是,有时它位于项目中,有时它没有。

这是我一直试图接受的HTML代码:



<td class="score" rowspan="6"><span class="p1_home">0</span> - <span class="p1_away">0</span></td>
&#13;
&#13;
&#13;

这是我的代码(我到目前为止尝试过):

firstHalf[i] = Driver.FindElement(By.XPath("//*[@id=\"parts\"]/tbody/tr[2]/td[2]")).Text;

其他版本:

 firstHalf[i] = Driver.FindElement(By.CssSelector("#parts > tbody > tr:nth-child(2) > td.score")).Text;
 firstHalf[i] = Driver.FindElement(By.ClassName("score")).Text;

而且我也尝试了子类(在得分类下),但结果是一样的,有时候可以找到元素,有时却不能。

有什么建议吗?

更新:对于我的代码,我放了一些waitThread.Sleep仍然无效。

for (int r = 0; r < 10; r++)
                {
                    try
                    {
                        string d1 = Driver.FindElement(By.XPath("//span[@class='p1_home']")).Text;
                        string d2 = Driver.FindElement(By.XPath("//span[@class='p1_away']")).Text;
                        //firstHalf[i] = firstHalf[i].Replace(" ", "");
                        firstHalf[i] = d1 + "-" + d2;
                        break;
                    }
                    catch (Exception e)
                    {
                        Thread.Sleep(300);
                        r -= 1;
                        eventCounter++;
                        if (eventCounter == 10)
                        {
                            errorMsg.sendErrMsg(e);
                            //errorMsg.stopProgram();
                        }
                    }
                }

3 个答案:

答案 0 :(得分:1)

您可以使用

//span[@class='p1_home']

//span[@class='p1_away']

答案 1 :(得分:1)

要定位特定类和属性的元素,可以使用CSS选择器。例如:

Driver.FindElement(By.CssSelector(".score[rowspan='6']")).Text;

如果您无法可靠地定位元素,您可能希望在满足某些条件后获取它,如下所示:

WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(30));
IWebElement element = wait.Until(ExpectedConditions.ElementIsVisible(By.CssSelector(".score[rowspan='6']")));

答案 2 :(得分:0)

好的,我找到了一种采用不同方法的解决方案。我使用父类score而不是获得两个特定的类。此外,我删除了&#34; for循环&#34; &#34;尝试&#34; &#34; catch&#34; < / strong>我用来一次又一次地找到对象。

在我的主循环中,我添加了&#34;尝试&#34; &#34;抓住&#34; 。当我得到异常时,我减少了循环计数器,关闭了窗口并再次打开。另外,我添加了一些Thread.Sleep以免出错,因为网络驱动程序行动太快会导致问题。

我的代码的更新版本:

for (int i = 0;; i < stopLimit.Count; i++)
{
     try
     {
          Thread.Sleep(500);
          string score = Driver.FindElementByCssSelector("#parts > tbody > 
                                                   tr:nth-child(2) > td.score").Text;
          firstHalf[i] = score.Replace(" ", "");
     }
     catch(Exception)  
     {
          i--;
          Thread.Sleep(1500);
          Driver.SwitchTo().Window(Driver.WindowHandles.Last());
          Driver.Close();
          Driver.SwitchTo().Window(Driver.WindowHandles.First());
     }
}