C# Selenium WebDriver-找不到元素异常

C# Selenium WebDriver-找不到元素异常,c#,selenium,selenium-webdriver,selenium-chromedriver,C#,Selenium,Selenium Webdriver,Selenium Chromedriver,我试图在使用webdriver时从网站上获取一些分数。到目前为止,我尝试了XPath、CSS、Classname,但有时它位于项中,有时则不位于项中 这是我一直试图获取的HTML代码: 0-0您可以使用 //span[@class='p1_home'] //span[@class='p1_away'] 你可以用 //span[@class='p1_home'] //span[@class='p1_away'] 要定位特定类和属性的元素,可以使用CSS选择器。例如: Driver.Fin

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

这是我一直试图获取的HTML代码:

0-0
您可以使用

//span[@class='p1_home']

//span[@class='p1_away']
你可以用

//span[@class='p1_home']

//span[@class='p1_away']

要定位特定类和属性的元素,可以使用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']")));

要定位特定类和属性的元素,可以使用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']")));

好吧,我找到了一个不同的解决方法。我没有得到两个特定的类,而是使用父类
score
。此外,我还删除了“for循环”“try”“catch”,我正在使用它们一次又一次地查找对象

在我的主循环中,我添加了“try”“catch”。当我得到异常时,我减少了循环计数器,关闭窗口并再次打开。此外,我还添加了一些
Thread.Sleep
,以避免出错,因为Web驱动程序的运行速度太快,这会导致问题

我的代码的更新版本:

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());
     }
}
for(int i=0;itbody>
tr:nth child(2)>td.score”).Text;
上半场[i]=得分。替换(“,”);
}
捕获(例外)
{
我--;
睡眠(1500);
Driver.SwitchTo().Window(Driver.WindowHandles.Last());
Driver.Close();
Driver.SwitchTo().Window(Driver.WindowHandles.First());
}
}

好的,我找到了一个不同方法的解决方案。我没有得到两个特定的类,而是使用父类
score
。此外,我还删除了“for循环”“try”“catch”,我正在使用它们一次又一次地查找对象

在我的主循环中,我添加了“try”“catch”。当我得到异常时,我减少了循环计数器,关闭窗口并再次打开。此外,我还添加了一些
Thread.Sleep
,以避免出错,因为Web驱动程序的运行速度太快,这会导致问题

我的代码的更新版本:

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());
     }
}
for(int i=0;itbody>
tr:nth child(2)>td.score”).Text;
上半场[i]=得分。替换(“,”);
}
捕获(例外)
{
我--;
睡眠(1500);
Driver.SwitchTo().Window(Driver.WindowHandles.Last());
Driver.Close();
Driver.SwitchTo().Window(Driver.WindowHandles.First());
}
}


您要选择哪个元素locate@iamsankalp89我想找到class
score
或子类,它们是
p1_home
p1_away
//span[@class='p1_home']和//span[@class='p1_away']你最好使用ExpectedConditions类而不是睡觉。在这种情况下,webdriver将每隔0.5秒检查一次是否加载了元素,并在元素出现时立即获取它。您使用的页面似乎有一些修改html的js。如何等待页面加载这种类型的内容当然是自动化/测试开发人员讨论的一个问题。您想要哪个元素locate@iamsankalp89我想找到class
score
或子类,它们是
p1_home
p1_away
//span[@class='p1_home']和//span[@class='p1_away']你最好使用ExpectedConditions类而不是睡眠。在这种情况下,webdriver将每隔0.5秒检查一次是否加载了元素,并在元素出现时立即获取它。您使用的页面似乎有一些修改html的js。如何等待页面加载这种类型的内容肯定是自动化/测试开发人员讨论的一个问题。我现在正在尝试编写,我将测试程序是否崩溃或失败,并让我知道发生了什么Kay,我尝试过。在第一次运行时,它工作得很好,但在第二次运行时,它崩溃了。请稍等,然后尝试我现在正在尝试编写,我将测试程序是否崩溃,然后让我知道发生了什么。凯,我尝试了。在第一次运行时,它工作得很好,但在第二次运行时,它崩溃了。请等待,然后尝试测试其他解决方案。我会让你知道是否工作或不添加替代选项,以解决可能的加载时间问题。我正在测试其他解决方案。我会让你知道是否工作或不添加替代选项,以解决可能的加载时间问题。