C# 如何在C中使用selenium web驱动程序检查元素不存在#

C# 如何在C中使用selenium web驱动程序检查元素不存在#,c#,selenium-webdriver,C#,Selenium Webdriver,我盯着这个问题看,但找不到更好的答案,所以。。。把它贴在这里 我单击浏览器中的一个按钮,打开一个表单/div(动态生成)。在我按下按钮之前,表单/div元素不存在 现在,我试图检查form/div元素是否存在。我尝试了以下代码。但它在元素存在时工作,在元素不存在时抛出异常(第一个方法-超时,第二个方法,驱动程序停止) 方法1: ReadOnlyCollection<IWebElement> elements = Utility.Browser.FindElements(By.Tag

我盯着这个问题看,但找不到更好的答案,所以。。。把它贴在这里

我单击浏览器中的一个按钮,打开一个表单/div(动态生成)。在我按下按钮之前,表单/div元素不存在

现在,我试图检查form/div元素是否存在。我尝试了以下代码。但它在元素存在时工作,在元素不存在时抛出异常(第一个方法-超时,第二个方法,驱动程序停止)

方法1:

 ReadOnlyCollection<IWebElement> elements = Utility.Browser.FindElements(By.TagName("div")); // Utility.Browser is the browser instance.

 var expElement = from e in elements
                  where e.GetAttribute("id").Contains("element id")
                  select e;

  return expElement.Count() > 0;
任何帮助都将不胜感激


谢谢。

查看WebDriverWait。您可以定义一个等待函数,该函数将等待特定的时间来满足特定的条件。您基本上可以说“等待十秒钟,等待元素出现”。我在我的手机上,确切的语法可能不正确,但它看起来像下面这样

pulic bool ElementExist(IWebDriver driver)
{
 var value = false;

 var objWait = new WebDriverWait(driver, Timespan.FromMilliseconds(10000));
 objWait.IgnoreExceptionTypes(typeof(WebDriverTimeoutException));
 value = objWait.Until(b=>b.FindElements(By.TagName("div")).Count > 0);

 return value;
}

您可以指定要忽略哪些类型的异常,例如ElementNotFound和StaleElement,如果发生这些异常,函数将继续等待。您还可以定义一个函数并将其作为参数传递给.Until函数。我在lamda表达式和内联函数定义方面缺乏技巧,否则我会给出一个更好的示例,但这肯定是最可定制的方法。

查看WebDriverWait。您可以定义一个等待函数,该函数将等待特定的时间来满足特定的条件。您基本上可以说“等待十秒钟,等待元素出现”。我在我的手机上,确切的语法可能不正确,但它看起来像下面这样

pulic bool ElementExist(IWebDriver driver)
{
 var value = false;

 var objWait = new WebDriverWait(driver, Timespan.FromMilliseconds(10000));
 objWait.IgnoreExceptionTypes(typeof(WebDriverTimeoutException));
 value = objWait.Until(b=>b.FindElements(By.TagName("div")).Count > 0);

 return value;
}

您可以指定要忽略哪些类型的异常,例如ElementNotFound和StaleElement,如果发生这些异常,函数将继续等待。您还可以定义一个函数并将其作为参数传递给.Until函数。我在lamda表达式和内联函数定义方面的技能不足,否则我会给出一个更好的示例,但这肯定是最可定制的方法。

以下函数帮助我在C#Selenium代码中测试页面上是否存在元素:

公共静态bool IsElementPresent(此IWebDriver驱动程序,由)
{
返回驱动程序.FindElements(按).Count>0;
}


如果对你有帮助,请告诉我

以下函数帮助我在C#Selenium代码中测试页面上是否存在元素:

公共静态bool IsElementPresent(此IWebDriver驱动程序,由)
{
返回驱动程序.FindElements(按).Count>0;
}


如果对你有帮助,请告诉我

与这里已经给出的另外两个答案类似,我使用一种扩展方法来设计我的测试:

public static bool ElementExists(this IWebDriver driver, By condition, TimeSpan? timeSpan)
{
    bool isElementPresent = false;

    if (timeSpan == null)
    {
        // default to 15 seconds if timespan parameter is not passed in
        timeSpan = TimeSpan.FromMilliseconds(15000);
    }

    var driverWait = new WebDriverWait(driver, (TimeSpan)timeSpan);
    driverWait.IgnoreExceptionTypes(typeof(WebDriverTimeoutException));
    isElementPresent = driverWait.Until(x => x.FindElements(condition).Any());

    return isElementPresent;
}
然后,我在代码中使用以下内容:

var isElementPresent = _driver.ElementExists(By.ClassName("register"), TimeSpan.FromSeconds(90.00));
if (isElementPresent)
{
    // do required processing...
}
希望这有帮助

[编辑]-当然,您可以重构扩展方法以返回所需的元素,如果您想在单个操作中完成所有操作,则默认为null

