Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查c#Selenium驱动程序中是否存在元素_C#_Selenium - Fatal编程技术网

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

如何检查c#Selenium驱动程序中是否存在元素,c#,selenium,C#,Selenium,所以我使用Firefox selenium webdriers制作了这个c#winform 基本上,我需要它来检查一个元素是否存在,以及它是否没有点击另一个元素。如果有一段视频,在观看后,它会变成W_查看 这是我到目前为止得到的 driver.FindElement(By.XPath("//div[@class='video']/a")).Click(); else { driver.FindElement(By.XPath("//div[@class='W_VIEWED']

所以我使用Firefox selenium webdriers制作了这个c#winform

基本上,我需要它来检查一个元素是否存在,以及它是否没有点击另一个元素。如果有一段视频,在观看后,它会变成W_查看

这是我到目前为止得到的

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
若找不到元素就会抛出异常,所以您需要正确处理它

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

    private bool IsElementPresent(By by)
    {
        try
        {
            driver.FindElement(by);
            return true;
        }
        catch (NoSuchElementException)
        {
            return false;
        }
    }
            if (IsElementPresent(By.Id("element name")))
            {
                //do if exists
            }
            else
            {
                //do if does not exists
            }
调用函数

    private bool IsElementPresent(By by)
    {
        try
        {
            driver.FindElement(by);
            return true;
        }
        catch (NoSuchElementException)
        {
            return false;
        }
    }
            if (IsElementPresent(By.Id("element name")))
            {
                //do if exists
            }
            else
            {
                //do if does not exists
            }

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

List<IWebElement> elementList = new List<IWebElement>();
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();
}
List elementList=new List();
elementList.AddRange(driver.FindElements(By.XPath(//input[@att='something']);
如果(elementList.Count>0)
{
//如果计数大于0,则元素存在。
元素列表[0]。单击();
}

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

driver.PageSource.Contains("UniqueID");
它检查页面以查看ID或其他唯一文本是否存在。这几乎是瞬间发生的,而使用Try/Catch语句需要约20秒。FindElements也需要很长时间才能运行。

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

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上制作了一些扩展函数,用于检查是否存在标记或类。请原谅代码块开头和结尾的格式不一致。所以该杂志的编辑不合作;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("</" + tagName + ">") || 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");
}}
公共静态类扩展方法{
公共静态bool ContainsTag(此IWebElement元素,字符串标记名)
{
字符串elementText=element.GetAttribute(“innerHTML”);
返回CheckStringForTag(elementText,标记名);
}
公共静态bool包含类(此IWebElement元素,字符串类名称)
{
字符串elementText=element.GetAttribute(“innerHTML”);
返回CheckStringForClass(elementText,className);
}
公共静态bool ContainsTag(此IWebDriver驱动程序,字符串标记名)
{
返回CheckStringForTag(driver.PageSource,标记名);
}
公共静态bool ContainsClass(此IWebDriver驱动程序,字符串类名称)
{
返回CheckStringForClass(driver.PageSource,className);
}
私有静态布尔CheckStringForTag(字符串文本,字符串标记名)
{
如果(!string.IsNullOrWhiteSpace(text))
{

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

           checksomeelement:
        List<IWebElement> elementList = new List<IWebElement>();
        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;
        }
checksomeelement:
List elementList=新列表();
elementList.AddRange(driver.FindElements(By.XPath(“//div[@class='video']/a”);
如果(elementList.Count>0)
{
元素列表[0]。单击();
}
其他的
{
系统线程线程睡眠(2000);
转到checksomeelement;
}

此方法允许您等待元素存在。这在有条件创建元素的前端SPA框架(如VueJS)中尤其重要。您可以根据应用程序的性能调整重试次数。在任何情况下,它都将等待您的
元素查找等待时间*元素查找等待重试次数
米利斯这就解决了我们遇到的问题

protected Func<IWebElement> GetLazyElement(By by, int retryCount=0)
        {
            if (retryCount >= ELEMENT_FIND_WAIT_RETRY_COUNT)
            {
                throw new Exception("Wait timeout for element to show up" + by.ToString());
            }
            return new Func<IWebElement>(() => {
                try
                {
                    Debug.WriteLine("Finding element " + by.ToString());
                    var element = _webDriver.FindElement(by);

                    return element;
                }
                catch (Exception)
                {
                    Debug.WriteLine($"Failed to find element: {by} (Waiting {ELEMENT_FIND_WAIT_TIME}ms)");
                    Thread.Sleep(ELEMENT_FIND_WAIT_TIME);
                    var lazyFunc = GetLazyElement(by, retryCount++);
                    return lazyFunc();

                }

            });
}
protectedfunc GetLazyElement(By,int-retryCount=0)
{
如果(retryCount>=元素\u查找\u等待\u重试\u计数)
{
抛出新异常(“等待元素显示超时”+by.ToString());
}
返回新函数(()=>{
尝试
{
Debug.WriteLine(“Finding element”+by.ToString());
var元素=_webDriver.FindElement(by);
返回元素;
}
捕获(例外)
{
WriteLine($“未能找到元素:{by}(Waiting{element\u find\u WAIT\u TIME}ms)”;
睡眠(元素查找等待时间);
var lazyFunc=GetLazyElement(by,retryCount++);
返回lazyFunc();
}
});
}

如果您正在使用
隐式等待
并希望在不等待的情况下通过使用
FindElement
查看元素是否存在,请尝试以下代码:

    ElementExists(By.Id(id));

    static public bool ElementExists(By method)
    {
        var oldTime = _driver.Manage().Timeouts().ImplicitWait;
        _driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(1);
        try
        {
            bool isElementDisplayed = _driver.FindElement(method).Displayed;
            _driver.Manage().Timeouts().ImplicitWait = oldTime;
            return true;
        }
        catch
        {
            _driver.Manage().Timeouts().ImplicitWait = oldTime;
            return false;
        }
    }

如何检查另一个是否不存在?因此我必须输入if(isElementDisplayed==true)@Programersz是的。但请检查我添加的函数,findelement会引发异常。不要逐字逐句,您应该能够根据您的代码结构更改代码。我不是在创建新的
驱动程序,我只是在程序的其他部分使用它。再次编写
IWebDriver
没有意义。@Programersz你有鳕鱼吗