如何检查c#Selenium驱动程序中是否存在Element

所以我使用Firefox selenium webdriers获得了这个c#winform。

基本上我需要它来检查一个元素是否存在以及它是否没有点击另一个元素。 如果有video,则在观看后会变为W_VIEWED

这是我到目前为止所得到的

driver.FindElement(By.XPath("//div[@class='video']/a")).Click(); else { driver.FindElement(By.XPath("//div[@class='W_VIEWED']/a")).Click(); } 

错误3只有赋值,调用,递增,递减,等待和新对象表达式才能用作语句242

一种新的c#selenium。 谢谢你的帮助。

您可以检查元素退出或不使用

 bool isElementDisplayed = driver.findElement(By.xpath("element")).isDisplayed() 

请记住,如果findElement找不到元素,则抛出exception,因此您需要正确处理它。

在我的一个应用程序中,我通过检查单独函数中的元素来处理exception,

  private bool IsElementPresent(By by) { try { driver.FindElement(by); return true; } catch (NoSuchElementException) { return false; } } 

通话function,

  if (IsElementPresent(By.Id("element name"))) { //do if exists } else { //do if does not exists } 

您可以使用带有“s”的FindElements来确定它是否存在,因为FindElement会导致exception。 如果FindElements未返回元素,则返回空列表。

 List elementList = new List(); elementList.AddRange(driver.FindElements(By.XPath("//input[@att='something']"))); if(elementList.Count > 0) { //If the count is greater than 0 your element exists. elementList[0].Click(); } 

所以我最近想出了另一种方法,它更快。 如果您的元素具有唯一ID或某个属性,该属性不存在于页面上的其他位置,则可以检查PageSource。

 driver.PageSource.Contains("UniqueID"); 

它会检查页面以查看是否存在ID或其他唯一文本。 这种情况几乎是瞬间发生的,而不是使用需要约20秒的Try / Catch语句。 FindElements也需要很长时间才能运行。

这就是我使用的。 “verify”方法将根据元素是否存在返回true或false。 名为“testfunc”的方法是输入元素名称的位置。 在这个例子中,我希望看看页面上是否显示“英语”。 此外,我在上面的评论中注意到,人们说他们必须等待10秒+才能使捕获工作。 尝试删除代码中的显式等待以使catch立即生效。

 static public bool verify(string elementName) { try { bool isElementDisplayed = driver.FindElement(By.XPath(elementName)).Displayed; return true; } catch { return false; } return false; } static void testfunc() { bool test = verify("//option[contains(.,'English')]"); Console.WriteLine(test); } 

我用了一段时间接受了答案的解决方案,但是我需要一种更快速的方法来检查,而不是每次检查失败时都等待超时时间。 所以我做了一些扩展函数,它们可以在IWebElement和IWebDriver上运行,检查是否存在标记或类。 请原谅代码块开头和结尾的格式不一致。 SO的编辑不合作; P

 public static class ExtensionMethods { public static bool ContainsTag(this IWebElement element, string tagName) { string elementText = element.GetAttribute("innerHTML"); return CheckStringForTag(elementText, tagName); } public static bool ContainsClass(this IWebElement element, string className) { string elementText = element.GetAttribute("innerHTML"); return CheckStringForClass(elementText, className); } public static bool ContainsTag(this IWebDriver driver, string tagName) { return CheckStringForTag(driver.PageSource, tagName); } public static bool ContainsClass(this IWebDriver driver, string className) { return CheckStringForClass(driver.PageSource, className); } private static bool CheckStringForTag(string text, string tagName) { if (!string.IsNullOrWhiteSpace(text)) { return text.Contains("<" + tagName + ">") || text.Contains("") || text.Contains("<" + tagName + " "); } return false; } private static bool CheckStringForClass(string text, string className) { if (!string.IsNullOrWhiteSpace(text)) { string pattern = string.Format(".*class[\\s]?=[\\s]?.*[\\s'\"]{0}[\\s'\"].*.*", className); Match m = Regex.Match(text, className, RegexOptions.IgnoreCase); return m.Success; } return false; } public static string InnerHTML(this IWebElement element) { return element.GetAttribute("innerHTML"); }} 

注意:这与Dominic Giallombardo的答案类似,但有所扩展。

Dominic Giallombardo的回答对我有用。 在基于ajax的信息上加载backgrownd,需要循环来等待元素出现。 因此,如果您想等待并在元素apper时执行操作,则可以使用lable和goto lable + else条件。 这是修改后的代码,它将等待元素通过循环出现:

  checksomeelement: List elementList = new List(); elementList.AddRange(driver.FindElements(By.XPath("//div[@class='video']/a"))); if (elementList.Count > 0) { elementList[0].Click(); } else { System.Threading.Thread.Sleep(2000); goto checksomeelement; }