public static IWebElement FindElementAfterWait(this IWebDriver driver, By condition)
{
    bool isElementPresent = false;
    IWebElement singleElement = null;

    var driverWait = new WebDriverWait(driver, TimeSpan.FromSeconds(90));
    driverWait.IgnoreExceptionTypes(typeof(WebDriverTimeoutException));
    isElementPresent = driverWait.Until(x => x.FindElement(condition) != null);

    if (isElementPresent)
    {
        singleElement = driver.FindElement(condition);
    }

    return singleElement;
}
用法:

_driver.FindElementAfterWait(By.ClassName("register"));
_driver.FindElementAfterWait(ExpectedConditions.ElementIsVisible(By.Id("firstName")))
此外:


享受…

与这里已经给出的其他两个答案类似,我使用一种扩展方法来设计我的测试:

public static bool ElementExists(this IWebDriver driver, By condition, TimeSpan? timeSpan)
{
    bool isElementPresent = false;

    if (timeSpan == null)
    {
        // default to 15 seconds if timespan parameter is not passed in
        timeSpan = TimeSpan.FromMilliseconds(15000);
    }

    var driverWait = new WebDriverWait(driver, (TimeSpan)timeSpan);
    driverWait.IgnoreExceptionTypes(typeof(WebDriverTimeoutException));
    isElementPresent = driverWait.Until(x => x.FindElements(condition).Any());

    return isElementPresent;
}
然后,我在代码中使用以下内容:

var isElementPresent = _driver.ElementExists(By.ClassName("register"), TimeSpan.FromSeconds(90.00));
if (isElementPresent)
{
    // do required processing...
}
希望这有帮助

[编辑]-当然,您可以重构扩展方法以返回所需的元素,如果您想在单个操作中完成所有操作,则默认为null

public static IWebElement FindElementAfterWait(this IWebDriver driver, By condition)
{
    bool isElementPresent = false;
    IWebElement singleElement = null;

    var driverWait = new WebDriverWait(driver, TimeSpan.FromSeconds(90));
    driverWait.IgnoreExceptionTypes(typeof(WebDriverTimeoutException));
    isElementPresent = driverWait.Until(x => x.FindElement(condition) != null);

    if (isElementPresent)
    {
        singleElement = driver.FindElement(condition);
    }

    return singleElement;
}
用法:

_driver.FindElementAfterWait(By.ClassName("register"));
_driver.FindElementAfterWait(ExpectedConditions.ElementIsVisible(By.Id("firstName")))
此外:


享受…

以下方法是我经常使用的方法,相信我真的做到了。 如果显示指定的元素,它将返回
true
,否则它将返回
false
。 您可以像这样使用它:
IsElementDisplayedByXpathVariableWait(“元素的Xpath\u”,5)

5是检查元素是否在每次检查后暂停1秒的次数

public static bool IsElementDisplayedByXpathVariableWait(string xpath, int iterations)
    {
bool returnVal = false;   
        int tracker = 0;
        while (tracker < iterations)
        {
            try
            {
                tracker++;
                IWebElement pageObject = _driver.FindElement(By.XPath(xpath));
                if (pageObject.Displayed)
                {
                    returnVal = true;
                    break;
                }
            }
            catch (Exception e)
            {                   
                Wait(1000);
                continue;
            }
        }           
        return returnVal;
}
公共静态bool IsElementDisplayedByXpathVariableWait(字符串xpath,int迭代)
{
bool returnVal=false;
int-tracker=0;
while(跟踪器<迭代次数)
{
尝试
{
跟踪器++;
IWebElement pageObject=_driver.FindElement(By.XPath(XPath));
如果(pageObject.Displayed)
{
returnVal=true;
打破
}
}
捕获(例外e)
{                   
等待(1000);
继续;
}
}           
返回值;
}

下面的方法是我经常使用的方法,相信我,它真的做到了。 如果显示指定的元素,它将返回
true
,否则它将返回
false
。 您可以像这样使用它:
IsElementDisplayedByXpathVariableWait(“元素的Xpath\u”,5)

5是检查元素是否在每次检查后暂停1秒的次数

public static bool IsElementDisplayedByXpathVariableWait(string xpath, int iterations)
    {
bool returnVal = false;   
        int tracker = 0;
        while (tracker < iterations)
        {
            try
            {
                tracker++;
                IWebElement pageObject = _driver.FindElement(By.XPath(xpath));
                if (pageObject.Displayed)
                {
                    returnVal = true;
                    break;
                }
            }
            catch (Exception e)
            {                   
                Wait(1000);
                continue;
            }
        }           
        return returnVal;
}
公共静态bool IsElementDisplayedByXpathVariableWait(字符串xpath,int迭代)
{
bool returnVal=false;
int-tracker=0;
while(跟踪器<迭代次数)
{
尝试
{
跟踪器++;
IWebElement pageObject=_driver.FindElement(By.XPath(XPath));
如果(pageObject.Displayed)
{
returnVal=true;
打破
}
}
捕获(例外e)
{                   
等待(1000);
继续;
}
}           
返回值;
}

为什么不在FindElements()部分周围使用try-catch块,如果它引发异常,元素不存在,您可以返回是的,我在try-catch块中添加了这些语句,但是对于方法1,下一个findelemens